agent-device
OfficialThe agent-device server enables AI agents to automate real mobile, TV, and desktop apps through inspection, interaction, evidence capture, and workflow replay across iOS, Android, macOS, tvOS, and Linux platforms.
Device & App Management
List devices (
devices), boot devices (boot), list/install/reinstall apps (apps,install,reinstall,install-from-source), open apps/deep links/URLs (open), close apps or sessions (close), manage sessions (session), and check foreground app state (appstate).
UI Inspection
Capture accessibility snapshots (
snapshot), diff snapshots (diff), find elements by text/label/role/id (find), get element text/attributes (get), and assert UI state (is).
UI Interaction
Tap/click (
click,press), long press (longpress), fill text fields (fill), type into focused fields (type), focus inputs (focus), scroll (scroll), swipe (swipe), run structured gestures like pan/fling/pinch/rotate (gesture), navigate back (back), go home (home), open app switcher (app-switcher), rotate orientation (rotate), handle alerts (alert), manage keyboard (keyboard), read/write clipboard (clipboard), wait for conditions (wait), change OS settings/permissions (settings), push notifications (push), and trigger app-defined events (trigger-app-event).
Evidence & Diagnostics
Capture screenshots (
screenshot), record video (record), collect logs (logs), monitor network traffic (network), gather performance metrics (perf), and start/stop traces (trace).
Workflow Automation
Replay recorded
.adscripts (replay), run multiple scripts with retry and JUnit reporting (test), and batch multiple commands in a single request (batch).
React Native / Metro
Prepare Metro runtime, reload React Native apps (
metro), and dismiss React Native overlays (react-native).
Supports native, Expo, Flutter, and React Native apps on simulators, emulators, and physical devices.
Automates Android emulators and devices, enabling app opening, UI accessibility tree inspection, element interaction (fill, tap), and evidence collection (screenshots, videos, logs, CPU/memory/perf).
Enables testing of Expo apps on iOS and Android, including opening Expo Go or dev clients, UI snapshotting, element interaction, and gathering evidence such as screenshots, videos, logs, and performance traces.
Automates iOS simulators and devices, enabling app opening, UI accessibility tree inspection, element interaction, and evidence collection (screenshots, videos, logs, network, performance).
Automates Linux desktop applications, enabling UI inspection via accessibility snapshots, element interaction, and evidence collection (screenshots, logs, performance).
Automates macOS desktop applications, enabling UI inspection via accessibility snapshots, element interaction, and evidence collection (screenshots, logs, performance).
agent-device
Mobile app automation and verification for AI coding agents. Give coding agents a live app feedback loop through a CLI, built-in MCP server, or typed Node.js API.
Let your coding agent verify its changes in the running app. agent-device lets agents inspect, control, debug, and verify apps on iOS, Android, and HarmonyOS (simulators, emulators, and physical devices), plus tvOS, Android TV, Amazon Vega OS TV (Vega Virtual Device), web, macOS, and Linux. Agents read token-efficient accessibility snapshots instead of reasoning over screenshots alone, act through refs and selectors, and save evidence for review. It also coordinates device access across parallel agent worktrees and connects to remote device clouds.
Works with Claude Code, Codex, Cursor, Windsurf, Cline, Goose, and any agent that can run a CLI or connect over MCP, or as the runtime under agents you build with the AI SDK or Eve. Developers at Expensify, Shopify, and others use it to verify their apps.
Quick start
Install the CLI and check setup. It requires Node.js 22.12 or newer; web automation requires Node.js 24 or newer. See Installation for target requirements.
npm install -g agent-device@latest
agent-device doctor
agent-device help workflowRun doctor yourself before handing the CLI to an agent; help workflow links to the guides for debugging, replay, and profiling, and the installed help always matches the installed version.
Drive an app from the CLI
Add a contact in the built-in iOS Contacts app:
# Start a session.
agent-device open Contacts --platform ios
# Inspect the screen. The example below shows the output; refs vary.
agent-device snapshot -i
# @e2 [button] "Add"
# Use the ref and wait for the UI to settle.
agent-device press @e2 --settle
# The diff includes:
# + @e7 [text-field] "First name"
agent-device fill @e7 "Ada" --settle
# The next diff shows changed values and current refs:
# - @e7 [text-field] "First name"
# + @e14 [text-field] "Ada"
# = @e15 [text-field] "Last name"
# Capture evidence and close the session.
agent-device screenshot ./contact-form.png
agent-device closeRefs are only valid from the latest output: after a --settle command, use the refs in its diff, and take a new snapshot only if the diff omits what you need. Snapshots come from the app's accessibility tree, so clear labels, roles, and test IDs make agent runs more reliable; use screenshots and video as evidence or when accessibility data is poor.

Add MCP tools to your agent
agent-device mcp starts the official stdio MCP server, exposing the installed commands as structured tools over the same execution path as the CLI:
{
"mcpServers": {
"agent-device": {
"command": "agent-device",
"args": ["mcp"]
}
}
}See AI Agent Setup for per-client setup and when to prefer plain CLI over MCP.
Script it from Node.js
createAgentDeviceClient() gives Node.js code typed access to the same commands, as model tools in your own agent or from orchestration code:
import { createAgentDeviceClient } from 'agent-device';
const client = createAgentDeviceClient({ session: 'qa-run' });
try {
await client.apps.open({ app: 'com.apple.Preferences', platform: 'ios' });
const snapshot = await client.capture.snapshot({ interactiveOnly: true });
const button = snapshot.nodes.find((node) => node.role === 'button');
if (button) await client.interactions.press({ ref: button.ref });
} finally {
await client.sessions.close();
}See the Node.js API, the runnable examples, and the AI SDK and Eve integration guides.
Related MCP server: Taproom
What agents can do
Inspect app state through accessibility snapshots, refs, selectors, and React Native component trees.
Act on visible UI by tapping or pressing elements, filling fields, scrolling, making gestures, waiting, asserting state, and handling alerts.
Diagnose failures with screenshots, video, logs, traces, network data, performance samples, crash details, and React profiles.
Repeat workflows by saving working steps as
.adscripts for local use or CI. Export strict Maestro YAML when needed.
See Commands for the commands and evidence each target supports.
What to ask your agent
With the CLI installed, prompts like these work end to end:
"Implement the onboarding screen, run it on the iOS simulator and Android emulator, and attach screenshots."
"Reproduce this crash and capture the logs that lead up to it."
"Check whether this change causes unnecessary React Native re-renders."
"Explore the checkout flow once, save it as a replay script, and run it in CI."
"Verify this pull request on a physical device and attach reviewable evidence."
Next steps
AI Agent Setup: skills, project rules, and per-client setup for Cursor, Codex, Claude Code, Windsurf, and others.
Quick Start: a guided run on the bundled Expo test app with screenshots, replay, and performance data.
Replay & E2E and Debugging & Profiling: repeatable tests and bug hunting.
Where to run agent-device
The same session and evidence model works at every step: the agent explores the app, captures evidence, saves a replay, runs it in CI, and moves onto remote devices.
Path | Best for | Start with |
Local | Trying commands and debugging apps on simulators, emulators, physical devices, macOS, and Linux. | Follow the Quick Start. |
CI/CD | Automated pull request and merge validation with replay scripts and captured artifacts. | Try the EAS workflow template. |
Cloud / remote | Linux runners, managed devices, and remote jobs. | Set up a remote proxy, connect a device cloud (BrowserStack, AWS Device Farm, Limrun), or contact Callstack for team QA. |
How it works
agent-device keeps device state in sessions. It uses a local accessibility bridge for iOS Simulator snapshots and XCTest for iOS interactions, physical iOS, and tvOS; ADB and the snapshot helper on Android; HDC and ArkUI uitest on HarmonyOS; Vega CLI/VDA on the Vega Virtual Device; a local helper on macOS; and AT-SPI on Linux.
Support depth varies by target. Newer backends such as HarmonyOS and Vega OS cover a subset of commands; run agent-device capabilities --platform <platform> to see what a target supports.
Sessions are scoped to the caller's git worktree, and host-local device claims stop parallel agents from taking over each other's simulators and emulators. Inspect ownership without a daemon via agent-device device status, and settle provably dead owners with agent-device device release --stale. The same commands drive hosted devices on BrowserStack, AWS Device Farm, and Limrun.
agent-device uses the inspect-act-verify process from Vercel's agent-browser for mobile, TV, and desktop apps. Basic --platform web support runs agent-browser in the same session and replay system.
FAQ
What is agent-device?
agent-device is a command-line tool and MCP server that lets AI coding agents inspect, control, and verify mobile apps and save evidence for review. It supports iOS, Android, HarmonyOS, TV, web, macOS, and Linux.
Is there an MCP server for mobile app automation?
Yes. agent-device mcp starts the official stdio MCP server. The Quick start above has the client config, and AI Agent Setup covers per-client details.
Does it work with React Native, Expo, Flutter, and native apps?
Yes. agent-device supports native iOS and Android apps, plus React Native, Expo, and Flutter apps on supported targets. The commands and evidence vary by target.
How is it different from mobile MCP servers?
The MCP server is one entry point to the same runtime used by the CLI and typed Node.js API. Sessions, device ownership, selectors, evidence, replay, CI workflows, and cloud routing stay consistent across all three.
Can I build my own agent or QA product on agent-device?
Yes. The typed Node.js client is a public surface over that same runtime, so an agent you build inherits everything above. Start from the Node.js API, AI SDK, or Eve guides.
How is it different from Appium, Detox, or Maestro?
With agent-device, an agent reads app state and chooses each command at run time. Teams use Appium, Detox, and Maestro to write and maintain test suites. agent-device can complement them by saving its runs as .ad scripts or exporting them as strict Maestro YAML.
Can agent-device run in CI?
Yes. Record a run as an .ad script, replay it in CI, and keep the screenshots and logs as artifacts; the EAS workflow template is a working example.
Articles and videos
Articles
Videos
Who uses agent-device?
Teams and developers at Callstack, JPMorgan Chase, Expensify, Shopify, Kindred, Total Wine & More, LegendList, HerLyfe, App & Flow, and others use agent-device.
Documentation
Contributing
See CONTRIBUTING.md.
Made at Callstack
agent-device is open source under the MIT license. Visit agent-device.dev or contact Callstack.
Available Tools
57 toolsalertA
Inspect, wait for, accept, or dismiss a platform alert. Use get before acting when the alert content matters; accept and dismiss change the active alert state. Each iOS XCTest execution activates once, then only observes. Inspect again after an unconfirmed action; never assume a timeout means nothing happened. Times out after 90s.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | No | Apple device or simulator UDID; the selector that pins one device when several share a name. | |
| debug | No | Enable debug diagnostics. | |
| runId | No | Lease run identifier. | |
| action | No | ||
| device | No | Device name selector (a UDID belongs in udid, a serial in serial). | |
| serial | No | Android, HarmonyOS, or Vega VVD serial selector. | |
| target | No | Alias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element. | |
| tenant | No | Remote tenant identifier. | |
| leaseId | No | Existing lease identifier. | |
| session | No | Agent-device session name. | |
| noRecord | No | Do not record this action. | |
| platform | No | Platform selector used to resolve a device. | |
| timeoutMs | No | ||
| includeCost | No | Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged. | |
| deviceTarget | No | Device target form. Maps to the CLI --target flag. | |
| responseLevel | No | Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged. | |
| mcpOutputFormat | No | MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately. | |
| androidDeviceAllowlist | No | Android serial allowlist used for device resolution. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It discloses that each iOS XCTest execution 'activates once, then only observes,' that the tool 'Times out after 90s,' and that accept/dismiss change state. This is valuable behavioral context beyond what the schema conveys. It does not describe the return format or error behavior, but the core behavioral traits are transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences with no redundancy. It front-loads the core purpose, then provides usage guidance, and finally behavioral caveats. Every sentence adds value, and the structure is compact and well-ordered.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 18 parameters and no output schema, the description covers the essential behavioral aspects: action selection, state changes, timeout behavior, and the execution model. It lacks information about the response format, but given the schema's high coverage and the tool's specific scope, this is a minor gap. It is sufficiently complete for an agent to call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 89%, so the schema already documents most parameters. The description adds no parameter-specific details beyond the action semantics ('Use get before acting...'), but the schema's enum for action already explains the possible values. Since the schema covers the parameters well, a baseline score of 3 is appropriate; the description does not need to compensate for low coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's core function: 'Inspect, wait for, accept, or dismiss a platform alert.' It names the resource (platform alert) and the specific verbs (get, wait, accept, dismiss), making its purpose unambiguous. It distinguishes itself from generic sibling tools like 'get' or 'wait' by being alert-specific, and the action enum is explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage guidance: 'Use get before acting when the alert content matters; accept and dismiss change the active alert state.' It also warns about the timeout behavior and advises to 'Inspect again after an unconfirmed action.' This gives clear when-to-use directives for each action and cautions against misinterpretation of timeouts, which is exactly the kind of guidance needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
appsA
List the apps installed on the selected device. Include system or OEM apps only when they are needed as automation targets. Times out after 90s.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | No | Apple device or simulator UDID; the selector that pins one device when several share a name. | |
| debug | No | Enable debug diagnostics. | |
| runId | No | Lease run identifier. | |
| device | No | Device name selector (a UDID belongs in udid, a serial in serial). | |
| serial | No | Android, HarmonyOS, or Vega VVD serial selector. | |
| target | No | Alias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element. | |
| tenant | No | Remote tenant identifier. | |
| leaseId | No | Existing lease identifier. | |
| session | No | Agent-device session name. | |
| platform | No | Platform selector used to resolve a device. | |
| appsFilter | No | Restrict the listing to user-installed apps, or include system and OEM apps. | |
| includeCost | No | Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged. | |
| deviceTarget | No | Device target form. Maps to the CLI --target flag. | |
| responseLevel | No | Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged. | |
| mcpOutputFormat | No | MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately. | |
| androidDeviceAllowlist | No | Android serial allowlist used for device resolution. |
Output Schema
| Name | Required | Description |
|---|---|---|
| apps | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral burden; it does disclose a 90s timeout, which is useful operational context. However, it does not state side effects, default filtering behavior, or failure modes beyond the timeout, and the system/OEM sentence reads more like policy than behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the action, then a scoping rule and timeout. There is no filler; every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema and 100% parameter coverage, the description does not need to explain return values or selector semantics. It includes the non-obvious operational constraint (90s timeout) and the policy on system/OEM apps, which is sufficient for a low-complexity listing tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents all 16 parameters; the description does not need to repeat parameter details. It adds only the system/OEM condition, which overlaps with the appsFilter parameter rather than extending its meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'List the apps installed on the selected device.' This clearly distinguishes the tool from siblings like install, appstate, and snapshot. The system/OEM qualification adds scope without obscuring the core purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a conditional usage hint—include system/OEM apps only when they are needed as automation targets—but does not name alternative tools or state when not to use this one. The guidance is implied rather than explicit, so an agent must infer that apps is for enumeration before automation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
appstateB
Show foreground app/activity Times out after 90s.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | No | Apple device or simulator UDID; the selector that pins one device when several share a name. | |
| debug | No | Enable debug diagnostics. | |
| runId | No | Lease run identifier. | |
| device | No | Device name selector (a UDID belongs in udid, a serial in serial). | |
| serial | No | Android, HarmonyOS, or Vega VVD serial selector. | |
| target | No | Alias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element. | |
| tenant | No | Remote tenant identifier. | |
| leaseId | No | Existing lease identifier. | |
| session | No | Agent-device session name. | |
| platform | No | Platform selector used to resolve a device. | |
| includeCost | No | Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged. | |
| deviceTarget | No | Device target form. Maps to the CLI --target flag. | |
| responseLevel | No | Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged. | |
| mcpOutputFormat | No | MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately. | |
| androidDeviceAllowlist | No | Android serial allowlist used for device resolution. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses one valuable behavioral trait: 'Times out after 90s.' However, with no annotations provided, it does not explicitly confirm that the command is read-only/side-effect-free, nor does it explain what happens on timeout or when no foreground app/activity exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
At only seven words, there is no filler and the purpose is front-loaded. The awkward lack of punctuation between 'app/activity' and 'Times out' makes the sentence slightly harder to parse, but overall it is efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple query command with an output schema, this is minimally sufficient, but it does not explain when to use it, how the 90s timeout affects expected results, or which selectors/leases are needed in practice. Given 15 parameters and no annotations, a bit more operational context would be valuable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already documents all 15 parameters, and the description does not need to compensate much. The description adds no parameter-specific meaning, such as which device selector to prefer or how target/platform relate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific read action and resource: 'Show foreground app/activity.' This is clear and reasonably distinct from broader siblings like apps or snapshot, but it never names or contrasts a sibling, so differentiation is left to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance about when to use appstate instead of apps, app-switcher, snapshot, or other read commands, and no exclusions or alternatives are mentioned. The verb 'Show' implies a query, but the description leaves the selection context entirely implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
app-switcherA
Open the device app switcher to inspect or change foreground apps. This changes the visible system UI and may move focus away from the current app. Times out after 90s.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | No | Apple device or simulator UDID; the selector that pins one device when several share a name. | |
| debug | No | Enable debug diagnostics. | |
| runId | No | Lease run identifier. | |
| device | No | Device name selector (a UDID belongs in udid, a serial in serial). | |
| serial | No | Android, HarmonyOS, or Vega VVD serial selector. | |
| target | No | Alias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element. | |
| tenant | No | Remote tenant identifier. | |
| leaseId | No | Existing lease identifier. | |
| session | No | Agent-device session name. | |
| noRecord | No | Do not record this action. | |
| platform | No | Platform selector used to resolve a device. | |
| includeCost | No | Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged. | |
| deviceTarget | No | Device target form. Maps to the CLI --target flag. | |
| responseLevel | No | Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged. | |
| mcpOutputFormat | No | MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately. | |
| androidDeviceAllowlist | No | Android serial allowlist used for device resolution. |
Output Schema
| Name | Required | Description |
|---|---|---|
| action | Yes | |
| message | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the disclosure burden. It honestly warns that the tool 'changes the visible system UI,' 'may move focus away from the current app,' and 'times out after 90s.' These are the key behavioral side effects an agent should know before invoking the tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: purpose first, then the key side effect, then the timeout. Every sentence provides necessary information and there is no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value details are not needed in the description. The description gives the essential behavioral context: it changes system UI, may move focus, and times out. It is sufficient for a safe call, though it could also have pointed to sibling alternatives.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description coverage is 100%, so all 16 parameters are already documented in the input schema. The description adds no parameter-level detail, and the baseline of 3 is appropriate because the schema does the semantic heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the action and resource: 'Open the device app switcher.' It also states the purpose ('inspect or change foreground apps'), which makes the tool's intent understandable. It does not explicitly distinguish itself from sibling tools like apps, open, or focus, so it misses top marks.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The intended use is implied by 'to inspect or change foreground apps,' but there is no explicit guidance about when to use this tool versus siblings such as focus, open, or apps. An agent must infer the appropriate context rather than being told directly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
artifactsB
List daemon or cloud provider artifacts for an active or completed session. Times out after 90s.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | No | Apple device or simulator UDID; the selector that pins one device when several share a name. | |
| debug | No | Enable debug diagnostics. | |
| runId | No | Lease run identifier. | |
| device | No | Device name selector (a UDID belongs in udid, a serial in serial). | |
| serial | No | Android, HarmonyOS, or Vega VVD serial selector. | |
| target | No | Alias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element. | |
| tenant | No | Remote tenant identifier. | |
| leaseId | No | Existing lease identifier. | |
| session | No | Agent-device session name. | |
| platform | No | Platform selector used to resolve a device. | |
| provider | No | Cloud provider name, for example browserstack or aws-device-farm. | |
| includeCost | No | Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged. | |
| deviceTarget | No | Device target form. Maps to the CLI --target flag. | |
| responseLevel | No | Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged. | |
| mcpOutputFormat | No | MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately. | |
| providerSessionId | No | Cloud provider session id or ARN. | |
| androidDeviceAllowlist | No | Android serial allowlist used for device resolution. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full behavioral burden. It discloses a 90-second timeout, which is useful, and the verb 'List' implies a read-only operation. However, it does not mention pagination, response format, or whether structuredContent is included by default. Given the minimal disclosure, this is adequate but not thorough.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very short—two sentences—and front-loads the purpose. The timeout note is a useful extra detail. There is no wasted wording. While it is terse, it is efficient and not padded, so it earns a high score for conciseness, though it sacrifices completeness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 17 parameters, no output schema, and no annotations, the description is incomplete. It does not explain what the returned artifacts look like, whether they are structured or textual, or how the many parameters interrelate. The agent must rely entirely on the schema, and the description fails to provide the higher-level context needed to confidently invoke the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds no parameter-specific information beyond the schema, and with 17 parameters it does not attempt to summarize or prioritize them. The schema's detailed descriptions carry the weight, so the description neither helps nor hurts here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb ('List') and resource ('daemon or cloud provider artifacts') and scopes it to 'an active or completed session.' This distinguishes it from most siblings, though it doesn't explicitly name an alternative. It is more specific than a tautology and gives the agent a concrete idea of what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for sessions, but provides no guidance on when to choose this over sibling tools or when not to use it. There are no exclusions or alternative tool references. The 'active or completed session' context offers a mild cue, but it falls short of explicit direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
audioA
Measure browser or host-rendered simulator/emulator audio as compact dBFS buckets. Start a probe before requesting its status or stopping it. Times out after 90s.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | No | Apple device or simulator UDID; the selector that pins one device when several share a name. | |
| debug | No | Enable debug diagnostics. | |
| runId | No | Lease run identifier. | |
| action | No | ||
| device | No | Device name selector (a UDID belongs in udid, a serial in serial). | |
| serial | No | Android, HarmonyOS, or Vega VVD serial selector. | |
| target | No | Alias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element. | |
| tenant | No | Remote tenant identifier. | |
| leaseId | No | Existing lease identifier. | |
| session | No | Agent-device session name. | |
| bucketMs | No | Audio level bucket size in milliseconds. | |
| platform | No | Platform selector used to resolve a device. | |
| durationMs | No | Probe duration in milliseconds. | |
| includeCost | No | Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged. | |
| probeAction | No | ||
| deviceTarget | No | Device target form. Maps to the CLI --target flag. | |
| responseLevel | No | Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged. | |
| mcpOutputFormat | No | MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately. | |
| androidDeviceAllowlist | No | Android serial allowlist used for device resolution. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral disclosure burden. It discloses three important behaviors: the stateful probe lifecycle, the need to start before status/stop, and the 90-second timeout. This is meaningful operational context beyond what the schema alone provides.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no fluff. The primary purpose is front-loaded, and the lifecycle constraint and timeout are stated concisely. Every sentence adds useful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the core operation and lifecycle, but the tool has 19 parameters, no required parameters, no output schema, and no explanation of how durationMs and bucketMs interact. Common selectors are documented in the schema, but an agent still lacks clear guidance on the minimal invocation or expected structured response.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is high at 89%, so the baseline is 3. The description adds value beyond the schema by explaining that 'start', 'status', and 'stop' correspond to probe lifecycle phases, and by framing outputs as 'dBFS buckets,' which gives meaning to bucketMs and durationMs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Measure browser or host-rendered simulator/emulator audio as compact dBFS buckets.' This clearly defines what the tool does and the output format, making it distinguishable from sibling tools like record or logs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit lifecycle guidance: 'Start a probe before requesting its status or stopping it.' This tells the agent the correct order of operations. It does not mention alternative tools or when not to use audio, but the core usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
backA
Navigate back in the app or through system navigation. Use in-app for the app navigation stack and system when the platform back behavior is required. Times out after 90s; a caller-supplied budget extends it.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | ||
| udid | No | Apple device or simulator UDID; the selector that pins one device when several share a name. | |
| debug | No | Enable debug diagnostics. | |
| runId | No | Lease run identifier. | |
| device | No | Device name selector (a UDID belongs in udid, a serial in serial). | |
| serial | No | Android, HarmonyOS, or Vega VVD serial selector. | |
| settle | No | After the action, wait for the UI to go quiet and return the settled diff vs the pre-action tree in the same response. Best-effort; never fails the action. | |
| target | No | Alias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element. | |
| tenant | No | Remote tenant identifier. | |
| leaseId | No | Existing lease identifier. | |
| session | No | Agent-device session name. | |
| noRecord | No | Do not record this action. | |
| platform | No | Platform selector used to resolve a device. | |
| timeoutMs | No | Settle: wait deadline in milliseconds (default 10000). | |
| includeCost | No | Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged. | |
| deviceTarget | No | Device target form. Maps to the CLI --target flag. | |
| responseLevel | No | Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged. | |
| settleQuietMs | No | Settle: quiet window in milliseconds (default 500). | |
| mcpOutputFormat | No | MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately. | |
| androidDeviceAllowlist | No | Android serial allowlist used for device resolution. |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | Yes | |
| action | Yes | |
| settle | No | |
| message | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral disclosure burden. It does disclose a 90-second timeout and that a caller-supplied budget can extend it, which is useful operational context. However, it doesn't mention potential side effects such as system back exiting the app, or any state-changing consequences beyond the obvious navigation action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences carry purpose, mode guidance, and timeout behavior with no filler. The first sentence front-loads the core operation, the second gives selection rules and a timeout caveat. Nothing extra is included.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the 20-parameter schema, high schema coverage, and a provided output schema, the description is reasonably complete: purpose, mode usage, and timeout are covered. The main gap is the lack of any note about default mode behavior or the system back potentially leaving the app, but the schema and output schema fill most of the remaining context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already describes nearly all 20 parameters (95% coverage), so the baseline is 3. The description goes beyond the schema by clarifying the meaning of the 'mode' enum: 'in-app' means the app navigation stack and 'system' means platform back behavior. This adds genuine semantic value for the most important parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Navigate back' and distinguishes the two modes: in-app navigation stack and system/platform back behavior. This is more specific than the tool name alone and separates it from sibling tools like home/click. It doesn't reach a 5 because 'navigate back' is close to a restatement of the name, but the mode distinction adds real meaning.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use each mode: 'Use in-app for the app navigation stack and system when the platform back behavior is required.' This gives clear context for mode selection. It doesn't name alternative sibling tools, but no other sibling directly provides back behavior, so the guidance is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
batchB
Execute multiple commands in one daemon request. Times out after 90s.
| Name | Required | Description | Default |
|---|---|---|---|
| out | No | Optional output path for command artifacts. | |
| udid | No | Apple device or simulator UDID; the selector that pins one device when several share a name. | |
| debug | No | Enable debug diagnostics. | |
| runId | No | Lease run identifier. | |
| steps | Yes | Structured batch steps. Each step uses a command name and the same input object as that command tool. | |
| device | No | Device name selector (a UDID belongs in udid, a serial in serial). | |
| serial | No | Android, HarmonyOS, or Vega VVD serial selector. | |
| target | No | Alias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element. | |
| tenant | No | Remote tenant identifier. | |
| leaseId | No | Existing lease identifier. | |
| onError | No | Batch failure policy. | |
| session | No | Agent-device session name. | |
| maxSteps | No | Maximum number of steps accepted for this batch. | |
| platform | No | Platform selector used to resolve a device. | |
| includeCost | No | Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged. | |
| deviceTarget | No | Device target form. Maps to the CLI --target flag. | |
| responseLevel | No | Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged. | |
| mcpOutputFormat | No | MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately. | |
| androidDeviceAllowlist | No | Android serial allowlist used for device resolution. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It does add one useful behavioral fact, the 90-second timeout, but says nothing about failure handling, partial execution, response shape, side effects, or how nested commands behave. For a complex execution tool this is a significant transparency gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is one efficiently worded sentence with no redundant content. It front-loads the core purpose and appends a critical operational constraint, the timeout. It is appropriately compact, though arguably too terse given the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This tool has 19 parameters, no annotations, and no output schema, yet the description only covers purpose and timeout. It does not describe return behavior, error semantics, or how batch execution relates to the individual command schemas referenced in the steps parameter. An agent would need to infer too much to invoke this tool confidently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 19 parameters in detail. The description adds no parameter-level meaning beyond 'multiple commands,' which maps to the required 'steps' parameter. Baseline 3 is appropriate since the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb and resource: 'Execute multiple commands in one daemon request.' This distinguishes it from the many single-command sibling tools by emphasizing batch execution. It could more explicitly connect to the sibling command set, but the core purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'multiple commands in one daemon request' implies the tool is for batching several commands, but there is no explicit guidance on when to prefer it over individual sibling tools, nor any exclusions or conditions. Usage context is only implied rather than directly stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bootA
Boot or prepare the selected device or simulator so later commands can target it. The device is chosen through the device-selection inputs, not by naming it here. Times out after 90s.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | No | Apple device or simulator UDID; the selector that pins one device when several share a name. | |
| debug | No | Enable debug diagnostics. | |
| runId | No | Lease run identifier. | |
| device | No | Device name selector (a UDID belongs in udid, a serial in serial). | |
| serial | No | Android, HarmonyOS, or Vega VVD serial selector. | |
| target | No | Alias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element. | |
| tenant | No | Remote tenant identifier. | |
| leaseId | No | Existing lease identifier. | |
| session | No | Agent-device session name. | |
| headless | No | Boot without showing simulator UI when supported. | |
| platform | No | Platform selector used to resolve a device. | |
| includeCost | No | Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged. | |
| deviceTarget | No | Device target form. Maps to the CLI --target flag. | |
| responseLevel | No | Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged. | |
| mcpOutputFormat | No | MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately. | |
| androidDeviceAllowlist | No | Android serial allowlist used for device resolution. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Stable device id. |
| kind | Yes | |
| booted | Yes | |
| device | Yes | Human-readable device name. |
| target | Yes | |
| platform | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the behavioral transparency burden. It usefully discloses a 90-second timeout and the selection mechanism. It does not describe side effects, idempotency, whether boot waits for readiness, or failure behavior beyond timing, so it provides only partial behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three terse sentences front-load the core action, then clarify device selection and add the timeout. Every sentence contributes operational information, no repetition of schema content, and no irrelevant details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With all 16 parameters described in the schema and an output schema available, the description correctly avoids restating parameter details. It supplies the missing context: device resolution approach, follow-up readiness, and 90-second timeout. Minor gaps remain around whether boot is asynchronous and how an already-booted device is handled, but the definition is adequate for selecting and invoking the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents all 16 parameters, so the baseline is 3. The description adds value by clarifying that no device name is passed directly and that the target is resolved via the device-selection inputs. This helps an agent understand how to populate selector parameters correctly rather than looking for a 'name' field.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear action ('Boot or prepare') with a specific resource ('selected device or simulator') and the intended outcome ('so later commands can target it'). This distinguishes it from device-management siblings like shutdown or devices by focusing on bringing the device into a usable state.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly implies when to use it: before later commands that target the device. It also advises that the device is chosen through device-selection inputs, not by naming it directly. However, it does not explicitly state when not to use it or mention sibling alternatives such as shutdown or open.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
capabilitiesA
List the commands supported by the selected device or active session. Use device-selection inputs when checking support before a session is open. Times out after 90s.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | No | Apple device or simulator UDID; the selector that pins one device when several share a name. | |
| debug | No | Enable debug diagnostics. | |
| runId | No | Lease run identifier. | |
| device | No | Device name selector (a UDID belongs in udid, a serial in serial). | |
| serial | No | Android, HarmonyOS, or Vega VVD serial selector. | |
| target | No | Alias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element. | |
| tenant | No | Remote tenant identifier. | |
| leaseId | No | Existing lease identifier. | |
| session | No | Agent-device session name. | |
| platform | No | Platform selector used to resolve a device. | |
| includeCost | No | Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged. | |
| deviceTarget | No | Device target form. Maps to the CLI --target flag. | |
| responseLevel | No | Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged. | |
| mcpOutputFormat | No | MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately. | |
| androidDeviceAllowlist | No | Android serial allowlist used for device resolution. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden of behavioral disclosure. It usefully notes the 90s timeout and distinguishes device-based vs active-session operation, but it does not mention whether the command is read-only, has side effects, or what failure modes to expect.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences carry the core purpose, the key usage context, and a critical timeout warning. Every sentence earns its place and the most important information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's 15 optional parameters, no annotations, and no output schema, the description covers the central usage but leaves the agent to infer return shape and how multiple selectors like udid, session, leaseId, and runId interact. The 100% schema coverage compensates substantially, but some contextual gaps remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema covers all 15 parameters, so the baseline is 3. The description adds cross-parameter context by advising to use device-selection inputs before a session is open, which is not stated in the schema itself.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear action and resource: 'List the commands supported by the selected device or active session.' It communicates the tool's function specifically, though it does not explicitly distinguish it from the sibling 'help' tool or other listing-style commands.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives concrete context: 'Use device-selection inputs when checking support before a session is open.' This tells the agent which parameter family to use in a common scenario, but it does not mention exclusions or explicitly contrast with alternatives like 'help'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clickA
Activate a UI target by snapshot ref, selector, or coordinates. Prefer a ref or selector after a snapshot; use coordinates only when semantic targeting is unavailable. This can change app state; use settle or verify to confirm the result without a follow-up snapshot. Times out after 90s; a caller-supplied budget extends it.
| Name | Required | Description | Default |
|---|---|---|---|
| raw | No | Use raw snapshot data during selector resolution. | |
| udid | No | Apple device or simulator UDID; the selector that pins one device when several share a name. | |
| count | No | Number of press/click repetitions. | |
| debug | No | Enable debug diagnostics. | |
| depth | No | Snapshot traversal depth. | |
| runId | No | Lease run identifier. | |
| scope | No | Snapshot scope selector used before resolution. | |
| button | No | Pointer button for platforms that support mouse buttons. | |
| device | No | Device name selector (a UDID belongs in udid, a serial in serial). | |
| holdMs | No | Hold duration for each action. | |
| serial | No | Android, HarmonyOS, or Vega VVD serial selector. | |
| settle | No | After the action, wait for the UI to go quiet and return the settled diff vs the pre-action tree in the same response. Best-effort; never fails the action. | |
| target | Yes | UI target. This is separate from deviceTarget, which selects the device form. | |
| tenant | No | Remote tenant identifier. | |
| verify | No | Capture cheap post-action evidence (AX digest, node counts, changedFromBefore) instead of a follow-up snapshot. | |
| leaseId | No | Existing lease identifier. | |
| session | No | Agent-device session name. | |
| jitterPx | No | Randomization radius in pixels. | |
| noRecord | No | Do not record this action. | |
| platform | No | Platform selector used to resolve a device. | |
| doubleTap | No | Request a double-tap action. | |
| timeoutMs | No | Settle: wait deadline in milliseconds (default 10000). | |
| intervalMs | No | Delay between repeated press/click actions. | |
| includeCost | No | Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged. | |
| deviceTarget | No | Device target form. Maps to the CLI --target flag. | |
| responseLevel | No | Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged. | |
| settleQuietMs | No | Settle: quiet window in milliseconds (default 500). | |
| mcpOutputFormat | No | MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately. | |
| androidDeviceAllowlist | No | Android serial allowlist used for device resolution. |
Output Schema
| Name | Required | Description |
|---|---|---|
| x | No | Resolved interaction x coordinate when available. |
| y | No | Resolved interaction y coordinate when available. |
| ref | No | Snapshot ref without the @ prefix when the target was an @ref. |
| cost | No | |
| hint | No | |
| count | No | Number of press/click repetitions. |
| button | No | |
| holdMs | No | Hold duration for each action. |
| settle | No | |
| message | No | |
| warning | No | |
| evidence | No | |
| jitterPx | No | Randomization radius in pixels. |
| refLabel | No | |
| selector | No | Selector expression when the target was a selector. |
| doubleTap | No | Whether the command requested a double-tap action. |
| intervalMs | No | Delay between repeated press/click actions. |
| resolution | No | Pre-action disclosure of how the acting path resolved its target. Absent when resolutionDisclosure is inapplicable for the path. |
| targetKind | Yes | Resolved interaction target kind. |
| selectorChain | No | |
| referenceWidth | No | Reference frame width for visualizing the interaction point. |
| targetHittable | No | |
| referenceHeight | No | Reference frame height for visualizing the interaction point. |
| maestroFallbackReason | No | |
| maestroNonHittableCoordinateFallbackUsed | No | Whether the direct iOS Maestro coordinate fallback was actually used. |
| maestroNonHittableCoordinateFallbackAllowed | No | Whether the direct iOS Maestro coordinate fallback was allowed for this selector. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description bears the full behavioral burden. It explicitly discloses that the action can change app state and recommends settle or verify for confirmation, plus it states the 90-second timeout and budget extension behavior. This is meaningful behavioral context beyond what the schema alone reveals.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences front-load the core action and then add targeting preference, side-effect guidance, and timeout behavior. There is no filler or repetition of schema content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 29-parameter tool with no annotations, the description covers the essential call semantics: how to choose a target, the mutating nature of the action, and the recommended ways to verify results. The output schema and 100% schema coverage handle return-value and parameter details. It could explicitly name sibling alternatives like press or gesture, but that omission does not block correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds useful context around target-mode selection and settle/verify behavior, but it does not add much beyond the already-complete parameter descriptions. For a tool with 29 parameters, this is acceptable because the schema handles parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb, 'Activate', and a resource, 'UI target', with three explicit targeting modes: snapshot ref, selector, or coordinates. This clearly distinguishes click from sibling input tools like press, gesture, or swipe by describing its semantic targeting approach.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit guidance on when to use coordinates versus ref/selector: prefer ref or selector after a snapshot, and use coordinates only when semantic targeting is unavailable. It also advises using settle or verify to confirm state-changing results without a follow-up snapshot, which is clear and actionable context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clipboardA
Read the current device clipboard text, or replace its contents with the given text. Times out after 90s.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | ||
| udid | No | Apple device or simulator UDID; the selector that pins one device when several share a name. | |
| debug | No | Enable debug diagnostics. | |
| runId | No | Lease run identifier. | |
| action | Yes | ||
| device | No | Device name selector (a UDID belongs in udid, a serial in serial). | |
| serial | No | Android, HarmonyOS, or Vega VVD serial selector. | |
| target | No | Alias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element. | |
| tenant | No | Remote tenant identifier. | |
| leaseId | No | Existing lease identifier. | |
| session | No | Agent-device session name. | |
| noRecord | No | Do not record this action. | |
| platform | No | Platform selector used to resolve a device. | |
| includeCost | No | Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged. | |
| deviceTarget | No | Device target form. Maps to the CLI --target flag. | |
| responseLevel | No | Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged. | |
| mcpOutputFormat | No | MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately. | |
| androidDeviceAllowlist | No | Android serial allowlist used for device resolution. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden. It discloses the 90-second timeout, a useful behavioral detail. However, it does not mention side effects, error behavior, or whether the operation is synchronous, leaving some gaps for a simple tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with zero redundancy. The core purpose is front-loaded, and the timeout is the only extra detail, earning its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists and most parameters have descriptions, the description covers the essential function and timeout. It does not elaborate on device selection, but that is handled in parameter descriptions. Complete enough for an agent to call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 89%, so most parameters are described. The description adds meaning to the 'text' parameter (the replacement content) and the 'action' parameter (read vs write). Beyond that, it adds little, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool reads or writes device clipboard text, a specific verb-resource pair. No sibling tool overlaps with clipboard operations, so it is unambiguously distinct.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage: to read or replace clipboard content. No alternative clipboard tool exists among siblings, so exclusions are unnecessary. It provides clear context without explicit when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
closeA
Close the named app, or close the active session app when app is omitted. Use shutdown only when the selected simulator or emulator should also stop. Times out after 90s.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Optional app to close. | |
| udid | No | Apple device or simulator UDID; the selector that pins one device when several share a name. | |
| debug | No | Enable debug diagnostics. | |
| force | No | Overwrite an existing --save-script target instead of refusing (alias: --overwrite). | |
| runId | No | Lease run identifier. | |
| device | No | Device name selector (a UDID belongs in udid, a serial in serial). | |
| serial | No | Android, HarmonyOS, or Vega VVD serial selector. | |
| target | No | Alias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element. | |
| tenant | No | Remote tenant identifier. | |
| leaseId | No | Existing lease identifier. | |
| session | No | Agent-device session name. | |
| noRecord | No | Do not record this action. | |
| platform | No | Platform selector used to resolve a device. | |
| shutdown | No | Shutdown the session/device where supported. | |
| saveScript | No | ||
| includeCost | No | Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged. | |
| deviceTarget | No | Device target form. Maps to the CLI --target flag. | |
| responseLevel | No | Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged. | |
| mcpOutputFormat | No | MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately. | |
| androidDeviceAllowlist | No | Android serial allowlist used for device resolution. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses a 90s timeout and the distinction from shutdown, but omits side effects (e.g., whether unsaved data is lost), error handling, or what happens when the app is not running. For a close operation this is a significant gap in transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no redundancy. The first sentence states the core action, the second adds a usage caveat and a timeout. Information is front-loaded and every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite high schema coverage, the description does not mention output or return values (no output schema exists), error behavior, or how to select an app (by name, bundle ID, etc.). With 20 parameters and no output schema, the description leaves an agent uncertain about what happens after the call, making it incomplete for a complex tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 95%, so the schema already documents all parameters. The description adds no parameter-specific meaning beyond what is in the schema, which is acceptable given the high coverage. Baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool closes a named app, or the active session app when omitted. It explicitly contrasts with shutdown, distinguishing this tool from the sibling 'shutdown' tool. The verb-resource pair is specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a clear condition for when to use shutdown instead of close ('Use shutdown only when the selected simulator or emulator should also stop'). However, it does not offer broader guidance on when to prefer close over other app-management tools, nor does it state when not to use it. The guidance is present but narrow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
debugA
Symbolicate Apple crash artifacts with matching dSYM UUIDs. This debug namespace is intentionally narrow: use logs for app logs, network for HTTP evidence, perf for performance samples, record/trace for media and traces, and react-devtools for React Native profiles. Times out after 90s.
| Name | Required | Description | Default |
|---|---|---|---|
| out | No | Output path for the symbolicated artifact. | |
| dsym | No | Path to a matching .dSYM bundle. | |
| udid | No | Apple device or simulator UDID; the selector that pins one device when several share a name. | |
| debug | No | Enable debug diagnostics. | |
| runId | No | Lease run identifier. | |
| action | Yes | ||
| device | No | Device name selector (a UDID belongs in udid, a serial in serial). | |
| serial | No | Android, HarmonyOS, or Vega VVD serial selector. | |
| target | No | Alias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element. | |
| tenant | No | Remote tenant identifier. | |
| leaseId | No | Existing lease identifier. | |
| session | No | Agent-device session name. | |
| artifact | Yes | Apple crash artifact path (.ips, .crash, or .log). | |
| platform | No | Platform selector used to resolve a device. | |
| searchPath | No | Directory to scan for matching .dSYM bundles. | |
| includeCost | No | Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged. | |
| deviceTarget | No | Device target form. Maps to the CLI --target flag. | |
| responseLevel | No | Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged. | |
| mcpOutputFormat | No | MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately. | |
| androidDeviceAllowlist | No | Android serial allowlist used for device resolution. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It adds the useful 90-second timeout and the narrow-scope behavior, but it does not disclose side effects, output behavior, or failure modes beyond that. Some meaningful behavioral context is present, but not enough for a tool with zero annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences with no filler. It front-loads the core purpose, then provides sibling routing, and ends with the timeout constraint. Every sentence contributes information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 20-parameter tool with no annotations and no output schema, the description is relatively complete: it clarifies purpose, sibling boundaries, and a key operational limit. It leaves some details such as output path defaults or multi-dSYM matching behavior to the schema, but the schema picks up most of that burden.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 95%, so the schema already documents nearly all parameters. The description adds the key conceptual detail that dSYM matching is done by UUID, which helps make sense of dsym and searchPath, but it does not need to add more and does not go beyond that.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Symbolicate Apple crash artifacts with matching dSYM UUIDs.' It clearly distinguishes this tool from sibling tools by stating the debug namespace is intentionally narrow and naming what each sibling should be used for.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly routes an agent to alternatives: 'use logs for app logs, network for HTTP evidence, perf for performance samples, record/trace for media and traces, and react-devtools for React Native profiles.' This makes the selection boundary between debug and neighboring tools explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
devicesA
List available devices and simulators that can be selected for automation. Use platform, device, udid, or serial inputs on later commands to target one result. Times out after 90s.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | No | Apple device or simulator UDID; the selector that pins one device when several share a name. | |
| debug | No | Enable debug diagnostics. | |
| runId | No | Lease run identifier. | |
| device | No | Device name selector (a UDID belongs in udid, a serial in serial). | |
| serial | No | Android, HarmonyOS, or Vega VVD serial selector. | |
| target | No | Alias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element. | |
| tenant | No | Remote tenant identifier. | |
| leaseId | No | Existing lease identifier. | |
| session | No | Agent-device session name. | |
| platform | No | Platform selector used to resolve a device. | |
| includeCost | No | Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged. | |
| deviceTarget | No | Device target form. Maps to the CLI --target flag. | |
| responseLevel | No | Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged. | |
| mcpOutputFormat | No | MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately. | |
| androidDeviceAllowlist | No | Android serial allowlist used for device resolution. |
Output Schema
| Name | Required | Description |
|---|---|---|
| devices | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It reveals a 90-second timeout, which is a concrete operational detail. However, it does not state whether the operation is read-only, whether it requires special permissions, or how it behaves on failure or partial results. The timeout is useful but the overall behavioral picture is incomplete.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with zero waste. The purpose is stated first, followed by a practical usage hint and a timeout note. Every sentence earns its place, and the description is appropriately brief for a list tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has a rich output schema (true) and 15 optional parameters all documented in the schema, so the description need not explain return values. It covers the core purpose, the selector reuse pattern, and the timeout. For a discovery tool, this is sufficient; the only minor gap is that it doesn't explicitly mention that the filters are optional or that the output is a list, but these are implied by the verb 'List' and the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so each parameter is already documented in the input schema. The description mentions platform, device, udid, or serial as selectors, but this primarily guides usage of later commands, not the parameters of this tool itself. It adds little semantic meaning beyond what the schema provides, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the action 'List' and the resource 'available devices and simulators' explicitly, and clarifies the purpose 'can be selected for automation.' The verb is specific and distinguishes it from action-oriented siblings like boot, click, or install, which have clearly different purposes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear guidance on how to use the output: 'Use platform, device, udid, or serial inputs on later commands to target one result.' This explains the primary use case. However, it does not explicitly mention when not to use this tool or name alternative listing tools (e.g., get, find), though the siblings suggest those might serve other resources. The guidance is sufficient but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
diffA
Compare accessibility snapshots or screenshots to identify UI changes. Use snapshot comparisons for semantic tree changes and screenshot comparisons for pixel differences. Times out after 90s.
| Name | Required | Description | Default |
|---|---|---|---|
| out | No | ||
| raw | No | ||
| kind | Yes | ||
| udid | No | Apple device or simulator UDID; the selector that pins one device when several share a name. | |
| debug | No | Enable debug diagnostics. | |
| depth | No | ||
| runId | No | Lease run identifier. | |
| scope | No | ||
| device | No | Device name selector (a UDID belongs in udid, a serial in serial). | |
| serial | No | Android, HarmonyOS, or Vega VVD serial selector. | |
| target | No | Alias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element. | |
| tenant | No | Remote tenant identifier. | |
| leaseId | No | Existing lease identifier. | |
| session | No | Agent-device session name. | |
| noRecord | No | Do not record this action. | |
| platform | No | Platform selector used to resolve a device. | |
| includeCost | No | Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged. | |
| deviceTarget | No | Device target form. Maps to the CLI --target flag. | |
| responseLevel | No | Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged. | |
| interactiveOnly | No | ||
| mcpOutputFormat | No | MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately. | |
| androidDeviceAllowlist | No | Android serial allowlist used for device resolution. |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | Yes | |
| lines | Yes | |
| summary | Yes | |
| warnings | No | |
| baselineInitialized | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses a 90-second timeout, which is useful, but does not state whether the operation is read-only, what prerequisites exist (e.g., prior artifacts), or the nature of side effects. Limited transparency beyond the timeout.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with zero filler. The primary purpose is front-loaded, and the mode-specific guidance is presented immediately. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 22 parameters and an output schema, this description is too sparse. It does not explain how to supply the artifacts being compared (there is no obvious parameter for a baseline or target), nor what the output looks like. An agent would struggle to construct a valid call beyond the required kind parameter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description implies two kinds ('snapshot' and 'screenshot'), but the schema constrains kind to only 'snapshot', creating a direct inconsistency that could mislead an agent. The description adds no meaning for the other parameters (out, raw, depth, scope, etc.) beyond their schema descriptions, and does not clarify how to specify the two artifacts to compare.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb (compare), the resource (accessibility snapshots or screenshots), and the purpose (identify UI changes). It also distinguishes between the two modes (snapshot for semantic tree changes, screenshot for pixel differences), which sets it apart from sibling tools like snapshot and screenshot.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells when to use snapshot comparisons vs screenshot comparisons, giving context for selecting the right mode. However, it does not mention when to avoid this tool or recommend alternative sibling tools, though the internal mode distinction is helpful.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
doctorA
Diagnose device, app, development-server, and React Native or Expo readiness issues. Returns compact evidence for local inventory, sessions, optional app discovery, toolchains, and server reachability. On iOS simulators it also warms the XCTest runner build cache in the background when missing, so run it before the first Apple snapshot or interaction of a session. Times out after 90s.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | No | Apple device or simulator UDID; the selector that pins one device when several share a name. | |
| debug | No | Enable debug diagnostics. | |
| runId | No | Lease run identifier. | |
| device | No | Device name selector (a UDID belongs in udid, a serial in serial). | |
| remote | No | Check remote connection setup instead of local device inventory. | |
| serial | No | Android, HarmonyOS, or Vega VVD serial selector. | |
| target | No | Alias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element. | |
| tenant | No | Remote tenant identifier. | |
| leaseId | No | Existing lease identifier. | |
| session | No | Agent-device session name. | |
| platform | No | Platform selector used to resolve a device. | |
| targetApp | No | Installed app package/bundle id or app name to verify without opening a session. | |
| includeCost | No | Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged. | |
| deviceTarget | No | Device target form. Maps to the CLI --target flag. | |
| responseLevel | No | Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged. | |
| mcpOutputFormat | No | MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately. | |
| androidDeviceAllowlist | No | Android serial allowlist used for device resolution. |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | Yes | |
| metro | No | |
| checks | Yes | |
| status | Yes | |
| target | No | |
| summary | Yes | |
| platform | No | |
| targetApp | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full transparency burden. It discloses a notable background side effect (XCTest cache warming on iOS simulators), a 90-second timeout, and the output shape ('compact evidence'). This goes beyond a generic 'diagnose' and gives the agent actionable expectations, though it could go further on potential state changes beyond cache warming.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with the purpose front-loaded, followed by return evidence and then the critical side-effect warning and timeout. Every sentence contributes new information, and nothing is redundant with the schema or output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a broad diagnostic tool with an output schema and fully documented optional parameters, the description provides everything needed to decide when and how to invoke it: what it checks, what it returns, the cache-warming side effect, and the 90s timeout. Even with 17 parameters, the schema fills the remaining detail, so the description is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the structured schema already documents all 17 optional parameters. The tool description adds no parameter-specific semantics—it only discusses overall behavior and output—so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Diagnose') and a concrete resource scope: device, app, development-server, and React Native or Expo readiness issues. It also enumerates the returned evidence (local inventory, sessions, app discovery, toolchains, server reachability), which clearly differentiates it from single-purpose sibling commands like screenshot or gesture.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells the agent to run this before the first Apple snapshot or interaction of a session to warm the XCTest runner cache, which is a clear, concrete use-case. It stops short of naming alternatives or stating when not to use it, so it does not fully satisfy the 'explicit when/when-not/alternatives' level.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
eventsB
Read the daemon-owned session event timeline as paged JSON-friendly entries Times out after 90s.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | No | Apple device or simulator UDID; the selector that pins one device when several share a name. | |
| debug | No | Enable debug diagnostics. | |
| limit | No | ||
| runId | No | Lease run identifier. | |
| cursor | No | ||
| device | No | Device name selector (a UDID belongs in udid, a serial in serial). | |
| serial | No | Android, HarmonyOS, or Vega VVD serial selector. | |
| target | No | Alias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element. | |
| tenant | No | Remote tenant identifier. | |
| leaseId | No | Existing lease identifier. | |
| session | No | Agent-device session name. | |
| platform | No | Platform selector used to resolve a device. | |
| includeCost | No | Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged. | |
| deviceTarget | No | Device target form. Maps to the CLI --target flag. | |
| responseLevel | No | Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged. | |
| mcpOutputFormat | No | MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately. | |
| androidDeviceAllowlist | No | Android serial allowlist used for device resolution. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral disclosure burden. It does reveal that the operation is read-only, returns paged JSON-friendly entries, and times out after 90 seconds. However, it does not explain pagination mechanics, the entry shape, or what happens on timeout, leaving some 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very brief and front-loaded, with the core verb and resource stated first and the timeout note as the only extra detail. It is economical, though the missing punctuation and run-on feel ('entries Times out') make it slightly less polished than ideal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema and no annotations, and the description does not explain the event entry structure, pagination behavior, required selectors, or response format beyond 'JSON-friendly entries.' For a tool with 17 parameters and several sibling tools, this is a significant contextual gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 88%, so the schema already documents almost all parameters. The description adds little parameter-specific meaning beyond implying the relevance of paging through limit and cursor, and it does not clarify the two undocumented parameters (limit, cursor). The baseline of 3 is appropriate given the strong schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Read'), a clear resource ('daemon-owned session event timeline'), and the output form ('paged JSON-friendly entries'). It is clear about what the tool does, though it does not explicitly differentiate it from similar sibling tools like logs, trace, or session.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given for when to use this tool versus alternatives. The sibling set includes related tools such as logs, trace, session, and replay, but the description provides no selection criteria, exclusions, or context that would help an agent choose correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fillA
Replace text in a UI input selected by snapshot ref, selector, or coordinates. Pass an empty text to clear the field. Prefer refs or selectors after snapshot; use recordAs to keep sensitive text out of a recorded replay while sending it to the live app. Times out after 90s; a caller-supplied budget extends it.
| Name | Required | Description | Default |
|---|---|---|---|
| raw | No | Use raw snapshot data during selector resolution. | |
| text | Yes | Text to enter into the target. Pass "" to clear it. | |
| udid | No | Apple device or simulator UDID; the selector that pins one device when several share a name. | |
| debug | No | Enable debug diagnostics. | |
| depth | No | Snapshot traversal depth. | |
| runId | No | Lease run identifier. | |
| scope | No | Snapshot scope selector used before resolution. | |
| device | No | Device name selector (a UDID belongs in udid, a serial in serial). | |
| serial | No | Android, HarmonyOS, or Vega VVD serial selector. | |
| settle | No | After the action, wait for the UI to go quiet and return the settled diff vs the pre-action tree in the same response. Best-effort; never fails the action. | |
| target | Yes | UI target. This is separate from deviceTarget, which selects the device form. | |
| tenant | No | Remote tenant identifier. | |
| verify | No | Capture cheap post-action evidence (AX digest, node counts, changedFromBefore) instead of a follow-up snapshot. | |
| delayMs | No | Delay between typed characters. | |
| leaseId | No | Existing lease identifier. | |
| session | No | Agent-device session name. | |
| noRecord | No | Do not record this action. | |
| platform | No | Platform selector used to resolve a device. | |
| recordAs | No | When script recording is armed, send text to the live app but publish it as ${VAR}. Use an uppercase replay variable name such as PASSWORD. | |
| timeoutMs | No | Settle: wait deadline in milliseconds (default 10000). | |
| includeCost | No | Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged. | |
| deviceTarget | No | Device target form. Maps to the CLI --target flag. | |
| responseLevel | No | Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged. | |
| settleQuietMs | No | Settle: quiet window in milliseconds (default 500). | |
| mcpOutputFormat | No | MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately. | |
| androidDeviceAllowlist | No | Android serial allowlist used for device resolution. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of behavioral disclosure. It discloses the empty-text-clears-field behavior, the 90s timeout and budget extension, and the recordAs security behavior, which are meaningful beyond the schema. It does not mention possible side effects or prerequisites, but the behavior is sufficiently transparent for this kind of action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no filler: the first states action and target options, the second covers clearing behavior, and the third covers security and timeout. Every sentence earns its place and the most important information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 26-parameter tool, the description covers the key decisions an agent must make: how to target, when to use recordAs, and timeout behavior. The output schema and fully documented parameter descriptions supply the rest. It is slightly incomplete in not routing between fill and the sibling 'type' tool, but overall it is complete enough to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 26 parameters. The description adds useful semantic color around target preference, clearing, recordAs, and timeout, but doesn't need to compensate for missing schema documentation. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action ('Replace text in a UI input') and the three targeting mechanisms (snapshot ref, selector, coordinates). It is clear enough to distinguish from most siblings, though it does not explicitly differentiate from the sibling 'type' text-entry tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit practical guidance: prefer refs or selectors after a snapshot, use recordAs to keep sensitive text out of recorded replays, and notes the 90s timeout. It does not state when to choose fill over the sibling 'type' tool, so it stops short of full usage-versus-alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
findC
Find by text/label/value/role/id and run action Times out after 90s.
| Name | Required | Description | Default |
|---|---|---|---|
| raw | No | ||
| last | No | ||
| udid | No | Apple device or simulator UDID; the selector that pins one device when several share a name. | |
| debug | No | Enable debug diagnostics. | |
| depth | No | ||
| first | No | ||
| query | Yes | ||
| runId | No | Lease run identifier. | |
| value | No | ||
| action | No | ||
| device | No | Device name selector (a UDID belongs in udid, a serial in serial). | |
| record | No | Force-record this out-of-band observation into a repair-armed heal (mutually exclusive with noRecord). Authored replay steps are recorded automatically and never need this. On find, valid only for a read-only action. | |
| serial | No | Android, HarmonyOS, or Vega VVD serial selector. | |
| target | No | Alias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element. | |
| tenant | No | Remote tenant identifier. | |
| leaseId | No | Existing lease identifier. | |
| locator | No | ||
| session | No | Agent-device session name. | |
| noRecord | No | Do not record this action. | |
| platform | No | Platform selector used to resolve a device. | |
| timeoutMs | No | ||
| includeCost | No | Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged. | |
| deviceTarget | No | Device target form. Maps to the CLI --target flag. | |
| responseLevel | No | Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged. | |
| mcpOutputFormat | No | MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately. | |
| androidDeviceAllowlist | No | Android serial allowlist used for device resolution. |
Output Schema
| Name | Required | Description |
|---|---|---|
| x | No | Resolved x coordinate for mutating find actions. |
| y | No | Resolved y coordinate for mutating find actions. |
| ref | No | Snapshot ref without the @ prefix when the find action returns one. |
| cost | No | |
| node | No | Snapshot node for find get_attrs/get_text. |
| text | No | Text value returned by find get_text. |
| found | No | Whether a wait/exists/read-only find satisfied its condition. |
| query | No | Query argument used for the find action. |
| locator | No | Locator kind used for the find action. |
| matches | No | Every match for the read-only find list action (#1625): { ref, node } each. |
| message | No | Diagnostic message for mutating find actions. |
| waitedMs | No | Milliseconds waited for a read-only find condition. |
| refsGeneration | No | ADR 0014 ref frame epoch for read-only find actions. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the full burden. It discloses a 90-second timeout, which is useful, but does not describe side effects (e.g., destructive actions), behavior when no element is found, or whether the action is read-only or mutating. This is a significant gap for a tool that can run click, fill, and type actions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence, which is concise and front-loaded with the main purpose. However, it lacks any structure or breakdown of the action and locator options, and the timeout note is appended without context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (26 parameters, no annotations, output schema present but not described), the description is grossly inadequate. It does not explain the action list, locator semantics, device targeting, or any of the boolean flags. An agent would have to rely almost entirely on the schema, which itself is incomplete at 65% coverage. This is far from a minimum viable description for such a feature-rich tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 65%, so many parameters are described in the schema. The description adds meaning for the locator concept (text/label/value/role/id), but does not explain the action enum, flags like raw/last/first, or device selection parameters. It adds only marginal value beyond the schema for a tool with 26 parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear purpose: find by text/label/value/role/id and run an action. This distinguishes it from siblings like click or get, which are single-purpose. It does not explicitly name an alternative, but the core action is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given on when to use this tool versus alternatives such as click, fill, or get. It does not mention prerequisites, exclusions, or scenarios where a simpler tool would be more appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
focusA
Move input focus to explicit screen coordinates without entering text. Prefer semantic interactions when a snapshot ref or selector is available; use type or fill after focus. Times out after 90s.
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | X coordinate. | |
| y | Yes | Y coordinate. | |
| udid | No | Apple device or simulator UDID; the selector that pins one device when several share a name. | |
| debug | No | Enable debug diagnostics. | |
| runId | No | Lease run identifier. | |
| device | No | Device name selector (a UDID belongs in udid, a serial in serial). | |
| serial | No | Android, HarmonyOS, or Vega VVD serial selector. | |
| target | No | Alias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element. | |
| tenant | No | Remote tenant identifier. | |
| leaseId | No | Existing lease identifier. | |
| session | No | Agent-device session name. | |
| noRecord | No | Do not record this action. | |
| platform | No | Platform selector used to resolve a device. | |
| includeCost | No | Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged. | |
| deviceTarget | No | Device target form. Maps to the CLI --target flag. | |
| responseLevel | No | Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged. | |
| mcpOutputFormat | No | MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately. | |
| androidDeviceAllowlist | No | Android serial allowlist used for device resolution. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses the 90-second timeout and the no-text-entry behavior, which is useful. However, it doesn't disclose potential failure modes, prerequisites (e.g., visible target), or what the response contains, leaving meaningful gaps for a UI-mutating operation with zero annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with the core purpose front-loaded first. Every sentence earns its place: purpose, usage guidance, and timeout. No filler or redundant wording.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a coordinate-based focus tool with no output schema, the description covers purpose, usage routing, and timeout. It could mention response shape or failure behavior, but the tool's simplicity and the fact that most of the 18 parameters are shared selectors (udid, device, platform) mean the description is reasonably complete for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description's 'explicit screen coordinates' maps to x/y, but that context is already implicit in the schema's 'X coordinate' and 'Y coordinate' entries. The description adds no parameter details beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Move input focus to explicit screen coordinates without entering text.' This is clear and the 'without entering text' clause differentiates it from type/fill siblings. However, it doesn't explicitly distinguish focus from other coordinate-based siblings like click or hover, so it falls just 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Prefer semantic interactions when a snapshot ref or selector is available; use type or fill after focus' gives explicit when-to-use guidance and names the complementary tools (type/fill). It doesn't enumerate exclusions relative to click/hover, but the coordination guidance is genuinely useful and clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gestureC
Perform a structured pan, fling, swipe, pinch, rotate, transform, or drag gesture. Select the gesture kind, then provide only the inputs that apply to that kind. Times out after 90s.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | Gesture variant. | |
| udid | No | Apple device or simulator UDID; the selector that pins one device when several share a name. | |
| debug | No | Enable debug diagnostics. | |
| delta | No | Movement delta for pan or transform gestures. | |
| runId | No | Lease run identifier. | |
| scale | No | Pinch or transform scale. | |
| device | No | Device name selector (a UDID belongs in udid, a serial in serial). | |
| moveMs | No | Drag movement duration. | |
| origin | No | Gesture origin point. | |
| preset | No | Swipe preset. | |
| serial | No | Android, HarmonyOS, or Vega VVD serial selector. | |
| source | No | Drag source @ref or selector. | |
| target | No | Alias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element. | |
| tenant | No | Remote tenant identifier. | |
| degrees | No | Rotation in degrees. | |
| leaseId | No | Existing lease identifier. | |
| session | No | Agent-device session name. | |
| distance | No | Fling distance. | |
| noRecord | No | Do not record this action. | |
| platform | No | Platform selector used to resolve a device. | |
| direction | No | Fling direction. | |
| durationMs | No | Pan/transform duration. | |
| destination | No | Drag destination @ref or selector. | |
| includeCost | No | Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged. | |
| deviceTarget | No | Device target form. Maps to the CLI --target flag. | |
| pointerCount | No | Pan touch pointer count (1 or 2). | |
| sourceHoldMs | No | Drag activation hold duration. | |
| responseLevel | No | Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged. | |
| mcpOutputFormat | No | MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately. | |
| destinationHoldMs | No | Hold before releasing at the destination. | |
| androidDeviceAllowlist | No | Android serial allowlist used for device resolution. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry full burden. It discloses a 90s timeout, which is a useful behavioral trait. However, it does not mention side effects, whether it is read-only or destructive, or any other behaviors. The term 'structured' is vague and does not clarify what the tool does beyond performing the gesture. It does not mention recording or device targeting. Given the lack of annotations, this is insufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that states the purpose and a usage rule, plus a timeout. It is concise and front-loads the purpose. However, it could be structured to list the kinds more clearly. Still, it is appropriately sized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 31 parameters and 7 gesture kinds, the description is extremely sparse. It does not explain which parameters apply to which gesture kind, nor does it describe the output. With no output schema, the description should clarify what the tool returns, but it does not. The schema has parameter descriptions, but they are not enough to understand the gesture-specific requirements. The description is far from complete for such a complex tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds the rule to provide only inputs that apply to the selected kind, which gives a generic guideline. It does not add specific parameter details beyond what the schema provides. It adds minimal value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it performs a structured gesture of various types (pan, fling, swipe, pinch, rotate, transform, drag). However, it does not differentiate from sibling tools like the dedicated 'swipe' tool, which could confuse an agent about which tool to use. The purpose is explicit but sibling differentiation is weak.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description says to select the gesture kind and provide only applicable inputs, but it does not specify when to use this tool versus alternatives like swipe or scroll. No exclusions or context about scenarios are given. It offers minimal guidance on usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getA
Read text or accessibility attributes from a snapshot ref or selector without changing the app. Use format text for visible content or attrs for the element attribute map. Times out after 90s.
| Name | Required | Description | Default |
|---|---|---|---|
| raw | No | Use raw snapshot data during selector resolution. | |
| udid | No | Apple device or simulator UDID; the selector that pins one device when several share a name. | |
| debug | No | Enable debug diagnostics. | |
| depth | No | Snapshot traversal depth. | |
| runId | No | Lease run identifier. | |
| scope | No | Snapshot scope selector used before resolution. | |
| device | No | Device name selector (a UDID belongs in udid, a serial in serial). | |
| format | Yes | ||
| record | No | Force-record this out-of-band observation into a repair-armed heal (mutually exclusive with noRecord). Authored replay steps are recorded automatically and never need this. On find, valid only for a read-only action. | |
| serial | No | Android, HarmonyOS, or Vega VVD serial selector. | |
| target | Yes | UI element target by snapshot ref or selector expression. | |
| tenant | No | Remote tenant identifier. | |
| leaseId | No | Existing lease identifier. | |
| session | No | Agent-device session name. | |
| noRecord | No | Do not record this action. | |
| platform | No | Platform selector used to resolve a device. | |
| includeCost | No | Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged. | |
| deviceTarget | No | Device target form. Maps to the CLI --target flag. | |
| responseLevel | No | Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged. | |
| mcpOutputFormat | No | MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately. | |
| androidDeviceAllowlist | No | Android serial allowlist used for device resolution. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states the operation is non-mutating ('without changing the app') and adds a specific timeout ('Times out after 90s'), which goes beyond the schema. It does not cover every error or edge case, but the key safety and timing traits are present.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler. The primary purpose and read-only nature are front-loaded, followed by format usage and the timeout. Every sentence earns its place and the structure is optimal for quick agent scanning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 21 parameters and no output schema, the description covers the essential invocation semantics: what to read, how to specify the format, that the operation is safe, and the timeout. Many optional parameters are left to the schema, but the core context an agent needs to select and call this tool correctly is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 95%, so the baseline is 3. The description adds meaningful semantics for the core parameters: it explains what 'format' values produce ('text for visible content', 'attrs for the element attribute map') and clarifies the target as 'snapshot ref or selector'. This is valuable beyond the bare schema enumerations.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Read') and resource ('text or accessibility attributes') from a 'snapshot ref or selector', and explicitly notes it does so 'without changing the app'. This makes it clearly distinguishable from siblings like snapshot or find, and the purpose is immediately apparent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use the tool: when you need visible content or an element attribute map from a ref or selector. It also gives format-selection guidance ('Use format text for visible content or attrs for the element attribute map'), though it does not explicitly contrast with alternative sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
helpA
Usage guides. No topic: the full workflow card. topic = one of commands, manual-qa, maestro, workflow, scripting, gestures, tv, debugging, react-devtools, cdp, react-native, physical-device, ios-system-ui, remote, macos, web, dogfood, validate for that guide, or a tool name for its complete flag reference. For specialized work or an unclear command shape only; not a startup step, not needed after an error that carries a hint.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | No | Guide topic or tool name; omit for the card. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It fully discloses the behavioral modes (full card vs. specific guide, flag reference) and enumerates valid topics. It doesn't explicitly state non-mutating behavior, but that is inherent for a help tool, so it's sufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The content is dense but well-organized: it starts with a clear summary, then explains the no-topic case, then the topic list, then usage restrictions. Every phrase adds value, but it's a single long sentence that could be split for readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple help tool with one optional parameter, the description is complete: it covers the default behavior, all valid inputs, alternative usage, and when to avoid the tool. No output schema is needed because the tool's return is self-evident.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description significantly enriches the schema's parameter description by listing all valid topics and explaining the two usage modes (omit for card, tool name for flag reference). This goes well beyond the schema's 'Guide topic or tool name; omit for the card.'
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool provides usage guides and distinguishes between the full workflow card (no topic) and specific guides/flag references (with topic). It is specific and stands apart from sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use guidance is given: 'For specialized work or an unclear command shape only; not a startup step, not needed after an error that carries a hint.' However, it does not name alternative tools for these cases, so I deduct one point.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
homeA
Send the selected device to its home screen. This leaves the app session open but moves the foreground away from the app. Times out after 90s.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | No | Apple device or simulator UDID; the selector that pins one device when several share a name. | |
| debug | No | Enable debug diagnostics. | |
| runId | No | Lease run identifier. | |
| device | No | Device name selector (a UDID belongs in udid, a serial in serial). | |
| serial | No | Android, HarmonyOS, or Vega VVD serial selector. | |
| target | No | Alias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element. | |
| tenant | No | Remote tenant identifier. | |
| leaseId | No | Existing lease identifier. | |
| session | No | Agent-device session name. | |
| noRecord | No | Do not record this action. | |
| platform | No | Platform selector used to resolve a device. | |
| includeCost | No | Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged. | |
| deviceTarget | No | Device target form. Maps to the CLI --target flag. | |
| responseLevel | No | Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged. | |
| mcpOutputFormat | No | MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately. | |
| androidDeviceAllowlist | No | Android serial allowlist used for device resolution. |
Output Schema
| Name | Required | Description |
|---|---|---|
| action | Yes | |
| message | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses that the app session remains open and that the tool times out after 90 seconds, which are key behaviors. It does not detail side effects like whether the home button is pressed or what happens on timeout, but the provided details are useful.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences, with the core action front-loaded and the critical behavioral nuance in the second sentence. No redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple in purpose and the output schema is present, so the description covers the essential facts (action, session behavior, timeout). It does not mention platform-specific behavior (mobile/tv/desktop) despite the target parameters, but the schema and output schema fill most gaps. Adequate for a straightforward navigation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds no additional meaning to any of the 16 parameters; all semantics are already captured in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Send the selected device to its home screen.' It clearly distinguishes the action from navigation tools like 'back' by explicitly noting it leaves the app session open, which is a defining behavioral difference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives some implied usage context (e.g., it moves foreground away from the app) but does not explicitly state when to use this tool versus alternatives like 'back' or 'app-switcher'. No exclusions or alternatives are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hoverA
Move the pointer over a UI target by snapshot ref, selector, or coordinates without pressing, to reveal hover-gated UI such as row toolbars or menus. Web only; touch platforms have no hover state. Use settle to observe what the hover revealed without a follow-up snapshot. Times out after 90s; a caller-supplied budget extends it.
| Name | Required | Description | Default |
|---|---|---|---|
| raw | No | Use raw snapshot data during selector resolution. | |
| udid | No | Apple device or simulator UDID; the selector that pins one device when several share a name. | |
| debug | No | Enable debug diagnostics. | |
| depth | No | Snapshot traversal depth. | |
| runId | No | Lease run identifier. | |
| scope | No | Snapshot scope selector used before resolution. | |
| device | No | Device name selector (a UDID belongs in udid, a serial in serial). | |
| serial | No | Android, HarmonyOS, or Vega VVD serial selector. | |
| settle | No | After the action, wait for the UI to go quiet and return the settled diff vs the pre-action tree in the same response. Best-effort; never fails the action. | |
| target | Yes | UI target. This is separate from deviceTarget, which selects the device form. | |
| tenant | No | Remote tenant identifier. | |
| leaseId | No | Existing lease identifier. | |
| session | No | Agent-device session name. | |
| noRecord | No | Do not record this action. | |
| platform | No | Platform selector used to resolve a device. | |
| timeoutMs | No | Settle: wait deadline in milliseconds (default 10000). | |
| includeCost | No | Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged. | |
| deviceTarget | No | Device target form. Maps to the CLI --target flag. | |
| responseLevel | No | Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged. | |
| settleQuietMs | No | Settle: quiet window in milliseconds (default 500). | |
| mcpOutputFormat | No | MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately. | |
| androidDeviceAllowlist | No | Android serial allowlist used for device resolution. |
Output Schema
| Name | Required | Description |
|---|---|---|
| x | No | Resolved interaction x coordinate when available. |
| y | No | Resolved interaction y coordinate when available. |
| ref | No | Snapshot ref without the @ prefix when the target was an @ref. |
| cost | No | |
| hint | No | |
| settle | No | |
| gesture | No | |
| message | No | |
| warning | No | |
| evidence | No | |
| refLabel | No | |
| selector | No | Selector expression when the target was a selector. |
| resolution | No | Pre-action disclosure of how the acting path resolved its target. Absent when resolutionDisclosure is inapplicable for the path. |
| targetKind | Yes | Resolved interaction target kind. |
| selectorChain | No | |
| referenceWidth | No | Reference frame width for visualizing the interaction point. |
| targetHittable | No | |
| referenceHeight | No | Reference frame height for visualizing the interaction point. |
| maestroFallbackReason | No | |
| maestroNonHittableCoordinateFallbackUsed | No | Whether the direct iOS Maestro coordinate fallback was actually used. |
| maestroNonHittableCoordinateFallbackAllowed | No | Whether the direct iOS Maestro coordinate fallback was allowed for this selector. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and provides several useful behavioral facts: the action does not press, it is Web-only, it times out after 90 seconds, and a caller budget can extend it. It does not cover failure modes or side effects in depth, but the main operational traits are disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences, front-loaded with the action and purpose, followed by platform limitation and timeout. No filler or redundant restating of the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is complex with 22 parameters, but schema coverage is complete and an output schema exists, so the description can focus on behavior. It covers the core action, platform constraint, settle behavior, and timeout. It is not exhaustive about edge cases, but it is complete enough for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description's reference to 'snapshot ref, selector, or coordinates' summarizes the target variants and the settle advice adds a little context, but it does not add meaning beyond what the schema already provides for the parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ('Move the pointer'), a resource ('a UI target'), three addressing modes (snapshot ref, selector, coordinates), and the purpose ('reveal hover-gated UI'). The 'without pressing' and 'Web only' clauses distinguish it from click/press and from touch-only interactions, so an agent can differentiate it from sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear use case (hover-gated UI) and an explicit platform exclusion ('Web only; touch platforms have no hover state'). It also tells the agent to use settle to observe results. It does not explicitly name an alternative sibling such as click/press for the 'without pressing' case, so the guidance is clear but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
installA
Install an app binary from a local path. Provide an app identifier with the path when the target needs explicit app selection; use reinstall to replace an already installed app. Times out after 180s.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Optional app identifier hint. | |
| udid | No | Apple device or simulator UDID; the selector that pins one device when several share a name. | |
| debug | No | Enable debug diagnostics. | |
| runId | No | Lease run identifier. | |
| device | No | Device name selector (a UDID belongs in udid, a serial in serial). | |
| serial | No | Android, HarmonyOS, or Vega VVD serial selector. | |
| target | No | Alias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element. | |
| tenant | No | Remote tenant identifier. | |
| appPath | Yes | Path to app binary. | |
| leaseId | No | Existing lease identifier. | |
| session | No | Agent-device session name. | |
| noRecord | No | Do not record this action. | |
| platform | No | Platform selector used to resolve a device. | |
| includeCost | No | Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged. | |
| deviceTarget | No | Device target form. Maps to the CLI --target flag. | |
| responseLevel | No | Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged. | |
| mcpOutputFormat | No | MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately. | |
| androidDeviceAllowlist | No | Android serial allowlist used for device resolution. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It discloses a 180s timeout, which is a behavioral detail. However, it does not state whether the install overwrites an existing app, what happens on failure, or any required permissions. The mutation nature is implicit, but there's limited additional transparency beyond the timeout.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no wasted words. It front-loads the purpose, then provides usage guidance and a timeout note. Every sentence earns its place, making it concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the absence of an output schema and the full schema coverage of parameters, the description covers the core operation, directs to reinstall for replacement, and notes the timeout. It does not specify behavior when the app is already installed, but that is handled by the reinstall reference. The description is sufficiently complete for an install command, though it could mention failure handling or overwrite behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds meaning to two parameters: it clarifies that 'app' is an identifier (via 'Provide an app identifier') and that 'appPath' is a local path (via 'from a local path'). This provides additional context beyond the schema, though it doesn't elaborate on the other 16 parameters. Given the high schema coverage, the description compensates adequately.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Install an app binary from a local path.' It uses a specific verb ('Install'), resource ('app binary'), and source ('local path'). It differentiates from the sibling 'reinstall' by explicitly stating 'use reinstall to replace an already installed app,' which helps an agent distinguish between the two.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit usage guidance: it tells the agent to provide an app identifier when explicit app selection is needed, and directs to 'reinstall' when replacing an already installed app. This clearly indicates when to use this tool versus the alternative. It also mentions the 180s timeout, which is useful context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
install-from-sourceB
Install app builds from URLs, remote source specs, or CI artifacts resolved by a remote daemon. Times out after 90s.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | No | Apple device or simulator UDID; the selector that pins one device when several share a name. | |
| debug | No | Enable debug diagnostics. | |
| runId | No | Lease run identifier. | |
| device | No | Device name selector (a UDID belongs in udid, a serial in serial). | |
| serial | No | Android, HarmonyOS, or Vega VVD serial selector. | |
| source | Yes | Install source object. | |
| target | No | Alias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element. | |
| tenant | No | Remote tenant identifier. | |
| leaseId | No | Existing lease identifier. | |
| session | No | Agent-device session name. | |
| noRecord | No | Do not record this action. | |
| platform | No | Platform selector used to resolve a device. | |
| includeCost | No | Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged. | |
| retainPaths | No | ||
| retentionMs | No | ||
| deviceTarget | No | Device target form. Maps to the CLI --target flag. | |
| responseLevel | No | Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged. | |
| mcpOutputFormat | No | MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately. | |
| androidDeviceAllowlist | No | Android serial allowlist used for device resolution. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses a 90-second timeout and remote daemon resolution, which are useful behavioral details. However, with no annotations, it omits prerequisites, side effects on the device, reversibility, or failure behavior. For a mutation tool, this is partial disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence states the purpose and a key constraint (timeout) upfront. No filler, front-loaded, and to the point.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (19 parameters, a nested source object, no output schema, no annotations), the description is far too brief. It lacks details on how to specify sources, what the response contains, error handling, or how to use the device selectors. An agent would need more context to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is high (89%), so the baseline is 3. The description adds no parameter-specific meaning beyond the schema; it doesn't clarify the structure of the 'source' object or how to combine the many device selectors. It neither enhances nor detracts from parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (install) and the resource (app builds) along with the source types (URLs, remote source specs, CI artifacts) and a remote daemon. It differentiates from the generic sibling 'install' by implying a source-based install, though it doesn't explicitly contrast with it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus the siblings 'install' or 'reinstall'. The description states what it does but doesn't provide context for selection, exclusions, or alternatives. An agent must infer that this is for source-based installs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
isA
Check whether a selector satisfies a UI predicate such as visible, hidden, exists, absent, editable, selected, focused, or text. absent passes only when one readable, complete, unscoped, full-depth accessibility capture has zero matches. Use wait when the condition may appear asynchronously. Times out after 90s.
| Name | Required | Description | Default |
|---|---|---|---|
| raw | No | Use raw snapshot data during selector resolution. | |
| udid | No | Apple device or simulator UDID; the selector that pins one device when several share a name. | |
| debug | No | Enable debug diagnostics. | |
| depth | No | Snapshot traversal depth. | |
| runId | No | Lease run identifier. | |
| scope | No | Snapshot scope selector used before resolution. | |
| value | No | ||
| device | No | Device name selector (a UDID belongs in udid, a serial in serial). | |
| record | No | Force-record this out-of-band observation into a repair-armed heal (mutually exclusive with noRecord). Authored replay steps are recorded automatically and never need this. On find, valid only for a read-only action. | |
| serial | No | Android, HarmonyOS, or Vega VVD serial selector. | |
| target | No | Alias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element. | |
| tenant | No | Remote tenant identifier. | |
| leaseId | No | Existing lease identifier. | |
| session | No | Agent-device session name. | |
| noRecord | No | Do not record this action. | |
| platform | No | Platform selector used to resolve a device. | |
| selector | Yes | ||
| predicate | Yes | ||
| includeCost | No | Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged. | |
| deviceTarget | No | Device target form. Maps to the CLI --target flag. | |
| responseLevel | No | Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged. | |
| mcpOutputFormat | No | MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately. | |
| androidDeviceAllowlist | No | Android serial allowlist used for device resolution. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden. It discloses the 90s timeout and precisely defines the tricky absent semantics: 'one readable, complete, unscoped, full-depth accessibility capture has zero matches.' It does not explicitly state that the tool returns a boolean or that it is read-only, but these are strongly implied.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three efficient sentences, front-loaded with the core purpose, followed by the special-case semantics and async guidance. Every sentence earns its place with no repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a predicate-check tool with no output schema, the description covers the core operation, the tricky absent behavior, timeout, and routing to wait. It does not spell out the return value or selector syntax, but these are largely inferable and not severe gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is high at 87%, so the baseline is 3. The description adds meaningful semantics for the required predicate parameter, especially the absent edge case, beyond what the enum alone provides. Selector itself remains undefined, but this is a common concept across sibling tools.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Check whether a selector satisfies a UI predicate', and enumerates all predicate values. It clearly differentiates itself from the sibling wait tool, and the predicate list makes its scope concrete.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly instructs when to use an alternative: 'Use wait when the condition may appear asynchronously.' This gives the agent a clear decision rule between is and wait.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keyboardA
Inspect Android keyboard visibility/type or press/dismiss the device keyboard. To hide the keyboard, use keyboard dismiss. It taps the keyboard dismiss/hide key when one is exposed, verifies the keyboard closed, and reports UNSUPPORTED_OPERATION when no dismiss key exists — background taps are never attempted. Times out after 90s.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | No | Apple device or simulator UDID; the selector that pins one device when several share a name. | |
| debug | No | Enable debug diagnostics. | |
| runId | No | Lease run identifier. | |
| action | No | ||
| device | No | Device name selector (a UDID belongs in udid, a serial in serial). | |
| serial | No | Android, HarmonyOS, or Vega VVD serial selector. | |
| target | No | Alias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element. | |
| tenant | No | Remote tenant identifier. | |
| leaseId | No | Existing lease identifier. | |
| session | No | Agent-device session name. | |
| noRecord | No | Do not record this action. | |
| platform | No | Platform selector used to resolve a device. | |
| includeCost | No | Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged. | |
| deviceTarget | No | Device target form. Maps to the CLI --target flag. | |
| responseLevel | No | Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged. | |
| mcpOutputFormat | No | MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately. | |
| androidDeviceAllowlist | No | Android serial allowlist used for device resolution. |
Output Schema
| Name | Required | Description |
|---|---|---|
| type | No | |
| action | Yes | |
| message | No | |
| visible | No | |
| attempts | No | |
| platform | Yes | |
| dismissed | No | |
| inputType | No | |
| inputOwner | No | |
| wasVisible | No | |
| focusedPackage | No | |
| focusedResourceId | No | |
| inputMethodPackage | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses key behaviors for dismiss: taps the dismiss key, verifies closure, reports UNSUPPORTED_OPERATION when no dismiss key exists, never attempts background taps, and times out after 90s. This is strong for one action, but other actions (status, enter, return) are not behaviorally disclosed, so it's 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a compact three-sentence block that front-loads the purpose and then details the dismiss behavior. There is no fluff, and every sentence contributes something. The structure is logical: purpose, usage hint, behavioral specifics.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema exists, so return values are presumably covered. However, the tool has 17 parameters and 6 enums, and the description only explains the dismiss action in detail. It doesn't cover the status, enter, or return actions, nor does it mention platform nuances (e.g., whether it works on iOS despite saying Android). This leaves gaps for an agent to call it correctly across all actions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 94%, so the schema already documents most parameters. The description adds value by explaining the 'dismiss' action's semantics (taps dismiss key, verifies, etc.), which the schema's enum values don't describe. However, it doesn't clarify the meaning of 'status', 'enter', or 'return', so it only partially compensates for the undocumented enum semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb-resource relationship: inspect or press/dismiss the keyboard. It is specific about the Android platform and distinguishes itself from generic tools like 'type' or 'click'. However, it doesn't fully disambiguate between the 'status' and 'enter' actions, so it's not perfect.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says 'To hide the keyboard, use keyboard dismiss', giving a concrete when-to-use for one action. But it doesn't provide guidance for when to use 'status', 'enter', or 'return', nor does it contrast with alternative tools like 'type' or 'keyboard' siblings. This is partial guidance at best.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
logsC
Session app log info, start/stop streaming, diagnostics, and markers Times out after 90s.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | No | Apple device or simulator UDID; the selector that pins one device when several share a name. | |
| debug | No | Enable debug diagnostics. | |
| runId | No | Lease run identifier. | |
| action | No | ||
| device | No | Device name selector (a UDID belongs in udid, a serial in serial). | |
| serial | No | Android, HarmonyOS, or Vega VVD serial selector. | |
| target | No | Alias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element. | |
| tenant | No | Remote tenant identifier. | |
| leaseId | No | Existing lease identifier. | |
| message | No | ||
| restart | No | ||
| session | No | Agent-device session name. | |
| platform | No | Platform selector used to resolve a device. | |
| includeCost | No | Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged. | |
| deviceTarget | No | Device target form. Maps to the CLI --target flag. | |
| responseLevel | No | Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged. | |
| mcpOutputFormat | No | MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately. | |
| androidDeviceAllowlist | No | Android serial allowlist used for device resolution. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden for behavioral transparency. It does disclose one useful behavior ('Times out after 90s'), but it does not mention side effects of start/stop/clear, whether operations mutate session state, what diagnostics and markers produce, or any permissions or environmental requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loads the core purpose, with the timeout disclosure placed at the end. The telegraphic phrasing 'Session app log info, start/stop streaming, diagnostics, and markers' is slightly fragmented but contains no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 18-parameter tool with no annotations and no output schema, this description is far too thin. It does not explain how actions like start, stop, mark, or clear behave, what output format is expected, or how the many optional parameters should be used together. The schema helps with parameter names but not with overall invocation strategy.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is high (83%), so the baseline is 3 even without additional parameter details. The description's action terms (start/stop streaming, diagnostics, markers) loosely map to the action enum, but it does not meaningfully clarify parameter relationships or add semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies the resource ('session app log') and lists the main operations (log info, start/stop streaming, diagnostics, markers), which is enough to understand the tool's general purpose. It falls short of a crisp verb+resource phrasing like 'Manage session app logs' and does not explicitly distinguish itself from siblings such as events or record.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit guidance on when to use this tool versus alternatives like events, record, or debug. The description implies it is for session app log operations, but it provides no context about prerequisites, when not to use it, or how it should be selected among the many sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
longpressA
Hold a UI target by snapshot ref, selector, or coordinates to open a context menu or perform another hold gesture. Set durationMs when the default hold duration is unsuitable. Times out after 210s; a caller-supplied budget extends it.
| Name | Required | Description | Default |
|---|---|---|---|
| raw | No | Use raw snapshot data during selector resolution. | |
| udid | No | Apple device or simulator UDID; the selector that pins one device when several share a name. | |
| debug | No | Enable debug diagnostics. | |
| depth | No | Snapshot traversal depth. | |
| runId | No | Lease run identifier. | |
| scope | No | Snapshot scope selector used before resolution. | |
| device | No | Device name selector (a UDID belongs in udid, a serial in serial). | |
| serial | No | Android, HarmonyOS, or Vega VVD serial selector. | |
| settle | No | After the action, wait for the UI to go quiet and return the settled diff vs the pre-action tree in the same response. Best-effort; never fails the action. | |
| target | Yes | UI target. This is separate from deviceTarget, which selects the device form. | |
| tenant | No | Remote tenant identifier. | |
| leaseId | No | Existing lease identifier. | |
| session | No | Agent-device session name. | |
| noRecord | No | Do not record this action. | |
| platform | No | Platform selector used to resolve a device. | |
| timeoutMs | No | Settle: wait deadline in milliseconds (default 10000). | |
| durationMs | No | Long press duration in milliseconds. | |
| includeCost | No | Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged. | |
| deviceTarget | No | Device target form. Maps to the CLI --target flag. | |
| responseLevel | No | Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged. | |
| settleQuietMs | No | Settle: quiet window in milliseconds (default 500). | |
| mcpOutputFormat | No | MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately. | |
| androidDeviceAllowlist | No | Android serial allowlist used for device resolution. |
Output Schema
| Name | Required | Description |
|---|---|---|
| x | No | Resolved interaction x coordinate when available. |
| y | No | Resolved interaction y coordinate when available. |
| ref | No | Snapshot ref without the @ prefix when the target was an @ref. |
| cost | No | |
| hint | No | |
| settle | No | |
| gesture | No | |
| message | No | |
| warning | No | |
| evidence | No | |
| refLabel | No | |
| selector | No | Selector expression when the target was a selector. |
| durationMs | No | |
| resolution | No | Pre-action disclosure of how the acting path resolved its target. Absent when resolutionDisclosure is inapplicable for the path. |
| targetKind | Yes | Resolved interaction target kind. |
| selectorChain | No | |
| referenceWidth | No | Reference frame width for visualizing the interaction point. |
| targetHittable | No | |
| referenceHeight | No | Reference frame height for visualizing the interaction point. |
| maestroFallbackReason | No | |
| maestroNonHittableCoordinateFallbackUsed | No | Whether the direct iOS Maestro coordinate fallback was actually used. |
| maestroNonHittableCoordinateFallbackAllowed | No | Whether the direct iOS Maestro coordinate fallback was allowed for this selector. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
It discloses that it performs a hold gesture, mentions the 210s timeout, and notes that a caller-supplied budget can extend it. It doesn't mention side effects like screen recording or failure behavior, but the core action is clear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, dense and to the point. No fluff or redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema exists, the description doesn't need to detail return values. It covers the essential behavior, timeout, and a brief usage hint, making it sufficiently complete for an agent to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema descriptions already cover all parameters at 100%. The description adds context for durationMs (default hold duration unsuitable) and the timeout, but does not add significant meaning beyond what the parameter descriptions already provide.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action: hold a UI target via ref, selector, or point to open a context menu or perform a hold gesture. It uses a specific verb and resource, and distinguishes itself from siblings like click, press, and swipe.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains when to use it (open context menu or hold gesture) and mentions durationMs for custom hold times. It doesn't explicitly contrast with alternatives like press or click, but the context is sufficient for an agent to decide.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
metroB
Prepare a React Native development server or ask connected apps to reload, using the development server this session is bound to. Provide explicit runtime inputs only to override that binding for one call. The binding is cleared when the session closes, and a fresh open without runtime hints also clears any leftover binding from a previous same-name session. Times out after 90s.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | ||
| port | No | ||
| udid | No | Apple device or simulator UDID; the selector that pins one device when several share a name. | |
| debug | No | Enable debug diagnostics. | |
| runId | No | Lease run identifier. | |
| action | Yes | ||
| device | No | Device name selector (a UDID belongs in udid, a serial in serial). | |
| serial | No | Android, HarmonyOS, or Vega VVD serial selector. | |
| target | No | Alias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element. | |
| tenant | No | Remote tenant identifier. | |
| leaseId | No | Existing lease identifier. | |
| logPath | No | ||
| session | No | Agent-device session name. | |
| platform | No | Platform selector used to resolve a device. | |
| bundleUrl | No | ||
| launchUrl | No | ||
| metroHost | No | ||
| metroPort | No | ||
| timeoutMs | No | ||
| listenHost | No | ||
| statusHost | No | ||
| bridgeScope | No | ||
| includeCost | No | Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged. | |
| projectRoot | No | ||
| deviceTarget | No | Device target form. Maps to the CLI --target flag. | |
| publicBaseUrl | No | ||
| responseLevel | No | Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged. | |
| reuseExisting | No | ||
| probeTimeoutMs | No | ||
| mcpOutputFormat | No | MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately. | |
| runtimeFilePath | No | ||
| startupTimeoutMs | No | ||
| androidDeviceAllowlist | No | Android serial allowlist used for device resolution. | |
| installDependenciesIfNeeded | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It does disclose the binding lifecycle, the 90s timeout, and the override mechanism, which adds value. However, it omits details about side effects, error behavior, or what happens to existing server state, so it is only partially transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded with the core purpose, followed by the key binding rules and timeout. It is efficient with no redundant sentences, though the density of information might require careful reading.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 34 parameters, no output schema, and nested objects, the description is incomplete. It does not explain what the tool returns, the difference between 'prepare' and 'reload' beyond names, or how the many parameters interact. An agent would need to inspect the schema for many fields, but even that is insufficient for undocumented ones.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 44% (low), and the description does not compensate. It only mentions that runtime inputs override the binding, but does not explain the meaning or usage of the many undocumented parameters (e.g., kind, port, bundleUrl, projectRoot). The general note is too vague to help an agent understand which parameters are relevant for each action.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the two actions (prepare a React Native development server or reload connected apps) and identifies the resource (the development server bound to the session). It is specific about the verb and resource, though it does not explicitly differentiate from sibling tools like 'react-native' which might overlap, so it loses a point for missing sibling distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear guidance on when to use the tool: it uses the session-bound dev server, and explains how to override the binding with runtime inputs and the binding lifecycle (cleared on session close or fresh open). It does not explicitly mention alternatives or when not to use it, but the context is sufficient for an agent to decide.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
networkB
Dump recent HTTP(s) traffic parsed from the session app log Times out after 90s.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | No | Apple device or simulator UDID; the selector that pins one device when several share a name. | |
| debug | No | Enable debug diagnostics. | |
| limit | No | ||
| runId | No | Lease run identifier. | |
| action | No | ||
| device | No | Device name selector (a UDID belongs in udid, a serial in serial). | |
| serial | No | Android, HarmonyOS, or Vega VVD serial selector. | |
| target | No | Alias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element. | |
| tenant | No | Remote tenant identifier. | |
| include | No | ||
| leaseId | No | Existing lease identifier. | |
| session | No | Agent-device session name. | |
| platform | No | Platform selector used to resolve a device. | |
| includeCost | No | Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged. | |
| deviceTarget | No | Device target form. Maps to the CLI --target flag. | |
| responseLevel | No | Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged. | |
| mcpOutputFormat | No | MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately. | |
| androidDeviceAllowlist | No | Android serial allowlist used for device resolution. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It mentions the timeout and that traffic is parsed from logs, implying read-only behavior, but does not disclose side effects, resource usage, or exact output behavior beyond 'dump'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with an appended timeout note, conveying the core purpose without extraneous detail. It is tightly focused and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema and the description does not explain return formats, structured content, or how the many parameters combine. While the purpose is clear, the tool context is incomplete for an agent needing to know what output to expect or how to choose options.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 83% and most parameters have meaningful descriptions explaining aliases, enums, defaults, and resolution behavior. A few parameters like 'limit' and 'include' lack descriptions, but the overall parameter semantics are well clarified.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool dumps recent HTTP(S) traffic parsed from the session app log, using the specific verb 'Dump' and naming the resource and source. This distinguishes it from generic log retrieval tools like 'logs'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives such as 'logs' or 'perf'. It does not mention prerequisites, conditions, or scenarios where this should be preferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
openA
Boot the selected device when needed, then open an app, deep link, or URL in a session. Use the app or URL inputs to choose what becomes the foreground automation target. Metro and debug runtime hints given here are recorded as the session's dev-server binding, so a later reload reuses them; a fresh open without them clears any binding left by a previous same-name session. Times out after 90s; a caller-supplied budget extends it.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | App name, bundle id, package, or URL. | |
| url | No | Optional URL passed with an app shell. | |
| udid | No | Apple device or simulator UDID; the selector that pins one device when several share a name. | |
| debug | No | Enable debug diagnostics. | |
| force | No | Overwrite an existing --save-script target instead of refusing (alias: --overwrite). | |
| runId | No | Lease run identifier. | |
| device | No | Device name selector (a UDID belongs in udid, a serial in serial). | |
| serial | No | Android, HarmonyOS, or Vega VVD serial selector. | |
| target | No | Alias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element. | |
| tenant | No | Remote tenant identifier. | |
| leaseId | No | Existing lease identifier. | |
| session | No | Agent-device session name. | |
| surface | No | macOS presentation surface to open: the app itself, the frontmost app, the desktop, or the menu bar. | |
| testIme | No | Activate the headless Android test IME for deterministic Unicode text entry (default on for emulators; opt-in on real devices). | |
| activity | No | Android activity name. | |
| noRecord | No | Do not record this action. | |
| platform | No | Platform selector used to resolve a device. | |
| relaunch | No | Force relaunch. | |
| bundleUrl | No | Session-scoped bundle URL hint applied to the opened app. | |
| deviceHub | No | Use Xcode Device Hub when surfacing Apple simulators. | |
| launchUrl | No | Session-scoped launch URL hint applied to the opened app. | |
| metroHost | No | Session-scoped Metro/debug host hint applied to the opened app. | |
| metroPort | No | Session-scoped Metro/debug port hint applied to the opened app. On an emulator/simulator the host defaults to the loopback alias (Android 10.0.2.2, iOS 127.0.0.1) when --metro-host is omitted; physical devices still require an explicit --metro-host. | |
| timeoutMs | No | Startup budget in milliseconds. Bounds the Simulator boot wait, so a never-booted Simulator can finish its first-boot migration; omit for the default startup behavior. | |
| foreground | No | Include an initial interactive snapshot in a fresh open response. With no app argument, discover the sole running app on the sole booted iOS simulator; ambiguous environments fail closed. | |
| launchArgs | No | Launch arguments forwarded verbatim to the platform launch command. | |
| saveScript | No | ||
| includeCost | No | Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged. | |
| deviceTarget | No | Device target form. Maps to the CLI --target flag. | |
| launchConsole | No | Launch console mode. | |
| responseLevel | No | Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged. | |
| mcpOutputFormat | No | MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately. | |
| androidDeviceAllowlist | No | Android serial allowlist used for device resolution. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the transparency burden and does disclose meaningful behavior: it may boot the device, it records Metro/debug hints as a session dev-server binding, a fresh open without those hints clears a previous same-name session binding, and it times out after 90 seconds unless a caller-supplied budget extends it. This goes well beyond restating the tool's function, though it does not cover all possible side effects or failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences with no filler. The main action is front-loaded, followed by the session-binding behavior and timeout rule, and every sentence contributes information the schema does not already provide.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 33 parameters and no output schema or annotations, the description covers the essential top-level workflow, the most surprising stateful behavior (binding persistence/clearing), and the timeout boundary. It does not describe response details or the many device-selector interactions, but the parameter schema already documents those in depth, so this is a reasonably complete high-level context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 97%, so the baseline is 3, and the description adds extra meaning by linking the app/url inputs to the foreground target concept, explaining that Metro/debug hints become session bindings, and noting that timeoutMs is a caller-supplied budget. This supplements the schema without duplicating it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource: boot the selected device when needed, then open an app, deep link, or URL in a session. It also clarifies the intended outcome (making something the foreground automation target), which separates it from siblings like boot, install, and snapshot.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context: use this tool to open an app, deep link, or URL and choose a foreground target, and it notes that device booting happens as needed. It does not explicitly name alternative tools or state when not to use it, but the intended scenario is unmistakable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
orientationB
Set device orientation on iOS and Android Times out after 90s.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | No | Apple device or simulator UDID; the selector that pins one device when several share a name. | |
| debug | No | Enable debug diagnostics. | |
| runId | No | Lease run identifier. | |
| device | No | Device name selector (a UDID belongs in udid, a serial in serial). | |
| serial | No | Android, HarmonyOS, or Vega VVD serial selector. | |
| target | No | Alias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element. | |
| tenant | No | Remote tenant identifier. | |
| leaseId | No | Existing lease identifier. | |
| session | No | Agent-device session name. | |
| noRecord | No | Do not record this action. | |
| platform | No | Platform selector used to resolve a device. | |
| includeCost | No | Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged. | |
| orientation | Yes | ||
| deviceTarget | No | Device target form. Maps to the CLI --target flag. | |
| responseLevel | No | Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged. | |
| mcpOutputFormat | No | MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately. | |
| androidDeviceAllowlist | No | Android serial allowlist used for device resolution. |
Output Schema
| Name | Required | Description |
|---|---|---|
| action | Yes | |
| message | Yes | |
| orientation | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral burden. It does disclose a useful operational detail: 'Times out after 90s.' It does not mention prerequisites such as an active device session, side effects on the device, or whether the orientation change is persistent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and mostly front-loaded, but the missing sentence boundary after 'Android' creates a run-on that can be misread as 'Android times out after 90s'. The content is useful, but the punctuation hurts clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 17-parameter command with one required field, the description communicates the core purpose and a key timeout behavior, and the schema covers the parameters. It omits caveats like device prerequisites, unsupported orientation combinations, or platform-specific limitations, leaving it at a minimally viable level.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 94%, so the schema documents the parameters thoroughly. The description adds no parameter-level meaning beyond what the schema already provides, which meets the baseline for this dimension.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly names the action ('Set device orientation') and the target platforms ('iOS and Android'), which is specific and actionable. It does not explicitly differentiate from sibling commands like viewport, but the function is still fairly unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The platform qualifier gives some context about where the tool applies, and the timeout hint implicitly warns that the call can block. However, it does not state when to prefer this tool over alternatives or provide when-not-to-use guidance, so usage guidance remains mostly implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
perfA
Collect frame health, memory diagnostics, and platform profiling artifacts with compact agent-readable summaries. For CPU profiles, start and stop write the raw artifact while report writes a compact summary; request the report when the task needs readable native CPU evidence. Profiling output is evidence only: compact state, artifact path, and size. Times out after 90s.
| Name | Required | Description | Default |
|---|---|---|---|
| out | No | Output artifact path. | |
| area | Yes | ||
| kind | No | ||
| udid | No | Apple device or simulator UDID; the selector that pins one device when several share a name. | |
| debug | No | Enable debug diagnostics. | |
| runId | No | Lease run identifier. | |
| action | No | ||
| device | No | Device name selector (a UDID belongs in udid, a serial in serial). | |
| serial | No | Android, HarmonyOS, or Vega VVD serial selector. | |
| target | No | Alias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element. | |
| tenant | No | Remote tenant identifier. | |
| leaseId | No | Existing lease identifier. | |
| session | No | Agent-device session name. | |
| subject | No | ||
| noRecord | No | Do not record this action. | |
| platform | No | Platform selector used to resolve a device. | |
| template | No | xctrace template name, for example Time Profiler. | |
| tracePath | No | Existing .trace path to report, defaults to the latest session trace. | |
| includeCost | No | Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged. | |
| deviceTarget | No | Device target form. Maps to the CLI --target flag. | |
| responseLevel | No | Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged. | |
| mcpOutputFormat | No | MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately. | |
| androidDeviceAllowlist | No | Android serial allowlist used for device resolution. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses the 90-second timeout, describes the output as 'evidence only' with 'compact state, artifact path, and size', and clarifies the behavior of start/stop vs report for CPU profiles. This goes beyond a minimal description, though it does not address side effects, permissions, or error conditions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, front-loaded with the primary purpose, then adding action-specific guidance and a timeout note. Every sentence contributes distinct information with no waste. It is compact and well-structured for an agent to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (23 parameters) and no output schema, the description covers the essential behavior: what it collects, the distinction between raw and summary artifacts, output shape, and the timeout. It relies on the schema for parameter details, which is reasonable given 83% coverage. It does not mention error handling or edge cases, but the information provided is sufficient for an agent to call it correctly in common cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 83%, so the schema already documents most parameters. The description adds value by explaining the action semantics (e.g., start/stop vs report behavior), which informs how parameters like 'action' and 'kind' are used. However, it does not elaborate on the many selector parameters (udid, serial, device), relying on the schema's existing descriptions. This is adequate given high coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Collect frame health, memory diagnostics, and platform profiling artifacts with compact agent-readable summaries.' It specifies the resource (profiling artifacts) and the action (collect). It distinguishes actions within the tool (start/stop vs report) but does not explicitly contrast with sibling tools like 'trace', so it stops short of full differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides some guidance on when to use the 'report' action ('request the report when the task needs readable native CPU evidence') and notes that start/stop write raw artifacts. However, it does not compare this tool to alternatives or state when to prefer 'perf' over a sibling like 'trace' or 'artifacts'. The guidance is limited to internal action selection, not tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pressA
Short-press a UI target by snapshot ref, selector, or coordinates. Use longpress instead when the target requires a context-menu or hold gesture. Times out after 90s; a caller-supplied budget extends it.
| Name | Required | Description | Default |
|---|---|---|---|
| raw | No | Use raw snapshot data during selector resolution. | |
| udid | No | Apple device or simulator UDID; the selector that pins one device when several share a name. | |
| count | No | Number of press/click repetitions. | |
| debug | No | Enable debug diagnostics. | |
| depth | No | Snapshot traversal depth. | |
| runId | No | Lease run identifier. | |
| scope | No | Snapshot scope selector used before resolution. | |
| device | No | Device name selector (a UDID belongs in udid, a serial in serial). | |
| holdMs | No | Hold duration for each action. | |
| serial | No | Android, HarmonyOS, or Vega VVD serial selector. | |
| settle | No | After the action, wait for the UI to go quiet and return the settled diff vs the pre-action tree in the same response. Best-effort; never fails the action. | |
| target | Yes | UI target. This is separate from deviceTarget, which selects the device form. | |
| tenant | No | Remote tenant identifier. | |
| verify | No | Capture cheap post-action evidence (AX digest, node counts, changedFromBefore) instead of a follow-up snapshot. | |
| leaseId | No | Existing lease identifier. | |
| session | No | Agent-device session name. | |
| jitterPx | No | Randomization radius in pixels. | |
| noRecord | No | Do not record this action. | |
| platform | No | Platform selector used to resolve a device. | |
| doubleTap | No | Request a double-tap action. | |
| timeoutMs | No | Settle: wait deadline in milliseconds (default 10000). | |
| intervalMs | No | Delay between repeated press/click actions. | |
| includeCost | No | Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged. | |
| deviceTarget | No | Device target form. Maps to the CLI --target flag. | |
| responseLevel | No | Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged. | |
| settleQuietMs | No | Settle: quiet window in milliseconds (default 500). | |
| mcpOutputFormat | No | MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately. | |
| androidDeviceAllowlist | No | Android serial allowlist used for device resolution. |
Output Schema
| Name | Required | Description |
|---|---|---|
| x | No | Resolved interaction x coordinate when available. |
| y | No | Resolved interaction y coordinate when available. |
| ref | No | Snapshot ref without the @ prefix when the target was an @ref. |
| cost | No | |
| hint | No | |
| count | No | Number of press/click repetitions. |
| button | No | |
| holdMs | No | Hold duration for each action. |
| settle | No | |
| message | No | |
| warning | No | |
| evidence | No | |
| jitterPx | No | Randomization radius in pixels. |
| refLabel | No | |
| selector | No | Selector expression when the target was a selector. |
| doubleTap | No | Whether the command requested a double-tap action. |
| intervalMs | No | Delay between repeated press/click actions. |
| resolution | No | Pre-action disclosure of how the acting path resolved its target. Absent when resolutionDisclosure is inapplicable for the path. |
| targetKind | Yes | Resolved interaction target kind. |
| selectorChain | No | |
| referenceWidth | No | Reference frame width for visualizing the interaction point. |
| targetHittable | No | |
| referenceHeight | No | Reference frame height for visualizing the interaction point. |
| maestroFallbackReason | No | |
| maestroNonHittableCoordinateFallbackUsed | No | Whether the direct iOS Maestro coordinate fallback was actually used. |
| maestroNonHittableCoordinateFallbackAllowed | No | Whether the direct iOS Maestro coordinate fallback was allowed for this selector. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description must carry the full burden of behavioral disclosure. It only mentions a 90-second timeout and that a caller-supplied budget extends it. It does not disclose side effects of a press (e.g., navigation, state changes), failure behavior when the target is not found, or any post-action waiting/settling behavior. This is thin for an interactive UI tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with zero fluff. The primary action and target forms are front-loaded, followed by a precise alternative condition and a timeout note. Every word earns its place; it is a model of conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 28 parameters, 100% schema coverage, and an existing output schema, the description does not need to explain return values. It covers the core usage, timeout, and the key alternative (longpress). It lacks broader context on when press should be preferred over click or other gestures, but for a single-action tool this is a minor gap. The essential calling information is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents every parameter. The description adds minimal extra meaning beyond mentioning that targets can be ref, selector, or coordinates—which is already in the schema. It does not clarify the relationship between timeoutMs and the stated 90s timeout, nor explain any of the more obscure parameters like jitterPx or includeCost. Baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool performs a short-press action on a UI target, and enumerates the three accepted target forms (snapshot ref, selector, coordinates). It explicitly distinguishes from the longpress sibling by naming the alternative and the condition that selects it (context-menu/hold gesture). This leaves no ambiguity about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit guidance to use longpress instead when a context-menu or hold gesture is needed, which is a clear when-not and alternative. It does not, however, mention other closely related siblings like click or tap, nor does it state any prerequisites (e.g., having a snapshot). It covers the most relevant alternative but not the full decision space.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pushA
Deliver push notification payloads to an installed app. Times out after 90s.
| Name | Required | Description | Default |
|---|---|---|---|
| app | Yes | ||
| udid | No | Apple device or simulator UDID; the selector that pins one device when several share a name. | |
| debug | No | Enable debug diagnostics. | |
| runId | No | Lease run identifier. | |
| device | No | Device name selector (a UDID belongs in udid, a serial in serial). | |
| serial | No | Android, HarmonyOS, or Vega VVD serial selector. | |
| target | No | Alias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element. | |
| tenant | No | Remote tenant identifier. | |
| leaseId | No | Existing lease identifier. | |
| payload | Yes | ||
| session | No | Agent-device session name. | |
| noRecord | No | Do not record this action. | |
| platform | No | Platform selector used to resolve a device. | |
| includeCost | No | Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged. | |
| deviceTarget | No | Device target form. Maps to the CLI --target flag. | |
| responseLevel | No | Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged. | |
| mcpOutputFormat | No | MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately. | |
| androidDeviceAllowlist | No | Android serial allowlist used for device resolution. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are attached, so the description must carry behavioral disclosure. It does provide a concrete operational constraint (90s timeout) and implies an installed-app prerequisite, which is useful. However, it doesn't disclose side effects on the device, permission/auth requirements, or failure behavior, so the burden is only partially met.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the operation and followed by the one critical constraint. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a very large schema (18 params) and no annotations, the description provides only the core action and timeout; it leaves side effects, usage context, and device-selection nuance to the schema. The rich schema and output schema offset some gaps, but the absence of any behavioral or usage context beyond the timeout makes the description only minimally complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is high (~89%), so the baseline is 3. The description names the two central concepts (app, payload) but adds no detail on payload shape or selector semantics; the schema already carries those details. Since app has no schema description and payload has only a type oneOf, a little more explicit parameter context would improve it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The sentence identifies a concrete operation ('Deliver push notification payloads') and a target ('an installed app'), so an agent can distinguish this push-notification tool from unrelated generic actions like install or click. No sibling tool appears to cover push notifications, so the description's specificity resolves the otherwise ambiguous name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance about when to choose push over alternatives or when not to use it. The description only states what it does and the timeout; the intended selection context is left to inference. With no comparable sibling, at least a note on prerequisites or when to use it would be needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
react-nativeA
Run supported React Native automation helpers. Use dismiss-overlay to close a visible development error overlay before continuing normal UI automation. Times out after 90s.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | No | Apple device or simulator UDID; the selector that pins one device when several share a name. | |
| debug | No | Enable debug diagnostics. | |
| runId | No | Lease run identifier. | |
| action | Yes | ||
| device | No | Device name selector (a UDID belongs in udid, a serial in serial). | |
| serial | No | Android, HarmonyOS, or Vega VVD serial selector. | |
| target | No | Alias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element. | |
| tenant | No | Remote tenant identifier. | |
| leaseId | No | Existing lease identifier. | |
| session | No | Agent-device session name. | |
| noRecord | No | Do not record this action. | |
| platform | No | Platform selector used to resolve a device. | |
| includeCost | No | Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged. | |
| deviceTarget | No | Device target form. Maps to the CLI --target flag. | |
| responseLevel | No | Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged. | |
| mcpOutputFormat | No | MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately. | |
| androidDeviceAllowlist | No | Android serial allowlist used for device resolution. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It adds a useful 90-second timeout and states the dismissal action, but it does not disclose side effects, prerequisites, or failure behavior. This is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded with the intended action and use case. The opening phrase 'Run supported React Native automation helpers' is somewhat generic, but the following sentence earns its place by giving concrete guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-action helper with no output schema and no annotations, the description covers when to use it and the timeout. It does not explain what response to expect or whether the action has side effects on app state, leaving some gaps for the agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 94%, so the schema already documents almost all parameters. The description clarifies the one meaningful parameter ('dismiss-overlay') beyond the raw enum list, but it adds no further parameter-level detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a concrete action ('dismiss-overlay'), its target ('development error overlay'), and a clear purpose ('before continuing normal UI automation'). It does not simply restate the tool name, and it distinguishes this React Native-specific helper from the generic sibling automation commands.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells the agent when to use the tool: when a visible development error overlay needs to be dismissed before continuing UI automation. It does not enumerate exclusions or direct the agent to an alternative, but the context is clear enough for the single supported action.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recordB
Start or stop a screen recording for the active app session or, where supported, the selected device. Long Android recordings can return multiple video artifacts; HarmonyOS supports whole-screen recording on physical devices. Times out after 90s.
| Name | Required | Description | Default |
|---|---|---|---|
| fps | No | ||
| path | No | ||
| udid | No | Apple device or simulator UDID; the selector that pins one device when several share a name. | |
| debug | No | Enable debug diagnostics. | |
| runId | No | Lease run identifier. | |
| action | Yes | ||
| device | No | Device name selector (a UDID belongs in udid, a serial in serial). | |
| serial | No | Android, HarmonyOS, or Vega VVD serial selector. | |
| target | No | Alias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element. | |
| tenant | No | Remote tenant identifier. | |
| leaseId | No | Existing lease identifier. | |
| quality | No | ||
| session | No | Agent-device session name. | |
| noRecord | No | Do not record this action. | |
| platform | No | Platform selector used to resolve a device. | |
| hideTouches | No | ||
| includeCost | No | Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged. | |
| deviceTarget | No | Device target form. Maps to the CLI --target flag. | |
| responseLevel | No | Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged. | |
| recordingScope | No | ||
| mcpOutputFormat | No | MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately. | |
| androidDeviceAllowlist | No | Android serial allowlist used for device resolution. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of behavioral disclosure. It adds valuable context: Android long recordings may produce multiple artifacts, HarmonyOS supports whole-screen recording on physical devices, and the operation times out after 90s. It does not cover artifact handling or permissions, but the key operational traits are disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences carry meaningful information: the core action, platform-specific caveats, and the timeout. It is front-loaded and every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the core behavior, platform caveats, and timeout, and an output schema exists so return values need not be described. However, for a tool with 22 parameters and no annotations, the description is thin on how the recording session, device selection, output path, and recording scope fit together.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds no parameter-level meaning beyond the schema, and schema coverage is 73%, leaving important parameters like fps, path, quality, and recordingScope undocumented. The platform caveats hint at behavior but do not clarify how the many device, session, and recording parameters should be used.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action and resource: 'start or stop a screen recording' for the active app session or selected device. It is distinct from still-image tools like screenshot, though it does not explicitly name an alternative sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit guidance on when to use this tool versus alternatives like screenshot or snapshot, beyond the inherent 'recording' framing. Platform caveats are mentioned, but no exclusions or alternative tool routing are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reinstallA
Replace an installed app with a binary from a local path. Use this when preserving the same app identity while installing a new build on the selected device. Times out after 180s.
| Name | Required | Description | Default |
|---|---|---|---|
| app | Yes | ||
| udid | No | Apple device or simulator UDID; the selector that pins one device when several share a name. | |
| debug | No | Enable debug diagnostics. | |
| runId | No | Lease run identifier. | |
| device | No | Device name selector (a UDID belongs in udid, a serial in serial). | |
| serial | No | Android, HarmonyOS, or Vega VVD serial selector. | |
| target | No | Alias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element. | |
| tenant | No | Remote tenant identifier. | |
| appPath | Yes | Path to app binary. | |
| leaseId | No | Existing lease identifier. | |
| session | No | Agent-device session name. | |
| noRecord | No | Do not record this action. | |
| platform | No | Platform selector used to resolve a device. | |
| includeCost | No | Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged. | |
| deviceTarget | No | Device target form. Maps to the CLI --target flag. | |
| responseLevel | No | Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged. | |
| mcpOutputFormat | No | MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately. | |
| androidDeviceAllowlist | No | Android serial allowlist used for device resolution. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the full burden. It discloses the core replacing behavior, the identity-preservation contract, and the 180s timeout. However, it does not explain prerequisites, whether app data is preserved, permission requirements, or what a successful response contains.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the action, then the key constraint and timeout. Every sentence earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The core operation is clearly described, but this is an 18-parameter mutation tool with no annotations and no output schema. The description does not cover selection prerequisites, behavioral side effects, or return expectations; it relies heavily on the schema for the rest.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 94%, so the schema carries most parameter meaning. The description adds useful context that app is the app identity and appPath is the local binary path, but it does not meaningfully enrich the many selector and response-control parameters already documented in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Replace'), the resource ('an installed app'), the source ('a binary from a local path'), and adds a distinguishing qualifier: preserving the same app identity while installing a new build. This clearly differentiates it from siblings like install and install-from-source.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use it: when preserving the same app identity while installing a new build on the selected device. It does not explicitly list when not to use it or name alternatives, but the usage context is clear enough for an agent to route correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
replayB
Run a recorded automation script, including compatible Maestro YAML flows. A script without a terminal close leaves its session active for subsequent automation. Times out after 90s; a caller-supplied budget extends it.
| Name | Required | Description | Default |
|---|---|---|---|
| env | No | ||
| path | Yes | ||
| udid | No | Apple device or simulator UDID; the selector that pins one device when several share a name. | |
| debug | No | Enable debug diagnostics. | |
| force | No | ||
| runId | No | Lease run identifier. | |
| device | No | Device name selector (a UDID belongs in udid, a serial in serial). | |
| serial | No | Android, HarmonyOS, or Vega VVD serial selector. | |
| target | No | Alias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element. | |
| tenant | No | Remote tenant identifier. | |
| update | No | ||
| backend | No | ||
| leaseId | No | Existing lease identifier. | |
| maestro | No | ||
| session | No | Agent-device session name. | |
| platform | No | Platform selector used to resolve a device. | |
| bundleUrl | No | Bundle URL hint inherited by replay-opened sessions. | |
| metroHost | No | Metro/debug host hint inherited by replay-opened sessions. | |
| metroPort | No | Metro/debug port hint inherited by replay-opened sessions. | |
| timeoutMs | No | Maximum wall-clock duration for the replay request. | |
| resumeFrom | No | ||
| saveScript | No | ||
| includeCost | No | Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged. | |
| keepSession | No | Leave the session active by suppressing exactly an authored terminal close in native .ad. | |
| deviceTarget | No | Device target form. Maps to the CLI --target flag. | |
| responseLevel | No | Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged. | |
| mcpOutputFormat | No | MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately. | |
| resumePlanDigest | No | ||
| androidDeviceAllowlist | No | Android serial allowlist used for device resolution. |
Output Schema
| Name | Required | Description |
|---|---|---|
| healed | Yes | |
| message | Yes | |
| session | Yes | |
| replayed | Yes | |
| artifactPaths | Yes | |
| sessionActive | Yes | True iff the session is still active — the script had no terminal close. |
| snapshotDiagnostics | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the full burden of behavioral disclosure. It does disclose two important behaviors: a script without a terminal close leaves its session active, and it times out after 90 seconds unless a budget is provided. However, it omits many other behavioral aspects such as side effects, error handling, or device interactions, which are relevant for a 29-parameter tool. It adds some transparency but is not comprehensive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three concise sentences that state the core purpose first, then a key behavioral nuance, and finally a timeout constraint. There is no fluff; every sentence earns its place, and the most important information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 29 parameters, the description is quite sparse. It covers the core action and two behaviors but gives no guidance on typical usage, which parameters are essential beyond the required path, or how the replay interacts with devices or sessions. The presence of an output schema covers return values, but the description lacks sufficient context to fully guide an agent on how to use this complex tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 69%, which is moderate. The description adds almost no parameter-level meaning; the only hint is 'a caller-supplied budget extends it,' which could map to timeoutMs but is not explicit. For a tool with 29 parameters, the description does not help disambiguate which parameters matter for typical use, and it does not compensate for the 31% of parameters without schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action (run) on a specific resource (a recorded automation script), and adds compatibility with Maestro YAML flows, making the purpose unambiguous. The verb and resource are clear, and the tool's role among siblings (e.g., record, test) is inferable from the name and description.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance on when to use replay versus alternatives like test or record, and provides no exclusions or conditions. It only states what the tool does, leaving the agent to infer usage from the name alone, which is insufficient for a complex tool with many siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
screenshotB
Capture a screenshot of the active app or web session. Choose the capture scope, density, size, or annotations through the corresponding input fields when needed. Times out after 90s.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | Output path. | |
| udid | No | Apple device or simulator UDID; the selector that pins one device when several share a name. | |
| debug | No | Enable debug diagnostics. | |
| runId | No | Lease run identifier. | |
| scale | No | Screenshot scale factor. | |
| cropOn | No | Selector expression; the capture is cropped to the frame the selector resolves on the same screen. | |
| device | No | Device name selector (a UDID belongs in udid, a serial in serial). | |
| serial | No | Android, HarmonyOS, or Vega VVD serial selector. | |
| target | No | Alias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element. | |
| tenant | No | Remote tenant identifier. | |
| leaseId | No | Existing lease identifier. | |
| session | No | Agent-device session name. | |
| surface | No | ||
| noRecord | No | Do not record this action. | |
| platform | No | Platform selector used to resolve a device. | |
| stabilize | No | ||
| fullscreen | No | ||
| includeCost | No | Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged. | |
| overlayRefs | No | ||
| deviceTarget | No | Device target form. Maps to the CLI --target flag. | |
| pixelDensity | No | Output screenshot pixel density in pixels per logical point. | |
| responseLevel | No | Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged. | |
| mcpOutputFormat | No | MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately. | |
| normalizeStatusBar | No | ||
| androidDeviceAllowlist | No | Android serial allowlist used for device resolution. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are absent, so the description carries full responsibility. It discloses a 90-second timeout, which is useful, but it does not explicitly state that the operation is read-only, what side effects occur (e.g., file creation at path), or what the return shape is. For a capture tool this is a moderate disclosure but not comprehensive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with purpose and ending with timeout. It is concise and readable, but the phrase 'capture scope, density, size, or annotations' is vague and could be more explicit without adding length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 25 parameters, no output schema, and no annotations, the description is far too brief. It does not explain what the tool returns (e.g., image path, metadata), how path is used, or how the various selectors (udid, serial, device, platform) work together. The timeout is the only behavioral note. This is inadequate for such a complex tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 80%, so baseline is 3. The description adds a little by mentioning 'capture scope, density, size, or annotations', which loosely maps to surface, pixelDensity, scale, and overlayRefs, but it does not explain any specific parameter semantics beyond what the schema already provides. It adds minimal value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Capture'), a clear resource ('screenshot of the active app or web session'), and mentions configurable aspects (scope, density, size, annotations). It clearly conveys what the tool does and is distinct from siblings like 'snapshot' or 'record'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance on when to use this tool versus alternatives. It does not mention when not to use it or any prerequisites. The phrase 'when needed' refers to input fields, not to choosing between tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scrollA
Scroll in a direction, or toward the top/bottom edge of scrollable content. The optional amount is the finger-path fraction of the viewport axis; the gesture releases with reduced momentum rather than stopping at an exact offset, so app scroll physics determine where content actually lands. Times out after 90s; a caller-supplied budget extends it.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | No | Apple device or simulator UDID; the selector that pins one device when several share a name. | |
| debug | No | Enable debug diagnostics. | |
| runId | No | Lease run identifier. | |
| amount | No | Platform scroll amount. | |
| device | No | Device name selector (a UDID belongs in udid, a serial in serial). | |
| pixels | No | Pixel scroll amount. | |
| serial | No | Android, HarmonyOS, or Vega VVD serial selector. | |
| settle | No | After the action, wait for the UI to go quiet and return the settled diff vs the pre-action tree in the same response. Best-effort; never fails the action. | |
| target | No | Alias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element. | |
| tenant | No | Remote tenant identifier. | |
| leaseId | No | Existing lease identifier. | |
| session | No | Agent-device session name. | |
| noRecord | No | Do not record this action. | |
| platform | No | Platform selector used to resolve a device. | |
| direction | Yes | ||
| timeoutMs | No | Settle: wait deadline in milliseconds (default 10000). | |
| durationMs | No | Scroll duration in milliseconds when the backend supports pacing. | |
| includeCost | No | Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged. | |
| deviceTarget | No | Device target form. Maps to the CLI --target flag. | |
| responseLevel | No | Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged. | |
| settleQuietMs | No | Settle: quiet window in milliseconds (default 500). | |
| mcpOutputFormat | No | MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately. | |
| androidDeviceAllowlist | No | Android serial allowlist used for device resolution. |
Output Schema
| Name | Required | Description |
|---|---|---|
| edge | No | |
| amount | No | |
| passes | No | Edge scrolls only: how many scroll-and-check passes ran. |
| pixels | No | |
| settle | No | |
| message | No | |
| direction | Yes | |
| durationMs | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the disclosure burden. It reveals important behavioral traits: the gesture releases with reduced momentum, actual landing is determined by app scroll physics, the action times out after 90 seconds, and a caller-supplied budget can extend it. This meaningfully exceeds a bare 'Scroll in a direction' statement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences cover the core behavior, the key physical nuance, and the timeout behavior without repetition or filler. The most important information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is adequate for a 23-parameter tool with a rich schema and an output schema, but it omits higher-level context about when scroll is the right tool compared to swipe or gesture, and it does not explain how 'amount' and 'pixels' relate. It is viable but has clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 96%, so the schema already documents nearly every parameter. The description adds useful semantics by explaining that 'amount' is a finger-path fraction of the viewport axis, but it does not clarify the relationship between 'amount' and 'pixels', which could still matter to an agent.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action (scroll) and a clear resource (scrollable content), and distinguishes between directional and edge-targeted scrolling. It is not merely a tautology, though it does not explicitly differentiate itself from the sibling 'swipe' tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use scroll versus alternatives like swipe or gesture. The opening clause implies scrollable content, but no exclusions, prerequisites, or comparison with sibling tools are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sessionC
List active sessions, print the effective daemon state directory, or publish an armed open-to-destination script without closing its session Times out after 90s.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | Optional .ad output path for save-script. | |
| udid | No | Apple device or simulator UDID; the selector that pins one device when several share a name. | |
| debug | No | Enable debug diagnostics. | |
| force | No | Atomically replace an existing save-script target. | |
| runId | No | Lease run identifier. | |
| action | No | list shows active sessions; state-dir prints the daemon state directory; save-script publishes an armed recording without teardown. | |
| device | No | Device name selector (a UDID belongs in udid, a serial in serial). | |
| serial | No | Android, HarmonyOS, or Vega VVD serial selector. | |
| target | No | Alias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element. | |
| tenant | No | Remote tenant identifier. | |
| leaseId | No | Existing lease identifier. | |
| session | No | Agent-device session name. | |
| platform | No | Platform selector used to resolve a device. | |
| includeCost | No | Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged. | |
| deviceTarget | No | Device target form. Maps to the CLI --target flag. | |
| responseLevel | No | Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged. | |
| mcpOutputFormat | No | MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately. | |
| androidDeviceAllowlist | No | Android serial allowlist used for device resolution. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden. It does disclose two genuinely useful behavioral traits: the command times out after 90s, and save-script publishes without closing/tearing down the session. However, 'armed' is left undefined, side effects of publish are not stated, and the return shape of each action is undisclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loads the primary action, but it reads as a run-on with three operations crammed into one sentence. 'Times out after 90s' dangles at the end and ambiguously appears to modify 'session' rather than the command itself.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is an 18-parameter, zero-required, multi-action tool with no annotations and no output schema, so the description must do heavy lifting. It does not explain which selector parameters apply to which action, what 'armed' or 'open-to-destination' means, or what each action returns. The description is insufficient for reliable invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3 even with no parameter detail in the description. The description loosely rephrases the action enum's save-script semantics but adds no substantive meaning beyond the schema's per-parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names three distinct verb+resource operations: list active sessions, print the daemon state directory, and publish a save-script. This distinguishes the tool from the sibling list, none of which appear session/daemon-focused. However, the third operation is jargon-heavy ('armed open-to-destination script') and reads ambiguously, slightly weakening clarity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given for when to use this tool versus alternatives, nor when to choose one action over another. The sibling list offers no differentiation hints, and the description never mentions exclusions or prerequisites. The only routing signal is the action enum's per-value schema descriptions, which are brief.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
settingsB
Change supported operating-system settings, animation scales, appearance, or app permissions on the selected target. Platform support varies by setting and action. Times out after 90s.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | ||
| mode | No | ||
| udid | No | Apple device or simulator UDID; the selector that pins one device when several share a name. | |
| debug | No | Enable debug diagnostics. | |
| runId | No | Lease run identifier. | |
| state | Yes | ||
| device | No | Device name selector (a UDID belongs in udid, a serial in serial). | |
| serial | No | Android, HarmonyOS, or Vega VVD serial selector. | |
| target | No | Alias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element. | |
| tenant | No | Remote tenant identifier. | |
| leaseId | No | Existing lease identifier. | |
| session | No | Agent-device session name. | |
| setting | Yes | ||
| latitude | No | ||
| noRecord | No | Do not record this action. | |
| platform | No | Platform selector used to resolve a device. | |
| longitude | No | ||
| permission | No | ||
| includeCost | No | Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged. | |
| deviceTarget | No | Device target form. Maps to the CLI --target flag. | |
| responseLevel | No | Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged. | |
| mcpOutputFormat | No | MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately. | |
| androidDeviceAllowlist | No | Android serial allowlist used for device resolution. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavior disclosure. It does communicate the mutating nature ('Change'), platform-dependent behavior, and a 90-second timeout. It does not disclose reversibility, permission requirements, or behavior on unsupported settings.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no filler: purpose, platform caveat, and timeout are each useful and front-loaded. It earns its length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with 23 parameters, no annotations, and no output schema, this description is too thin. It lacks guidance on required parameter values, selector usage, error/timeout semantics, and expected response shape, leaving an agent to guess on the core setting/state pair.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only about 70%, and the required parameters 'setting' and 'state' plus 'permission' and 'mode' are undocumented. The description hints at value categories (animation scales, appearance, permissions) but does not explain what values/syntax the key parameters accept, so it does not compensate for the schema gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action ('Change') applied to a defined resource set ('operating-system settings, animation scales, appearance, or app permissions') on a selected target, which separates it from the many sibling interaction commands. It does not enumerate the exact supported setting strings or state required, so it stops short of full clarity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given on when to prefer this tool over alternatives or when not to use it. The only signal is the caveat that platform support varies by setting and action, which is a warning rather than a routing rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
shutdownC
Shutdown a selected simulator or emulator. Times out after 90s.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | No | Apple device or simulator UDID; the selector that pins one device when several share a name. | |
| debug | No | Enable debug diagnostics. | |
| runId | No | Lease run identifier. | |
| device | No | Device name selector (a UDID belongs in udid, a serial in serial). | |
| serial | No | Android, HarmonyOS, or Vega VVD serial selector. | |
| target | No | Alias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element. | |
| tenant | No | Remote tenant identifier. | |
| leaseId | No | Existing lease identifier. | |
| session | No | Agent-device session name. | |
| platform | No | Platform selector used to resolve a device. | |
| includeCost | No | Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged. | |
| deviceTarget | No | Device target form. Maps to the CLI --target flag. | |
| responseLevel | No | Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged. | |
| mcpOutputFormat | No | MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately. | |
| androidDeviceAllowlist | No | Android serial allowlist used for device resolution. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Stable device id. |
| kind | Yes | |
| device | Yes | Human-readable device name. |
| target | Yes | |
| platform | Yes | |
| shutdown | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It does add a useful timeout fact ('Times out after 90s'), but it does not disclose that this is a destructive operation, what happens to the device's state, whether shutdown is graceful or forced, or what the agent should expect on timeout. This is a meaningful gap for a shutdown command.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short sentences with no filler. The primary action is front-loaded, and the timeout detail earns its place as a useful operational constraint. It is appropriately sized for a tool whose behavior is simple, even if the parameter surface is large.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 15 parameters, no annotations, and only a two-sentence description, the context is incomplete. Although the schema documents each parameter and an output schema exists, the description does not explain which selectors are relevant, how the 'selected' device is resolved, or what the shutdown operation entails beyond stopping. An agent would likely need to inspect many sibling tools and parameter descriptions to use it confidently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already documents all 15 parameters in detail. The description itself adds no parameter-level meaning, such as which selector (udid, device, serial, platform) is preferred or how to identify the target. Per the baseline rule for high coverage, a 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Shutdown') and a clear resource ('a selected simulator or emulator'), which makes the core action immediately understandable. It does not explicitly differentiate from siblings like 'close' or 'boot', but the action is distinct enough that a well-informed agent can infer the intent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance about when to use shutdown instead of sibling tools such as 'close', 'boot', or 'session'. The phrase 'selected simulator or emulator' implies there is a selection mechanism, but it never explains how the agent should choose this tool over alternatives or under what conditions shutdown is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
snapshotA
Capture the accessibility tree or compare it with the previous session baseline. Use the returned refs for subsequent semantic interactions and the diff option to verify UI changes. Times out after 90s; a caller-supplied budget extends it.
| Name | Required | Description | Default |
|---|---|---|---|
| raw | No | ||
| udid | No | Apple device or simulator UDID; the selector that pins one device when several share a name. | |
| debug | No | Enable debug diagnostics. | |
| depth | No | ||
| runId | No | Lease run identifier. | |
| scope | No | ||
| device | No | Device name selector (a UDID belongs in udid, a serial in serial). | |
| record | No | Force-record this out-of-band observation into a repair-armed heal (mutually exclusive with noRecord). Authored replay steps are recorded automatically and never need this. | |
| serial | No | Android, HarmonyOS, or Vega VVD serial selector. | |
| target | No | Alias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element. | |
| tenant | No | Remote tenant identifier. | |
| leaseId | No | Existing lease identifier. | |
| session | No | Agent-device session name. | |
| noRecord | No | Do not record this action. | |
| platform | No | Platform selector used to resolve a device. | |
| forceFull | No | ||
| timeoutMs | No | Maximum wall-clock time for the snapshot command. | |
| includeCost | No | Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged. | |
| deviceTarget | No | Device target form. Maps to the CLI --target flag. | |
| customActions | No | Name the affordances an element merged away (iOS UIAccessibilityCustomAction, React Native accessibilityActions) — a card whose reply/options controls are not separate elements still lists them here. The names are for PLANNING, not invocation: there is no API to trigger them, so reach the affordance through the element detail screen, through the same control exposed as a labeled element elsewhere, or by coordinates from its rect. iOS simulator only; costs one accessibility round trip per merged element. | |
| responseLevel | No | Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged. | |
| interactiveOnly | No | ||
| mcpOutputFormat | No | MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately. | |
| androidDeviceAllowlist | No | Android serial allowlist used for device resolution. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral disclosure burden. It usefully discloses the 90s timeout and that a caller-supplied budget extends it, and implies a read-only capture. However, it does not explain recording side effects given the record/noRecord parameters, how the session baseline is created, or what 'caller-supplied budget' maps to in the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short, front-loaded with the primary action, and each sentence contributes useful information such as returned refs, diff usage, and timeout behavior. It loses a point because the 'or compare it with the previous session baseline' phrasing is dense and ambiguous rather than crisply structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a 24-parameter tool with no annotations and no output schema. The description covers the main purpose and timeout, but it does not explain the shape of the returned refs, what 'previous session baseline' means, or how the various selectors and recording options fit, leaving an agent without enough context to fully anticipate the response or side effects.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 79%, so most parameters are already documented in the input schema. The description adds only general context about returned refs, diff usage, and timeout extension; it does not clarify the remaining undocumented parameters or explicitly connect 'caller-supplied budget' to timeoutMs, so its marginal semantic contribution is limited.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a concrete verb and object: 'Capture the accessibility tree', and clarifies that the returned refs support subsequent semantic interactions. It is slightly ambiguous because 'or compare it with the previous session baseline' and 'the diff option' suggest snapshot itself may perform comparisons, while diff is a separate sibling tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives practical guidance: use the returned refs for later semantic interactions and use the diff option to verify UI changes. This helps an agent choose snapshot as the prerequisite for semantic interaction and points to diff as the comparison alternative, though it does not explicitly say when not to use snapshot.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
swipeB
Quick coordinate fling with optional repeat pattern. Times out after 90s.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Swipe end point. | |
| from | Yes | Swipe start point. | |
| udid | No | Apple device or simulator UDID; the selector that pins one device when several share a name. | |
| count | No | Number of swipe repetitions. | |
| debug | No | Enable debug diagnostics. | |
| runId | No | Lease run identifier. | |
| device | No | Device name selector (a UDID belongs in udid, a serial in serial). | |
| serial | No | Android, HarmonyOS, or Vega VVD serial selector. | |
| target | No | Alias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element. | |
| tenant | No | Remote tenant identifier. | |
| leaseId | No | Existing lease identifier. | |
| pattern | No | ||
| pauseMs | No | Pause between repeated swipes. | |
| session | No | Agent-device session name. | |
| noRecord | No | Do not record this action. | |
| platform | No | Platform selector used to resolve a device. | |
| includeCost | No | Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged. | |
| deviceTarget | No | Device target form. Maps to the CLI --target flag. | |
| responseLevel | No | Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged. | |
| mcpOutputFormat | No | MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately. | |
| androidDeviceAllowlist | No | Android serial allowlist used for device resolution. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full responsibility for revealing behavior. It discloses a 90s timeout and the possibility of repetition, but does not mention side effects like screen interaction, potential failures, or that it performs a touch gesture, which is central to its behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence that efficiently communicates the core action, repeatability, and timeout. No wasted words or redundant information; it is well-structured for quick parsing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite the tool having 21 parameters and nested objects, the description offers minimal context about the expected outcome or return value. The schema covers parameter details, but without an output schema or any mention of what the agent can expect (e.g., success/failure indication), the description alone is 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is high (95%) and parameters like from/to already have descriptions ('Swipe start point', 'Swipe end point'). The tool description adds little beyond a summary; it does not clarify ambiguous parameters like 'pattern' or 'count' beyond what the schema already provides, so it stays at the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('fling') and the resource (coordinates), clearly indicating a swipe gesture. It distinguishes itself from siblings like 'scroll' and 'click' by implying a quick coordinate-based movement, though it could be even more explicit about being a single swipe action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives (e.g., scroll, longpress, or gesture). It mentions optional repeat pattern and timeout but does not specify conditions or exclusions, leaving the agent to infer appropriate usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
testC
Run one or more replay scripts as a serial test suite Streams progress; no fixed client timeout.
| Name | Required | Description | Default |
|---|---|---|---|
| env | No | ||
| udid | No | Apple device or simulator UDID; the selector that pins one device when several share a name. | |
| debug | No | Enable debug diagnostics. | |
| paths | Yes | ||
| runId | No | Lease run identifier. | |
| device | No | Device name selector (a UDID belongs in udid, a serial in serial). | |
| serial | No | Android, HarmonyOS, or Vega VVD serial selector. | |
| target | No | Alias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element. | |
| tenant | No | Remote tenant identifier. | |
| update | No | ||
| backend | No | ||
| leaseId | No | Existing lease identifier. | |
| maestro | No | ||
| retries | No | ||
| session | No | Agent-device session name. | |
| failFast | No | ||
| platform | No | Platform selector used to resolve a device. | |
| shardAll | No | ||
| bundleUrl | No | Bundle URL hint inherited by each test session. | |
| metroHost | No | Metro/debug host hint inherited by each test session. | |
| metroPort | No | Metro/debug port hint inherited by each test session. | |
| timeoutMs | No | ||
| shardSplit | No | ||
| includeCost | No | Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged. | |
| recordVideo | No | ||
| artifactsDir | No | ||
| deviceTarget | No | Device target form. Maps to the CLI --target flag. | |
| responseLevel | No | Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged. | |
| mcpOutputFormat | No | MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately. | |
| androidDeviceAllowlist | No | Android serial allowlist used for device resolution. |
Output Schema
| Name | Required | Description |
|---|---|---|
| tests | Yes | |
| total | Yes | |
| failed | Yes | |
| notRun | Yes | |
| passed | Yes | |
| skipped | Yes | |
| executed | Yes | |
| failures | Yes | |
| durationMs | Yes | |
| snapshotDiagnostics | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses 'no fixed client timeout' and mentions streaming progress, but it fails to explain side effects, permissions, failure behavior, or what happens to artifacts. This is minimal disclosure for a test runner.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise but awkwardly phrased; 'Streams progress' reads as a fragment and lacks clarity. It front-loads the core action but could be more intelligible and structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 30 parameters and a complex serial execution model, the description is grossly incomplete. It does not explain the meaning of 'serial test suite', how paths are used, the operational context, or how it differs from replay. The output schema exists, but behavioral and usage context is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds no parameter-specific information beyond what the schema provides. With schema coverage at 60%, many parameters lack descriptions, and the description does not compensate. It only vaguely references 'replay scripts', which aligns with the 'paths' parameter but nothing else.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Run') and resource ('one or more replay scripts') and indicates a serial test suite, which distinguishes it from the 'replay' sibling. However, the phrasing 'Streams progress' is ambiguous and no explicit comparison to alternatives is given.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives like 'replay'. The phrase 'serial test suite' implies batch usage, but it never explicitly says to use 'replay' for a single script or mentions any prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
traceA
Start or stop trace-log capture and return the resulting artifact when capture ends. Use the same artifact path for the matching start and stop requests when an explicit path is required. Times out after 90s.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | ||
| udid | No | Apple device or simulator UDID; the selector that pins one device when several share a name. | |
| debug | No | Enable debug diagnostics. | |
| runId | No | Lease run identifier. | |
| action | Yes | ||
| device | No | Device name selector (a UDID belongs in udid, a serial in serial). | |
| serial | No | Android, HarmonyOS, or Vega VVD serial selector. | |
| target | No | Alias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element. | |
| tenant | No | Remote tenant identifier. | |
| leaseId | No | Existing lease identifier. | |
| session | No | Agent-device session name. | |
| noRecord | No | Do not record this action. | |
| platform | No | Platform selector used to resolve a device. | |
| includeCost | No | Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged. | |
| deviceTarget | No | Device target form. Maps to the CLI --target flag. | |
| responseLevel | No | Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged. | |
| mcpOutputFormat | No | MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately. | |
| androidDeviceAllowlist | No | Android serial allowlist used for device resolution. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral disclosure burden. It discloses that the tool returns the artifact when capture ends, that matching start/stop requests must use the same path when required, and that the operation times out after 90 seconds. It stops short of covering side effects or permission requirements, but the disclosed behaviors are concrete and useful.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences with no filler. The core action is front-loaded, the path-pairing constraint is stated clearly, and the timeout is a concise operational detail. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 18-parameter tool with an output schema and high parameter-level description coverage, the description covers the essential lifecycle: start or stop, artifact return, path matching, and timeout. It does not explain when to prefer this over siblings, but the output schema and parameter descriptions carry much of the remaining context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is high at 89%, so the schema already documents most parameters. The description adds meaningful semantics for the under-documented 'path' parameter by explaining that the same artifact path must be used for matching start and stop requests. This lifts it above the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: start/stop trace-log capture and return the artifact. It clearly identifies the tool's function without relying on the name 'trace' as a tautology, but it does not explicitly distinguish itself from sibling tools like record, logs, or perf.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides operational guidance for pairing start and stop requests with the same artifact path, but it gives no explicit guidance about when to choose this tool over alternatives. There is no mention of scenarios, exclusions, or comparison with sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
trigger-app-eventA
Ask the app to handle an app-defined automation or test event, with an optional structured payload. Call this only for event names and payload shapes the app documents. Times out after 90s.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | No | Apple device or simulator UDID; the selector that pins one device when several share a name. | |
| debug | No | Enable debug diagnostics. | |
| event | Yes | Name of an app-defined automation or test event the app documents. | |
| runId | No | Lease run identifier. | |
| device | No | Device name selector (a UDID belongs in udid, a serial in serial). | |
| serial | No | Android, HarmonyOS, or Vega VVD serial selector. | |
| target | No | Alias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element. | |
| tenant | No | Remote tenant identifier. | |
| leaseId | No | Existing lease identifier. | |
| payload | No | Structured payload passed to the event, in the shape the app documents for it. | |
| session | No | Agent-device session name. | |
| noRecord | No | Do not record this action. | |
| platform | No | Platform selector used to resolve a device. | |
| includeCost | No | Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged. | |
| deviceTarget | No | Device target form. Maps to the CLI --target flag. | |
| responseLevel | No | Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged. | |
| mcpOutputFormat | No | MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately. | |
| androidDeviceAllowlist | No | Android serial allowlist used for device resolution. |
Output Schema
| Name | Required | Description |
|---|---|---|
| event | Yes | |
| message | Yes | |
| eventUrl | Yes | |
| transport | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It discloses the 90-second timeout and the optional structured payload, but it does not say whether triggering the event can mutate app state, require authentication, or produce side effects. For an app-defined trigger command, this is a significant transparency gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, under 30 words, and front-loads the core action and the critical documentation constraint. The timeout is a useful closing detail with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The schema and output schema already carry substantial parameter and return-value detail. The description adds the app-documentation precondition and timeout, but it remains thin on side effects and how this relates to sibling event-related tools. It is adequate but not fully complete for a tool with 18 parameters and no annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and every parameter has a clear description. The description's mention of event names and payload shapes mostly echoes the schema entries for event and payload rather than adding new meaning. The baseline of 3 applies because the schema already documents parameters thoroughly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete action: ask the app to handle an app-defined automation or test event with an optional structured payload. The description clearly identifies the resource and the condition that event names be app-documented. It does not explicitly contrast with sibling tools like events or test, so it falls just short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Call this only for event names and payload shapes the app documents' provides an explicit precondition for correct use. However, it does not name alternatives or describe when to prefer a sibling tool, so it provides clear context rather than full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tv-remoteA
Press or long-press a TV remote or D-pad button on Android TV, tvOS, or Vega OS. Choose the button and optional hold duration through the input fields. The aliases ok, center, and enter all map to select. Times out after 90s.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | No | Apple device or simulator UDID; the selector that pins one device when several share a name. | |
| debug | No | Enable debug diagnostics. | |
| runId | No | Lease run identifier. | |
| button | Yes | ||
| device | No | Device name selector (a UDID belongs in udid, a serial in serial). | |
| serial | No | Android, HarmonyOS, or Vega VVD serial selector. | |
| target | No | Alias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element. | |
| tenant | No | Remote tenant identifier. | |
| leaseId | No | Existing lease identifier. | |
| session | No | Agent-device session name. | |
| noRecord | No | Do not record this action. | |
| platform | No | Platform selector used to resolve a device. | |
| durationMs | No | Press duration in milliseconds. tvOS and Vega OS use the exact hold duration; Android TV maps any positive value to an ADB longpress (longpress). | |
| includeCost | No | Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged. | |
| deviceTarget | No | Device target form. Maps to the CLI --target flag. | |
| responseLevel | No | Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged. | |
| mcpOutputFormat | No | MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately. | |
| androidDeviceAllowlist | No | Android serial allowlist used for device resolution. |
Output Schema
| Name | Required | Description |
|---|---|---|
| action | Yes | |
| button | Yes | |
| message | Yes | |
| durationMs | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. It discloses the timeout (90s), alias mapping (ok/center/enter → select), and the distinction between press and long-press via hold duration. This goes beyond a basic mutation hint, though it could additionally explain platform-specific duration behavior (already covered in the schema).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences each earn their place: the first defines the action and scope, the second points to the input fields, and the third provides essential behavioral facts (aliases and timeout). No filler or repetition of schema details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 18 parameters, the description cannot cover everything, but the schema covers 94% of parameters and an output schema exists. The description supplies the core operational context: action, platforms, aliases, and timeout. It does not mention device-resolution prerequisites, but those are documented in the schema selectors, so the description is sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is high (94%), so the baseline is 3. The description adds value beyond the schema by explaining that ok, center, and enter are aliases for select, which is not in the button enum description. It also frames durationMs as 'hold duration' in context, reinforcing the parameter's purpose.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('press or long-press') with a clear resource ('TV remote or D-pad button') and scopes it to specific platforms ('Android TV, tvOS, or Vega OS'). It also distinguishes itself from generic press/longpress siblings by focusing on TV remote controls and D-pad buttons.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context: use this tool when operating TV remote or D-pad buttons on Android TV, tvOS, or Vega OS. It does not explicitly say when to use an alternative like press or longpress, but the platform and button-type scoping makes the intended usage reasonably clear without needing exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
typeA
Append text to the currently focused input. Use fill when the existing field value should be replaced, and focus first when no input is active. Times out after 90s.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Text to type. | |
| udid | No | Apple device or simulator UDID; the selector that pins one device when several share a name. | |
| debug | No | Enable debug diagnostics. | |
| runId | No | Lease run identifier. | |
| device | No | Device name selector (a UDID belongs in udid, a serial in serial). | |
| serial | No | Android, HarmonyOS, or Vega VVD serial selector. | |
| target | No | Alias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element. | |
| tenant | No | Remote tenant identifier. | |
| delayMs | No | Delay between typed characters. | |
| leaseId | No | Existing lease identifier. | |
| session | No | Agent-device session name. | |
| noRecord | No | Do not record this action. | |
| platform | No | Platform selector used to resolve a device. | |
| includeCost | No | Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged. | |
| deviceTarget | No | Device target form. Maps to the CLI --target flag. | |
| responseLevel | No | Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged. | |
| mcpOutputFormat | No | MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately. | |
| androidDeviceAllowlist | No | Android serial allowlist used for device resolution. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It reveals the append-not-replace semantics, the requirement for an already-active input, and the 90s timeout. It could go further (e.g., behavior when the input is not editable, whether characters are sent literally), but the key operational traits are present.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each contributing distinct value: the core action, the alternative routing, and the timeout constraint. It is front-loaded with the most decision-relevant information and contains zero filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an interaction command, the description covers the essential behaviors and alternatives. The 18-parameter schema is fully self-documenting, so the description need not repeat it. It lacks return value details, but with no output schema and a straightforward typing action, this is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline of 3 applies. The description does not add parameter-level nuance, but the only required parameter (text) is self-explanatory and the schema thoroughly covers the rest. No additional semantic value is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action (append text) on a clear resource (currently focused input), distinguishing itself from fill (replace) and focus (activate input). The verb 'append' and the contrast with sibling tools make its purpose unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly specifies when to use this tool ('currently focused input'), when to use alternatives ('use fill when the existing field value should be replaced'), and a prerequisite when no input is active ('focus first'). This leaves no ambiguity about tool selection among the type/fill/focus trio.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
viewportA
Resize the active web viewport before taking snapshots or screenshots. Useful for fixed-layout or 100vh apps where changing the viewport reveals different content. Times out after 90s.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | No | Apple device or simulator UDID; the selector that pins one device when several share a name. | |
| debug | No | Enable debug diagnostics. | |
| runId | No | Lease run identifier. | |
| width | Yes | Viewport width in CSS pixels. | |
| device | No | Device name selector (a UDID belongs in udid, a serial in serial). | |
| height | Yes | Viewport height in CSS pixels. | |
| serial | No | Android, HarmonyOS, or Vega VVD serial selector. | |
| target | No | Alias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element. | |
| tenant | No | Remote tenant identifier. | |
| leaseId | No | Existing lease identifier. | |
| session | No | Agent-device session name. | |
| noRecord | No | Do not record this action. | |
| platform | No | Platform selector used to resolve a device. | |
| includeCost | No | Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged. | |
| deviceTarget | No | Device target form. Maps to the CLI --target flag. | |
| responseLevel | No | Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged. | |
| mcpOutputFormat | No | MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately. | |
| androidDeviceAllowlist | No | Android serial allowlist used for device resolution. |
Output Schema
| Name | Required | Description |
|---|---|---|
| width | Yes | |
| height | Yes | |
| message | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the full burden. It discloses the 90-second timeout and that it targets the active web viewport, but it does not mention whether the resize persists, resets, or affects subsequent commands beyond the implied snapshot/screenshot use.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with no fluff. It front-loads the action and resource, adds a concrete use case, and ends with the timeout note; every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a straightforward resize tool with a rich input schema and an output schema, the description covers what, when, and the timeout. It could be more explicit about prerequisites such as being in a web context, but it is not seriously incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already documents all parameters. The description adds no extra meaning to width, height, or device selectors, keeping this at the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: "Resize the active web viewport". It also clarifies the intent ("before taking snapshots or screenshots"), which distinguishes it from capture-oriented siblings like screenshot and snapshot.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear when-to-use guidance: "Useful for fixed-layout or 100vh apps where changing the viewport reveals different content" and implies sequencing before snapshots/screenshots. It does not explicitly name alternatives or exclusions, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
waitA
Wait for a duration, text, snapshot ref, selector to appear, selector to be strictly absent, or stable UI. Use the strict absence target when zero selector matches are required; stable waits until the UI stays quiet for the requested window. Times out after 90s; a caller-supplied budget extends it.
| Name | Required | Description | Default |
|---|---|---|---|
| raw | No | ||
| ref | No | ||
| kind | No | ||
| text | No | ||
| udid | No | Apple device or simulator UDID; the selector that pins one device when several share a name. | |
| debug | No | Enable debug diagnostics. | |
| depth | No | ||
| runId | No | Lease run identifier. | |
| scope | No | ||
| absent | No | ||
| device | No | Device name selector (a UDID belongs in udid, a serial in serial). | |
| serial | No | Android, HarmonyOS, or Vega VVD serial selector. | |
| stable | No | ||
| target | No | Alias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element. | |
| tenant | No | Remote tenant identifier. | |
| leaseId | No | Existing lease identifier. | |
| quietMs | No | ||
| session | No | Agent-device session name. | |
| noRecord | No | Do not record this action. | |
| platform | No | Platform selector used to resolve a device. | |
| selector | No | ||
| timeoutMs | No | ||
| durationMs | No | ||
| includeCost | No | Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged. | |
| deviceTarget | No | Device target form. Maps to the CLI --target flag. | |
| responseLevel | No | Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged. | |
| mcpOutputFormat | No | MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately. | |
| androidDeviceAllowlist | No | Android serial allowlist used for device resolution. |
Output Schema
| Name | Required | Description |
|---|---|---|
| hint | No | |
| kind | No | |
| text | No | |
| warning | No | |
| captures | No | |
| selector | No | |
| waitedMs | Yes | |
| nodeCount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses a key behavioral limit: 'Times out after 90s; a caller-supplied timeout extends it.' It does not mention side effects, permissions, failure modes, or whether the operation is read-only, which is particularly relevant given no annotations are provided. Transparency is partial.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise—two sentences—and front-loads the primary purpose before providing usage nuances. It avoids unnecessary words and is well-structured, making it easy to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 28 parameters and complex behavior, the description covers the core waiting modes and timeout but omits many contextual details such as response formats, interaction with other parameters (like includeCost, responseLevel), and edge cases. It is adequate for a basic understanding 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds semantic context for a few parameters: 'strict absence target' clarifies the 'absent' selector, 'stable waits until the UI stays quiet' explains 'quietMs', and the timeout extension relates to 'timeoutMs'. However, many parameters (raw, ref, scope, runId, etc.) remain unexplained in both the schema and the description, leaving a significant semantic gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's action: 'Wait for a duration, text, snapshot ref, selector to appear, selector to be strictly absent, or stable UI.' This specifies the verb 'wait' and enumerates the distinct target conditions, making the purpose unambiguous. It does not explicitly name sibling tools, but the wait operation is distinct enough that no confusion arises.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides conditional guidance: 'Use the strict absence target when zero selector matches are required; stable waits until the UI stays quiet for the requested window,' and mentions the default timeout and extension. However, it does not advise when to choose this tool over alternatives (e.g., 'is' for immediate checks or polling manually), so usage direction is incomplete.
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.
56 tool updates
v0.21.0- Changed
alert3 fields changed- changed
Input schema / properties / device / descriptionPrevious value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)." - changed
Input schema / properties / serial / descriptionPrevious value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector." - changed
Input schema / properties / udid / descriptionPrevious value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
- Changed
app-switcher3 fields changed- changed
Input schema / properties / device / descriptionPrevious value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)." - changed
Input schema / properties / serial / descriptionPrevious value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector." - changed
Input schema / properties / udid / descriptionPrevious value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
- Changed
apps3 fields changed- changed
Input schema / properties / device / descriptionPrevious value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)." - changed
Input schema / properties / serial / descriptionPrevious value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector." - changed
Input schema / properties / udid / descriptionPrevious value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
- Changed
appstate3 fields changed- changed
Input schema / properties / device / descriptionPrevious value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)." - changed
Input schema / properties / serial / descriptionPrevious value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector." - changed
Input schema / properties / udid / descriptionPrevious value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
- Changed
artifacts3 fields changed- changed
Input schema / properties / device / descriptionPrevious value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)." - changed
Input schema / properties / serial / descriptionPrevious value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector." - changed
Input schema / properties / udid / descriptionPrevious value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
- Changed
audio3 fields changed- changed
Input schema / properties / device / descriptionPrevious value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)." - changed
Input schema / properties / serial / descriptionPrevious value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector." - changed
Input schema / properties / udid / descriptionPrevious value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
- Changed
back3 fields changed- changed
Input schema / properties / device / descriptionPrevious value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)." - changed
Input schema / properties / serial / descriptionPrevious value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector." - changed
Input schema / properties / udid / descriptionPrevious value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
- Changed
batch4 fields changed- changed
Input schema / properties / device / descriptionPrevious value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)." - changed
Input schema / properties / serial / descriptionPrevious value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector." - added
Input schema / properties / steps / items / properties / input / commandInputForAdded value: +"command" - changed
Input schema / properties / udid / descriptionPrevious value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
- Changed
boot3 fields changed- changed
Input schema / properties / device / descriptionPrevious value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)." - changed
Input schema / properties / serial / descriptionPrevious value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector." - changed
Input schema / properties / udid / descriptionPrevious value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
- Changed
capabilities3 fields changed- changed
Input schema / properties / device / descriptionPrevious value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)." - changed
Input schema / properties / serial / descriptionPrevious value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector." - changed
Input schema / properties / udid / descriptionPrevious value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
- Changed
click3 fields changed- changed
Input schema / properties / device / descriptionPrevious value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)." - changed
Input schema / properties / serial / descriptionPrevious value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector." - changed
Input schema / properties / udid / descriptionPrevious value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
- Changed
clipboard3 fields changed- changed
Input schema / properties / device / descriptionPrevious value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)." - changed
Input schema / properties / serial / descriptionPrevious value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector." - changed
Input schema / properties / udid / descriptionPrevious value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
- Changed
close3 fields changed- changed
Input schema / properties / device / descriptionPrevious value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)." - changed
Input schema / properties / serial / descriptionPrevious value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector." - changed
Input schema / properties / udid / descriptionPrevious value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
- Changed
debug3 fields changed- changed
Input schema / properties / device / descriptionPrevious value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)." - changed
Input schema / properties / serial / descriptionPrevious value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector." - changed
Input schema / properties / udid / descriptionPrevious value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
- Changed
devices3 fields changed- changed
Input schema / properties / device / descriptionPrevious value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)." - changed
Input schema / properties / serial / descriptionPrevious value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector." - changed
Input schema / properties / udid / descriptionPrevious value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
- Changed
diff3 fields changed- changed
Input schema / properties / device / descriptionPrevious value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)." - changed
Input schema / properties / serial / descriptionPrevious value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector." - changed
Input schema / properties / udid / descriptionPrevious value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
- Changed
doctor3 fields changed- changed
Input schema / properties / device / descriptionPrevious value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)." - changed
Input schema / properties / serial / descriptionPrevious value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector." - changed
Input schema / properties / udid / descriptionPrevious value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
- Changed
events3 fields changed- changed
Input schema / properties / device / descriptionPrevious value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)." - changed
Input schema / properties / serial / descriptionPrevious value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector." - changed
Input schema / properties / udid / descriptionPrevious value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
- Changed
fill4 fields changed- changed
Input schema / properties / device / descriptionPrevious value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)." - changed
Input schema / properties / serial / descriptionPrevious value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector." - changed
Input schema / properties / text / descriptionPrevious value: -"Text to enter into the target."New value: +"Text to enter into the target. Pass \"\" to clear it." - changed
Input schema / properties / udid / descriptionPrevious value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
- Changed
find3 fields changed- changed
Input schema / properties / device / descriptionPrevious value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)." - changed
Input schema / properties / serial / descriptionPrevious value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector." - changed
Input schema / properties / udid / descriptionPrevious value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
- Changed
focus3 fields changed- changed
Input schema / properties / device / descriptionPrevious value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)." - changed
Input schema / properties / serial / descriptionPrevious value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector." - changed
Input schema / properties / udid / descriptionPrevious value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
- Changed
gesture3 fields changed- changed
Input schema / properties / device / descriptionPrevious value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)." - changed
Input schema / properties / serial / descriptionPrevious value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector." - changed
Input schema / properties / udid / descriptionPrevious value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
- Changed
get3 fields changed- changed
Input schema / properties / device / descriptionPrevious value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)." - changed
Input schema / properties / serial / descriptionPrevious value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector." - changed
Input schema / properties / udid / descriptionPrevious value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
- Changed
home3 fields changed- changed
Input schema / properties / device / descriptionPrevious value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)." - changed
Input schema / properties / serial / descriptionPrevious value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector." - changed
Input schema / properties / udid / descriptionPrevious value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
- Changed
hover3 fields changed- changed
Input schema / properties / device / descriptionPrevious value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)." - changed
Input schema / properties / serial / descriptionPrevious value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector." - changed
Input schema / properties / udid / descriptionPrevious value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
- Changed
install3 fields changed- changed
Input schema / properties / device / descriptionPrevious value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)." - changed
Input schema / properties / serial / descriptionPrevious value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector." - changed
Input schema / properties / udid / descriptionPrevious value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
- Changed
install-from-source3 fields changed- changed
Input schema / properties / device / descriptionPrevious value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)." - changed
Input schema / properties / serial / descriptionPrevious value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector." - changed
Input schema / properties / udid / descriptionPrevious value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
- Changed
is4 fields changed- changed
Input schema / properties / device / descriptionPrevious value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)." - changed
Input schema / properties / predicate / enumPrevious value: -[ - "visible", - "hidden", - "exists", - "editable", - "selected", - "focused", - "text" -]New value: +[ + "visible", + "hidden", + "exists", + "absent", + "editable", + "selected", + "focused", + "text" +] - changed
Input schema / properties / serial / descriptionPrevious value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector." - changed
Input schema / properties / udid / descriptionPrevious value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
- Changed
keyboard3 fields changed- changed
Input schema / properties / device / descriptionPrevious value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)." - changed
Input schema / properties / serial / descriptionPrevious value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector." - changed
Input schema / properties / udid / descriptionPrevious value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
- Changed
logs3 fields changed- changed
Input schema / properties / device / descriptionPrevious value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)." - changed
Input schema / properties / serial / descriptionPrevious value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector." - changed
Input schema / properties / udid / descriptionPrevious value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
- Changed
longpress3 fields changed- changed
Input schema / properties / device / descriptionPrevious value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)." - changed
Input schema / properties / serial / descriptionPrevious value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector." - changed
Input schema / properties / udid / descriptionPrevious value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
- Changed
metro3 fields changed- changed
Input schema / properties / device / descriptionPrevious value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)." - changed
Input schema / properties / serial / descriptionPrevious value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector." - changed
Input schema / properties / udid / descriptionPrevious value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
- Changed
network3 fields changed- changed
Input schema / properties / device / descriptionPrevious value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)." - changed
Input schema / properties / serial / descriptionPrevious value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector." - changed
Input schema / properties / udid / descriptionPrevious value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
- Changed
open4 fields changed- changed
Input schema / properties / device / descriptionPrevious value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)." - changed
Input schema / properties / serial / descriptionPrevious value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector." - added
Input schema / properties / timeoutMsAdded value: +{ + "description": "Startup budget in milliseconds. Bounds the Simulator boot wait, so a never-booted Simulator can finish its first-boot migration; omit for the default startup behavior.", + "minimum": 1, + "type": "integer" +} - changed
Input schema / properties / udid / descriptionPrevious value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
- Changed
orientation3 fields changed- changed
Input schema / properties / device / descriptionPrevious value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)." - changed
Input schema / properties / serial / descriptionPrevious value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector." - changed
Input schema / properties / udid / descriptionPrevious value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
- Changed
perf3 fields changed- changed
Input schema / properties / device / descriptionPrevious value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)." - changed
Input schema / properties / serial / descriptionPrevious value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector." - changed
Input schema / properties / udid / descriptionPrevious value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
- Changed
press3 fields changed- changed
Input schema / properties / device / descriptionPrevious value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)." - changed
Input schema / properties / serial / descriptionPrevious value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector." - changed
Input schema / properties / udid / descriptionPrevious value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
- Changed
push3 fields changed- changed
Input schema / properties / device / descriptionPrevious value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)." - changed
Input schema / properties / serial / descriptionPrevious value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector." - changed
Input schema / properties / udid / descriptionPrevious value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
- Changed
react-native3 fields changed- changed
Input schema / properties / device / descriptionPrevious value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)." - changed
Input schema / properties / serial / descriptionPrevious value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector." - changed
Input schema / properties / udid / descriptionPrevious value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
- Changed
record3 fields changed- changed
Input schema / properties / device / descriptionPrevious value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)." - changed
Input schema / properties / serial / descriptionPrevious value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector." - changed
Input schema / properties / udid / descriptionPrevious value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
- Changed
reinstall3 fields changed- changed
Input schema / properties / device / descriptionPrevious value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)." - changed
Input schema / properties / serial / descriptionPrevious value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector." - changed
Input schema / properties / udid / descriptionPrevious value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
- Changed
replay3 fields changed- changed
Input schema / properties / device / descriptionPrevious value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)." - changed
Input schema / properties / serial / descriptionPrevious value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector." - changed
Input schema / properties / udid / descriptionPrevious value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
- Changed
screenshot4 fields changed- added
Input schema / properties / cropOnAdded value: +{ + "description": "Selector expression; the capture is cropped to the frame the selector resolves on the same screen.", + "type": "string" +} - changed
Input schema / properties / device / descriptionPrevious value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)." - changed
Input schema / properties / serial / descriptionPrevious value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector." - changed
Input schema / properties / udid / descriptionPrevious value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
- Changed
scroll3 fields changed- changed
Input schema / properties / device / descriptionPrevious value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)." - changed
Input schema / properties / serial / descriptionPrevious value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector." - changed
Input schema / properties / udid / descriptionPrevious value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
- Changed
session3 fields changed- changed
Input schema / properties / device / descriptionPrevious value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)." - changed
Input schema / properties / serial / descriptionPrevious value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector." - changed
Input schema / properties / udid / descriptionPrevious value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
- Changed
settings3 fields changed- changed
Input schema / properties / device / descriptionPrevious value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)." - changed
Input schema / properties / serial / descriptionPrevious value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector." - changed
Input schema / properties / udid / descriptionPrevious value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
- Changed
shutdown3 fields changed- changed
Input schema / properties / device / descriptionPrevious value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)." - changed
Input schema / properties / serial / descriptionPrevious value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector." - changed
Input schema / properties / udid / descriptionPrevious value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
- Changed
snapshot3 fields changed- changed
Input schema / properties / device / descriptionPrevious value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)." - changed
Input schema / properties / serial / descriptionPrevious value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector." - changed
Input schema / properties / udid / descriptionPrevious value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
- Changed
swipe3 fields changed- changed
Input schema / properties / device / descriptionPrevious value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)." - changed
Input schema / properties / serial / descriptionPrevious value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector." - changed
Input schema / properties / udid / descriptionPrevious value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
- Changed
test3 fields changed- changed
Input schema / properties / device / descriptionPrevious value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)." - changed
Input schema / properties / serial / descriptionPrevious value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector." - changed
Input schema / properties / udid / descriptionPrevious value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
- Changed
trace3 fields changed- changed
Input schema / properties / device / descriptionPrevious value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)." - changed
Input schema / properties / serial / descriptionPrevious value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector." - changed
Input schema / properties / udid / descriptionPrevious value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
- Changed
trigger-app-event3 fields changed- changed
Input schema / properties / device / descriptionPrevious value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)." - changed
Input schema / properties / serial / descriptionPrevious value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector." - changed
Input schema / properties / udid / descriptionPrevious value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
- Changed
tv-remote3 fields changed- changed
Input schema / properties / device / descriptionPrevious value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)." - changed
Input schema / properties / serial / descriptionPrevious value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector." - changed
Input schema / properties / udid / descriptionPrevious value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
- Changed
type3 fields changed- changed
Input schema / properties / device / descriptionPrevious value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)." - changed
Input schema / properties / serial / descriptionPrevious value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector." - changed
Input schema / properties / udid / descriptionPrevious value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
- Changed
viewport3 fields changed- changed
Input schema / properties / device / descriptionPrevious value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)." - changed
Input schema / properties / serial / descriptionPrevious value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector." - changed
Input schema / properties / udid / descriptionPrevious value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
- Changed
wait5 fields changed- added
Input schema / properties / absentAdded value: +{ + "type": "string" +} - changed
Input schema / properties / device / descriptionPrevious value: -"Device name selector."New value: +"Device name selector (a UDID belongs in udid, a serial in serial)." - changed
Input schema / properties / kind / enumPrevious value: -[ - "duration", - "text", - "ref", - "selector", - "stable" -]New value: +[ + "duration", + "text", + "ref", + "selector", + "absent", + "stable" +] - changed
Input schema / properties / serial / descriptionPrevious value: -"Android device or Vega VVD serial selector."New value: +"Android, HarmonyOS, or Vega VVD serial selector." - changed
Input schema / properties / udid / descriptionPrevious value: -"iOS device UDID selector."New value: +"Apple device or simulator UDID; the selector that pins one device when several share a name."
56 tool updates
v0.20.10- Changed
alert8 fields changed- removed
Input schema / properties / cwdRemoved value: -{ - "description": "Working directory for command execution.", - "type": "string" -} - removed
Input schema / properties / daemonAuthTokenRemoved value: -{ - "description": "Remote daemon auth token.", - "type": "string" -} - removed
Input schema / properties / daemonBaseUrlRemoved value: -{ - "description": "Remote daemon base URL.", - "type": "string" -} - removed
Input schema / properties / iosSimulatorDeviceSetRemoved value: -{ - "description": "iOS simulator device-set path used for device resolution.", - "type": "string" -} - removed
Input schema / properties / iosXctestDerivedDataPathRemoved value: -{ - "description": "Derived data path for external iOS XCTest runner execution.", - "type": "string" -} - removed
Input schema / properties / iosXctestEnvDirRemoved value: -{ - "description": "Writable directory for iOS XCTest runner env overlays.", - "type": "string" -} - removed
Input schema / properties / iosXctestrunFileRemoved value: -{ - "description": "Externally built iOS XCTest runner .xctestrun artifact path.", - "type": "string" -} - removed
Input schema / properties / stateDirRemoved value: -{ - "description": "Agent-device state directory.", - "type": "string" -}
- Changed
app-switcher8 fields changed- removed
Input schema / properties / cwdRemoved value: -{ - "description": "Working directory for command execution.", - "type": "string" -} - removed
Input schema / properties / daemonAuthTokenRemoved value: -{ - "description": "Remote daemon auth token.", - "type": "string" -} - removed
Input schema / properties / daemonBaseUrlRemoved value: -{ - "description": "Remote daemon base URL.", - "type": "string" -} - removed
Input schema / properties / iosSimulatorDeviceSetRemoved value: -{ - "description": "iOS simulator device-set path used for device resolution.", - "type": "string" -} - removed
Input schema / properties / iosXctestDerivedDataPathRemoved value: -{ - "description": "Derived data path for external iOS XCTest runner execution.", - "type": "string" -} - removed
Input schema / properties / iosXctestEnvDirRemoved value: -{ - "description": "Writable directory for iOS XCTest runner env overlays.", - "type": "string" -} - removed
Input schema / properties / iosXctestrunFileRemoved value: -{ - "description": "Externally built iOS XCTest runner .xctestrun artifact path.", - "type": "string" -} - removed
Input schema / properties / stateDirRemoved value: -{ - "description": "Agent-device state directory.", - "type": "string" -}
- Changed
apps8 fields changed- removed
Input schema / properties / cwdRemoved value: -{ - "description": "Working directory for command execution.", - "type": "string" -} - removed
Input schema / properties / daemonAuthTokenRemoved value: -{ - "description": "Remote daemon auth token.", - "type": "string" -} - removed
Input schema / properties / daemonBaseUrlRemoved value: -{ - "description": "Remote daemon base URL.", - "type": "string" -} - removed
Input schema / properties / iosSimulatorDeviceSetRemoved value: -{ - "description": "iOS simulator device-set path used for device resolution.", - "type": "string" -} - removed
Input schema / properties / iosXctestDerivedDataPathRemoved value: -{ - "description": "Derived data path for external iOS XCTest runner execution.", - "type": "string" -} - removed
Input schema / properties / iosXctestEnvDirRemoved value: -{ - "description": "Writable directory for iOS XCTest runner env overlays.", - "type": "string" -} - removed
Input schema / properties / iosXctestrunFileRemoved value: -{ - "description": "Externally built iOS XCTest runner .xctestrun artifact path.", - "type": "string" -} - removed
Input schema / properties / stateDirRemoved value: -{ - "description": "Agent-device state directory.", - "type": "string" -}
- Changed
appstate8 fields changed- removed
Input schema / properties / cwdRemoved value: -{ - "description": "Working directory for command execution.", - "type": "string" -} - removed
Input schema / properties / daemonAuthTokenRemoved value: -{ - "description": "Remote daemon auth token.", - "type": "string" -} - removed
Input schema / properties / daemonBaseUrlRemoved value: -{ - "description": "Remote daemon base URL.", - "type": "string" -} - removed
Input schema / properties / iosSimulatorDeviceSetRemoved value: -{ - "description": "iOS simulator device-set path used for device resolution.", - "type": "string" -} - removed
Input schema / properties / iosXctestDerivedDataPathRemoved value: -{ - "description": "Derived data path for external iOS XCTest runner execution.", - "type": "string" -} - removed
Input schema / properties / iosXctestEnvDirRemoved value: -{ - "description": "Writable directory for iOS XCTest runner env overlays.", - "type": "string" -} - removed
Input schema / properties / iosXctestrunFileRemoved value: -{ - "description": "Externally built iOS XCTest runner .xctestrun artifact path.", - "type": "string" -} - removed
Input schema / properties / stateDirRemoved value: -{ - "description": "Agent-device state directory.", - "type": "string" -}
- Changed
artifacts8 fields changed- removed
Input schema / properties / cwdRemoved value: -{ - "description": "Working directory for command execution.", - "type": "string" -} - removed
Input schema / properties / daemonAuthTokenRemoved value: -{ - "description": "Remote daemon auth token.", - "type": "string" -} - removed
Input schema / properties / daemonBaseUrlRemoved value: -{ - "description": "Remote daemon base URL.", - "type": "string" -} - removed
Input schema / properties / iosSimulatorDeviceSetRemoved value: -{ - "description": "iOS simulator device-set path used for device resolution.", - "type": "string" -} - removed
Input schema / properties / iosXctestDerivedDataPathRemoved value: -{ - "description": "Derived data path for external iOS XCTest runner execution.", - "type": "string" -} - removed
Input schema / properties / iosXctestEnvDirRemoved value: -{ - "description": "Writable directory for iOS XCTest runner env overlays.", - "type": "string" -} - removed
Input schema / properties / iosXctestrunFileRemoved value: -{ - "description": "Externally built iOS XCTest runner .xctestrun artifact path.", - "type": "string" -} - removed
Input schema / properties / stateDirRemoved value: -{ - "description": "Agent-device state directory.", - "type": "string" -}
- Changed
audio8 fields changed- removed
Input schema / properties / cwdRemoved value: -{ - "description": "Working directory for command execution.", - "type": "string" -} - removed
Input schema / properties / daemonAuthTokenRemoved value: -{ - "description": "Remote daemon auth token.", - "type": "string" -} - removed
Input schema / properties / daemonBaseUrlRemoved value: -{ - "description": "Remote daemon base URL.", - "type": "string" -} - removed
Input schema / properties / iosSimulatorDeviceSetRemoved value: -{ - "description": "iOS simulator device-set path used for device resolution.", - "type": "string" -} - removed
Input schema / properties / iosXctestDerivedDataPathRemoved value: -{ - "description": "Derived data path for external iOS XCTest runner execution.", - "type": "string" -} - removed
Input schema / properties / iosXctestEnvDirRemoved value: -{ - "description": "Writable directory for iOS XCTest runner env overlays.", - "type": "string" -} - removed
Input schema / properties / iosXctestrunFileRemoved value: -{ - "description": "Externally built iOS XCTest runner .xctestrun artifact path.", - "type": "string" -} - removed
Input schema / properties / stateDirRemoved value: -{ - "description": "Agent-device state directory.", - "type": "string" -}
- Changed
back8 fields changed- removed
Input schema / properties / cwdRemoved value: -{ - "description": "Working directory for command execution.", - "type": "string" -} - removed
Input schema / properties / daemonAuthTokenRemoved value: -{ - "description": "Remote daemon auth token.", - "type": "string" -} - removed
Input schema / properties / daemonBaseUrlRemoved value: -{ - "description": "Remote daemon base URL.", - "type": "string" -} - removed
Input schema / properties / iosSimulatorDeviceSetRemoved value: -{ - "description": "iOS simulator device-set path used for device resolution.", - "type": "string" -} - removed
Input schema / properties / iosXctestDerivedDataPathRemoved value: -{ - "description": "Derived data path for external iOS XCTest runner execution.", - "type": "string" -} - removed
Input schema / properties / iosXctestEnvDirRemoved value: -{ - "description": "Writable directory for iOS XCTest runner env overlays.", - "type": "string" -} - removed
Input schema / properties / iosXctestrunFileRemoved value: -{ - "description": "Externally built iOS XCTest runner .xctestrun artifact path.", - "type": "string" -} - removed
Input schema / properties / stateDirRemoved value: -{ - "description": "Agent-device state directory.", - "type": "string" -}
- Changed
batch8 fields changed- removed
Input schema / properties / cwdRemoved value: -{ - "description": "Working directory for command execution.", - "type": "string" -} - removed
Input schema / properties / daemonAuthTokenRemoved value: -{ - "description": "Remote daemon auth token.", - "type": "string" -} - removed
Input schema / properties / daemonBaseUrlRemoved value: -{ - "description": "Remote daemon base URL.", - "type": "string" -} - removed
Input schema / properties / iosSimulatorDeviceSetRemoved value: -{ - "description": "iOS simulator device-set path used for device resolution.", - "type": "string" -} - removed
Input schema / properties / iosXctestDerivedDataPathRemoved value: -{ - "description": "Derived data path for external iOS XCTest runner execution.", - "type": "string" -} - removed
Input schema / properties / iosXctestEnvDirRemoved value: -{ - "description": "Writable directory for iOS XCTest runner env overlays.", - "type": "string" -} - removed
Input schema / properties / iosXctestrunFileRemoved value: -{ - "description": "Externally built iOS XCTest runner .xctestrun artifact path.", - "type": "string" -} - removed
Input schema / properties / stateDirRemoved value: -{ - "description": "Agent-device state directory.", - "type": "string" -}
- Changed
boot8 fields changed- removed
Input schema / properties / cwdRemoved value: -{ - "description": "Working directory for command execution.", - "type": "string" -} - removed
Input schema / properties / daemonAuthTokenRemoved value: -{ - "description": "Remote daemon auth token.", - "type": "string" -} - removed
Input schema / properties / daemonBaseUrlRemoved value: -{ - "description": "Remote daemon base URL.", - "type": "string" -} - removed
Input schema / properties / iosSimulatorDeviceSetRemoved value: -{ - "description": "iOS simulator device-set path used for device resolution.", - "type": "string" -} - removed
Input schema / properties / iosXctestDerivedDataPathRemoved value: -{ - "description": "Derived data path for external iOS XCTest runner execution.", - "type": "string" -} - removed
Input schema / properties / iosXctestEnvDirRemoved value: -{ - "description": "Writable directory for iOS XCTest runner env overlays.", - "type": "string" -} - removed
Input schema / properties / iosXctestrunFileRemoved value: -{ - "description": "Externally built iOS XCTest runner .xctestrun artifact path.", - "type": "string" -} - removed
Input schema / properties / stateDirRemoved value: -{ - "description": "Agent-device state directory.", - "type": "string" -}
- Changed
capabilities8 fields changed- removed
Input schema / properties / cwdRemoved value: -{ - "description": "Working directory for command execution.", - "type": "string" -} - removed
Input schema / properties / daemonAuthTokenRemoved value: -{ - "description": "Remote daemon auth token.", - "type": "string" -} - removed
Input schema / properties / daemonBaseUrlRemoved value: -{ - "description": "Remote daemon base URL.", - "type": "string" -} - removed
Input schema / properties / iosSimulatorDeviceSetRemoved value: -{ - "description": "iOS simulator device-set path used for device resolution.", - "type": "string" -} - removed
Input schema / properties / iosXctestDerivedDataPathRemoved value: -{ - "description": "Derived data path for external iOS XCTest runner execution.", - "type": "string" -} - removed
Input schema / properties / iosXctestEnvDirRemoved value: -{ - "description": "Writable directory for iOS XCTest runner env overlays.", - "type": "string" -} - removed
Input schema / properties / iosXctestrunFileRemoved value: -{ - "description": "Externally built iOS XCTest runner .xctestrun artifact path.", - "type": "string" -} - removed
Input schema / properties / stateDirRemoved value: -{ - "description": "Agent-device state directory.", - "type": "string" -}
- Changed
click8 fields changed- removed
Input schema / properties / cwdRemoved value: -{ - "description": "Working directory for command execution.", - "type": "string" -} - removed
Input schema / properties / daemonAuthTokenRemoved value: -{ - "description": "Remote daemon auth token.", - "type": "string" -} - removed
Input schema / properties / daemonBaseUrlRemoved value: -{ - "description": "Remote daemon base URL.", - "type": "string" -} - removed
Input schema / properties / iosSimulatorDeviceSetRemoved value: -{ - "description": "iOS simulator device-set path used for device resolution.", - "type": "string" -} - removed
Input schema / properties / iosXctestDerivedDataPathRemoved value: -{ - "description": "Derived data path for external iOS XCTest runner execution.", - "type": "string" -} - removed
Input schema / properties / iosXctestEnvDirRemoved value: -{ - "description": "Writable directory for iOS XCTest runner env overlays.", - "type": "string" -} - removed
Input schema / properties / iosXctestrunFileRemoved value: -{ - "description": "Externally built iOS XCTest runner .xctestrun artifact path.", - "type": "string" -} - removed
Input schema / properties / stateDirRemoved value: -{ - "description": "Agent-device state directory.", - "type": "string" -}
- Changed
clipboard8 fields changed- removed
Input schema / properties / cwdRemoved value: -{ - "description": "Working directory for command execution.", - "type": "string" -} - removed
Input schema / properties / daemonAuthTokenRemoved value: -{ - "description": "Remote daemon auth token.", - "type": "string" -} - removed
Input schema / properties / daemonBaseUrlRemoved value: -{ - "description": "Remote daemon base URL.", - "type": "string" -} - removed
Input schema / properties / iosSimulatorDeviceSetRemoved value: -{ - "description": "iOS simulator device-set path used for device resolution.", - "type": "string" -} - removed
Input schema / properties / iosXctestDerivedDataPathRemoved value: -{ - "description": "Derived data path for external iOS XCTest runner execution.", - "type": "string" -} - removed
Input schema / properties / iosXctestEnvDirRemoved value: -{ - "description": "Writable directory for iOS XCTest runner env overlays.", - "type": "string" -} - removed
Input schema / properties / iosXctestrunFileRemoved value: -{ - "description": "Externally built iOS XCTest runner .xctestrun artifact path.", - "type": "string" -} - removed
Input schema / properties / stateDirRemoved value: -{ - "description": "Agent-device state directory.", - "type": "string" -}
- Changed
close8 fields changed- removed
Input schema / properties / cwdRemoved value: -{ - "description": "Working directory for command execution.", - "type": "string" -} - removed
Input schema / properties / daemonAuthTokenRemoved value: -{ - "description": "Remote daemon auth token.", - "type": "string" -} - removed
Input schema / properties / daemonBaseUrlRemoved value: -{ - "description": "Remote daemon base URL.", - "type": "string" -} - removed
Input schema / properties / iosSimulatorDeviceSetRemoved value: -{ - "description": "iOS simulator device-set path used for device resolution.", - "type": "string" -} - removed
Input schema / properties / iosXctestDerivedDataPathRemoved value: -{ - "description": "Derived data path for external iOS XCTest runner execution.", - "type": "string" -} - removed
Input schema / properties / iosXctestEnvDirRemoved value: -{ - "description": "Writable directory for iOS XCTest runner env overlays.", - "type": "string" -} - removed
Input schema / properties / iosXctestrunFileRemoved value: -{ - "description": "Externally built iOS XCTest runner .xctestrun artifact path.", - "type": "string" -} - removed
Input schema / properties / stateDirRemoved value: -{ - "description": "Agent-device state directory.", - "type": "string" -}
- Changed
debug8 fields changed- removed
Input schema / properties / cwdRemoved value: -{ - "description": "Working directory for command execution.", - "type": "string" -} - removed
Input schema / properties / daemonAuthTokenRemoved value: -{ - "description": "Remote daemon auth token.", - "type": "string" -} - removed
Input schema / properties / daemonBaseUrlRemoved value: -{ - "description": "Remote daemon base URL.", - "type": "string" -} - removed
Input schema / properties / iosSimulatorDeviceSetRemoved value: -{ - "description": "iOS simulator device-set path used for device resolution.", - "type": "string" -} - removed
Input schema / properties / iosXctestDerivedDataPathRemoved value: -{ - "description": "Derived data path for external iOS XCTest runner execution.", - "type": "string" -} - removed
Input schema / properties / iosXctestEnvDirRemoved value: -{ - "description": "Writable directory for iOS XCTest runner env overlays.", - "type": "string" -} - removed
Input schema / properties / iosXctestrunFileRemoved value: -{ - "description": "Externally built iOS XCTest runner .xctestrun artifact path.", - "type": "string" -} - removed
Input schema / properties / stateDirRemoved value: -{ - "description": "Agent-device state directory.", - "type": "string" -}
- Changed
devices8 fields changed- removed
Input schema / properties / cwdRemoved value: -{ - "description": "Working directory for command execution.", - "type": "string" -} - removed
Input schema / properties / daemonAuthTokenRemoved value: -{ - "description": "Remote daemon auth token.", - "type": "string" -} - removed
Input schema / properties / daemonBaseUrlRemoved value: -{ - "description": "Remote daemon base URL.", - "type": "string" -} - removed
Input schema / properties / iosSimulatorDeviceSetRemoved value: -{ - "description": "iOS simulator device-set path used for device resolution.", - "type": "string" -} - removed
Input schema / properties / iosXctestDerivedDataPathRemoved value: -{ - "description": "Derived data path for external iOS XCTest runner execution.", - "type": "string" -} - removed
Input schema / properties / iosXctestEnvDirRemoved value: -{ - "description": "Writable directory for iOS XCTest runner env overlays.", - "type": "string" -} - removed
Input schema / properties / iosXctestrunFileRemoved value: -{ - "description": "Externally built iOS XCTest runner .xctestrun artifact path.", - "type": "string" -} - removed
Input schema / properties / stateDirRemoved value: -{ - "description": "Agent-device state directory.", - "type": "string" -}
- Changed
diff8 fields changed- removed
Input schema / properties / cwdRemoved value: -{ - "description": "Working directory for command execution.", - "type": "string" -} - removed
Input schema / properties / daemonAuthTokenRemoved value: -{ - "description": "Remote daemon auth token.", - "type": "string" -} - removed
Input schema / properties / daemonBaseUrlRemoved value: -{ - "description": "Remote daemon base URL.", - "type": "string" -} - removed
Input schema / properties / iosSimulatorDeviceSetRemoved value: -{ - "description": "iOS simulator device-set path used for device resolution.", - "type": "string" -} - removed
Input schema / properties / iosXctestDerivedDataPathRemoved value: -{ - "description": "Derived data path for external iOS XCTest runner execution.", - "type": "string" -} - removed
Input schema / properties / iosXctestEnvDirRemoved value: -{ - "description": "Writable directory for iOS XCTest runner env overlays.", - "type": "string" -} - removed
Input schema / properties / iosXctestrunFileRemoved value: -{ - "description": "Externally built iOS XCTest runner .xctestrun artifact path.", - "type": "string" -} - removed
Input schema / properties / stateDirRemoved value: -{ - "description": "Agent-device state directory.", - "type": "string" -}
- Changed
doctor8 fields changed- removed
Input schema / properties / cwdRemoved value: -{ - "description": "Working directory for command execution.", - "type": "string" -} - removed
Input schema / properties / daemonAuthTokenRemoved value: -{ - "description": "Remote daemon auth token.", - "type": "string" -} - removed
Input schema / properties / daemonBaseUrlRemoved value: -{ - "description": "Remote daemon base URL.", - "type": "string" -} - removed
Input schema / properties / iosSimulatorDeviceSetRemoved value: -{ - "description": "iOS simulator device-set path used for device resolution.", - "type": "string" -} - removed
Input schema / properties / iosXctestDerivedDataPathRemoved value: -{ - "description": "Derived data path for external iOS XCTest runner execution.", - "type": "string" -} - removed
Input schema / properties / iosXctestEnvDirRemoved value: -{ - "description": "Writable directory for iOS XCTest runner env overlays.", - "type": "string" -} - removed
Input schema / properties / iosXctestrunFileRemoved value: -{ - "description": "Externally built iOS XCTest runner .xctestrun artifact path.", - "type": "string" -} - removed
Input schema / properties / stateDirRemoved value: -{ - "description": "Agent-device state directory.", - "type": "string" -}
- Changed
events8 fields changed- removed
Input schema / properties / cwdRemoved value: -{ - "description": "Working directory for command execution.", - "type": "string" -} - removed
Input schema / properties / daemonAuthTokenRemoved value: -{ - "description": "Remote daemon auth token.", - "type": "string" -} - removed
Input schema / properties / daemonBaseUrlRemoved value: -{ - "description": "Remote daemon base URL.", - "type": "string" -} - removed
Input schema / properties / iosSimulatorDeviceSetRemoved value: -{ - "description": "iOS simulator device-set path used for device resolution.", - "type": "string" -} - removed
Input schema / properties / iosXctestDerivedDataPathRemoved value: -{ - "description": "Derived data path for external iOS XCTest runner execution.", - "type": "string" -} - removed
Input schema / properties / iosXctestEnvDirRemoved value: -{ - "description": "Writable directory for iOS XCTest runner env overlays.", - "type": "string" -} - removed
Input schema / properties / iosXctestrunFileRemoved value: -{ - "description": "Externally built iOS XCTest runner .xctestrun artifact path.", - "type": "string" -} - removed
Input schema / properties / stateDirRemoved value: -{ - "description": "Agent-device state directory.", - "type": "string" -}
- Changed
fill8 fields changed- removed
Input schema / properties / cwdRemoved value: -{ - "description": "Working directory for command execution.", - "type": "string" -} - removed
Input schema / properties / daemonAuthTokenRemoved value: -{ - "description": "Remote daemon auth token.", - "type": "string" -} - removed
Input schema / properties / daemonBaseUrlRemoved value: -{ - "description": "Remote daemon base URL.", - "type": "string" -} - removed
Input schema / properties / iosSimulatorDeviceSetRemoved value: -{ - "description": "iOS simulator device-set path used for device resolution.", - "type": "string" -} - removed
Input schema / properties / iosXctestDerivedDataPathRemoved value: -{ - "description": "Derived data path for external iOS XCTest runner execution.", - "type": "string" -} - removed
Input schema / properties / iosXctestEnvDirRemoved value: -{ - "description": "Writable directory for iOS XCTest runner env overlays.", - "type": "string" -} - removed
Input schema / properties / iosXctestrunFileRemoved value: -{ - "description": "Externally built iOS XCTest runner .xctestrun artifact path.", - "type": "string" -} - removed
Input schema / properties / stateDirRemoved value: -{ - "description": "Agent-device state directory.", - "type": "string" -}
- Changed
find9 fields changed- removed
Input schema / properties / cwdRemoved value: -{ - "description": "Working directory for command execution.", - "type": "string" -} - removed
Input schema / properties / daemonAuthTokenRemoved value: -{ - "description": "Remote daemon auth token.", - "type": "string" -} - removed
Input schema / properties / daemonBaseUrlRemoved value: -{ - "description": "Remote daemon base URL.", - "type": "string" -} - removed
Input schema / properties / iosSimulatorDeviceSetRemoved value: -{ - "description": "iOS simulator device-set path used for device resolution.", - "type": "string" -} - removed
Input schema / properties / iosXctestDerivedDataPathRemoved value: -{ - "description": "Derived data path for external iOS XCTest runner execution.", - "type": "string" -} - removed
Input schema / properties / iosXctestEnvDirRemoved value: -{ - "description": "Writable directory for iOS XCTest runner env overlays.", - "type": "string" -} - removed
Input schema / properties / iosXctestrunFileRemoved value: -{ - "description": "Externally built iOS XCTest runner .xctestrun artifact path.", - "type": "string" -} - removed
Input schema / properties / stateDirRemoved value: -{ - "description": "Agent-device state directory.", - "type": "string" -} - removed
Output schema / properties / settleRemoved value: -{ - "properties": { - "captures": { - "type": "number" - }, - "diff": { - "description": "Settled diff vs the pre-action tree (changed lines only).", - "properties": { - "lines": { - "items": { - "properties": { - "kind": { - "enum": [ - "added", - "removed" - ], - "type": "string" - }, - "ref": { - "description": "Plain ref body (e12) for added lines.", - "type": "string" - }, - "text": { - "type": "string" - } - }, - "required": [ - "kind", - "text" - ], - "type": "object" - }, - "type": "array" - }, - "summary": { - "properties": { - "additions": { - "type": "number" - }, - "removals": { - "type": "number" - }, - "unchanged": { - "type": "number" - } - }, - "required": [ - "additions", - "removals", - "unchanged" - ], - "type": "object" - }, - "truncated": { - "description": "Lines were capped to the response bound.", - "type": "boolean" - } - }, - "required": [ - "summary", - "lines" - ], - "type": "object" - }, - "hint": { - "type": "string" - }, - "quietMs": { - "type": "number" - }, - "refs": { - "items": { - "properties": { - "ref": { - "description": "Plain ref body (e12) minted from the stored settled tree.", - "type": "string" - } - }, - "required": [ - "ref" - ], - "type": "object" - }, - "type": "array" - }, - "refsGeneration": { - "description": "Snapshot generation of the stored settled tree; refs on added diff lines were minted from it.", - "type": "number" - }, - "settled": { - "description": "Whether the UI held the quiet window before the deadline. false is advisory, not failure.", - "type": "boolean" - }, - "tail": { - "description": "Unchanged interactive refs tail: still-present, actionable elements from the settled tree, attached only when diff carries zero added-line refs (a modal-dismiss/toast-only diff).", - "items": { - "properties": { - "label": { - "type": "string" - }, - "ref": { - "description": "Plain ref body (e12) minted from the stored settled tree.", - "type": "string" - }, - "role": { - "type": "string" - } - }, - "required": [ - "ref", - "role" - ], - "type": "object" - }, - "type": "array" - }, - "tailTruncated": { - "description": "Present (true) when tail candidates exceeded the response cap.", - "type": "boolean" - }, - "timeoutMs": { - "type": "number" - }, - "waitedMs": { - "type": "number" - } - }, - "required": [ - "settled", - "waitedMs", - "captures", - "quietMs", - "timeoutMs" - ], - "type": "object" -}
- Changed
focus8 fields changed- removed
Input schema / properties / cwdRemoved value: -{ - "description": "Working directory for command execution.", - "type": "string" -} - removed
Input schema / properties / daemonAuthTokenRemoved value: -{ - "description": "Remote daemon auth token.", - "type": "string" -} - removed
Input schema / properties / daemonBaseUrlRemoved value: -{ - "description": "Remote daemon base URL.", - "type": "string" -} - removed
Input schema / properties / iosSimulatorDeviceSetRemoved value: -{ - "description": "iOS simulator device-set path used for device resolution.", - "type": "string" -} - removed
Input schema / properties / iosXctestDerivedDataPathRemoved value: -{ - "description": "Derived data path for external iOS XCTest runner execution.", - "type": "string" -} - removed
Input schema / properties / iosXctestEnvDirRemoved value: -{ - "description": "Writable directory for iOS XCTest runner env overlays.", - "type": "string" -} - removed
Input schema / properties / iosXctestrunFileRemoved value: -{ - "description": "Externally built iOS XCTest runner .xctestrun artifact path.", - "type": "string" -} - removed
Input schema / properties / stateDirRemoved value: -{ - "description": "Agent-device state directory.", - "type": "string" -}
- Changed
gesture8 fields changed- removed
Input schema / properties / cwdRemoved value: -{ - "description": "Working directory for command execution.", - "type": "string" -} - removed
Input schema / properties / daemonAuthTokenRemoved value: -{ - "description": "Remote daemon auth token.", - "type": "string" -} - removed
Input schema / properties / daemonBaseUrlRemoved value: -{ - "description": "Remote daemon base URL.", - "type": "string" -} - removed
Input schema / properties / iosSimulatorDeviceSetRemoved value: -{ - "description": "iOS simulator device-set path used for device resolution.", - "type": "string" -} - removed
Input schema / properties / iosXctestDerivedDataPathRemoved value: -{ - "description": "Derived data path for external iOS XCTest runner execution.", - "type": "string" -} - removed
Input schema / properties / iosXctestEnvDirRemoved value: -{ - "description": "Writable directory for iOS XCTest runner env overlays.", - "type": "string" -} - removed
Input schema / properties / iosXctestrunFileRemoved value: -{ - "description": "Externally built iOS XCTest runner .xctestrun artifact path.", - "type": "string" -} - removed
Input schema / properties / stateDirRemoved value: -{ - "description": "Agent-device state directory.", - "type": "string" -}
- Changed
get8 fields changed- removed
Input schema / properties / cwdRemoved value: -{ - "description": "Working directory for command execution.", - "type": "string" -} - removed
Input schema / properties / daemonAuthTokenRemoved value: -{ - "description": "Remote daemon auth token.", - "type": "string" -} - removed
Input schema / properties / daemonBaseUrlRemoved value: -{ - "description": "Remote daemon base URL.", - "type": "string" -} - removed
Input schema / properties / iosSimulatorDeviceSetRemoved value: -{ - "description": "iOS simulator device-set path used for device resolution.", - "type": "string" -} - removed
Input schema / properties / iosXctestDerivedDataPathRemoved value: -{ - "description": "Derived data path for external iOS XCTest runner execution.", - "type": "string" -} - removed
Input schema / properties / iosXctestEnvDirRemoved value: -{ - "description": "Writable directory for iOS XCTest runner env overlays.", - "type": "string" -} - removed
Input schema / properties / iosXctestrunFileRemoved value: -{ - "description": "Externally built iOS XCTest runner .xctestrun artifact path.", - "type": "string" -} - removed
Input schema / properties / stateDirRemoved value: -{ - "description": "Agent-device state directory.", - "type": "string" -}
- Changed
home8 fields changed- removed
Input schema / properties / cwdRemoved value: -{ - "description": "Working directory for command execution.", - "type": "string" -} - removed
Input schema / properties / daemonAuthTokenRemoved value: -{ - "description": "Remote daemon auth token.", - "type": "string" -} - removed
Input schema / properties / daemonBaseUrlRemoved value: -{ - "description": "Remote daemon base URL.", - "type": "string" -} - removed
Input schema / properties / iosSimulatorDeviceSetRemoved value: -{ - "description": "iOS simulator device-set path used for device resolution.", - "type": "string" -} - removed
Input schema / properties / iosXctestDerivedDataPathRemoved value: -{ - "description": "Derived data path for external iOS XCTest runner execution.", - "type": "string" -} - removed
Input schema / properties / iosXctestEnvDirRemoved value: -{ - "description": "Writable directory for iOS XCTest runner env overlays.", - "type": "string" -} - removed
Input schema / properties / iosXctestrunFileRemoved value: -{ - "description": "Externally built iOS XCTest runner .xctestrun artifact path.", - "type": "string" -} - removed
Input schema / properties / stateDirRemoved value: -{ - "description": "Agent-device state directory.", - "type": "string" -}
- Changed
hover8 fields changed- removed
Input schema / properties / cwdRemoved value: -{ - "description": "Working directory for command execution.", - "type": "string" -} - removed
Input schema / properties / daemonAuthTokenRemoved value: -{ - "description": "Remote daemon auth token.", - "type": "string" -} - removed
Input schema / properties / daemonBaseUrlRemoved value: -{ - "description": "Remote daemon base URL.", - "type": "string" -} - removed
Input schema / properties / iosSimulatorDeviceSetRemoved value: -{ - "description": "iOS simulator device-set path used for device resolution.", - "type": "string" -} - removed
Input schema / properties / iosXctestDerivedDataPathRemoved value: -{ - "description": "Derived data path for external iOS XCTest runner execution.", - "type": "string" -} - removed
Input schema / properties / iosXctestEnvDirRemoved value: -{ - "description": "Writable directory for iOS XCTest runner env overlays.", - "type": "string" -} - removed
Input schema / properties / iosXctestrunFileRemoved value: -{ - "description": "Externally built iOS XCTest runner .xctestrun artifact path.", - "type": "string" -} - removed
Input schema / properties / stateDirRemoved value: -{ - "description": "Agent-device state directory.", - "type": "string" -}
- Changed
install8 fields changed- removed
Input schema / properties / cwdRemoved value: -{ - "description": "Working directory for command execution.", - "type": "string" -} - removed
Input schema / properties / daemonAuthTokenRemoved value: -{ - "description": "Remote daemon auth token.", - "type": "string" -} - removed
Input schema / properties / daemonBaseUrlRemoved value: -{ - "description": "Remote daemon base URL.", - "type": "string" -} - removed
Input schema / properties / iosSimulatorDeviceSetRemoved value: -{ - "description": "iOS simulator device-set path used for device resolution.", - "type": "string" -} - removed
Input schema / properties / iosXctestDerivedDataPathRemoved value: -{ - "description": "Derived data path for external iOS XCTest runner execution.", - "type": "string" -} - removed
Input schema / properties / iosXctestEnvDirRemoved value: -{ - "description": "Writable directory for iOS XCTest runner env overlays.", - "type": "string" -} - removed
Input schema / properties / iosXctestrunFileRemoved value: -{ - "description": "Externally built iOS XCTest runner .xctestrun artifact path.", - "type": "string" -} - removed
Input schema / properties / stateDirRemoved value: -{ - "description": "Agent-device state directory.", - "type": "string" -}
- Changed
install-from-source8 fields changed- removed
Input schema / properties / cwdRemoved value: -{ - "description": "Working directory for command execution.", - "type": "string" -} - removed
Input schema / properties / daemonAuthTokenRemoved value: -{ - "description": "Remote daemon auth token.", - "type": "string" -} - removed
Input schema / properties / daemonBaseUrlRemoved value: -{ - "description": "Remote daemon base URL.", - "type": "string" -} - removed
Input schema / properties / iosSimulatorDeviceSetRemoved value: -{ - "description": "iOS simulator device-set path used for device resolution.", - "type": "string" -} - removed
Input schema / properties / iosXctestDerivedDataPathRemoved value: -{ - "description": "Derived data path for external iOS XCTest runner execution.", - "type": "string" -} - removed
Input schema / properties / iosXctestEnvDirRemoved value: -{ - "description": "Writable directory for iOS XCTest runner env overlays.", - "type": "string" -} - removed
Input schema / properties / iosXctestrunFileRemoved value: -{ - "description": "Externally built iOS XCTest runner .xctestrun artifact path.", - "type": "string" -} - removed
Input schema / properties / stateDirRemoved value: -{ - "description": "Agent-device state directory.", - "type": "string" -}
- Changed
is8 fields changed- removed
Input schema / properties / cwdRemoved value: -{ - "description": "Working directory for command execution.", - "type": "string" -} - removed
Input schema / properties / daemonAuthTokenRemoved value: -{ - "description": "Remote daemon auth token.", - "type": "string" -} - removed
Input schema / properties / daemonBaseUrlRemoved value: -{ - "description": "Remote daemon base URL.", - "type": "string" -} - removed
Input schema / properties / iosSimulatorDeviceSetRemoved value: -{ - "description": "iOS simulator device-set path used for device resolution.", - "type": "string" -} - removed
Input schema / properties / iosXctestDerivedDataPathRemoved value: -{ - "description": "Derived data path for external iOS XCTest runner execution.", - "type": "string" -} - removed
Input schema / properties / iosXctestEnvDirRemoved value: -{ - "description": "Writable directory for iOS XCTest runner env overlays.", - "type": "string" -} - removed
Input schema / properties / iosXctestrunFileRemoved value: -{ - "description": "Externally built iOS XCTest runner .xctestrun artifact path.", - "type": "string" -} - removed
Input schema / properties / stateDirRemoved value: -{ - "description": "Agent-device state directory.", - "type": "string" -}
- Changed
keyboard8 fields changed- removed
Input schema / properties / cwdRemoved value: -{ - "description": "Working directory for command execution.", - "type": "string" -} - removed
Input schema / properties / daemonAuthTokenRemoved value: -{ - "description": "Remote daemon auth token.", - "type": "string" -} - removed
Input schema / properties / daemonBaseUrlRemoved value: -{ - "description": "Remote daemon base URL.", - "type": "string" -} - removed
Input schema / properties / iosSimulatorDeviceSetRemoved value: -{ - "description": "iOS simulator device-set path used for device resolution.", - "type": "string" -} - removed
Input schema / properties / iosXctestDerivedDataPathRemoved value: -{ - "description": "Derived data path for external iOS XCTest runner execution.", - "type": "string" -} - removed
Input schema / properties / iosXctestEnvDirRemoved value: -{ - "description": "Writable directory for iOS XCTest runner env overlays.", - "type": "string" -} - removed
Input schema / properties / iosXctestrunFileRemoved value: -{ - "description": "Externally built iOS XCTest runner .xctestrun artifact path.", - "type": "string" -} - removed
Input schema / properties / stateDirRemoved value: -{ - "description": "Agent-device state directory.", - "type": "string" -}
- Changed
logs8 fields changed- removed
Input schema / properties / cwdRemoved value: -{ - "description": "Working directory for command execution.", - "type": "string" -} - removed
Input schema / properties / daemonAuthTokenRemoved value: -{ - "description": "Remote daemon auth token.", - "type": "string" -} - removed
Input schema / properties / daemonBaseUrlRemoved value: -{ - "description": "Remote daemon base URL.", - "type": "string" -} - removed
Input schema / properties / iosSimulatorDeviceSetRemoved value: -{ - "description": "iOS simulator device-set path used for device resolution.", - "type": "string" -} - removed
Input schema / properties / iosXctestDerivedDataPathRemoved value: -{ - "description": "Derived data path for external iOS XCTest runner execution.", - "type": "string" -} - removed
Input schema / properties / iosXctestEnvDirRemoved value: -{ - "description": "Writable directory for iOS XCTest runner env overlays.", - "type": "string" -} - removed
Input schema / properties / iosXctestrunFileRemoved value: -{ - "description": "Externally built iOS XCTest runner .xctestrun artifact path.", - "type": "string" -} - removed
Input schema / properties / stateDirRemoved value: -{ - "description": "Agent-device state directory.", - "type": "string" -}
- Changed
longpress8 fields changed- removed
Input schema / properties / cwdRemoved value: -{ - "description": "Working directory for command execution.", - "type": "string" -} - removed
Input schema / properties / daemonAuthTokenRemoved value: -{ - "description": "Remote daemon auth token.", - "type": "string" -} - removed
Input schema / properties / daemonBaseUrlRemoved value: -{ - "description": "Remote daemon base URL.", - "type": "string" -} - removed
Input schema / properties / iosSimulatorDeviceSetRemoved value: -{ - "description": "iOS simulator device-set path used for device resolution.", - "type": "string" -} - removed
Input schema / properties / iosXctestDerivedDataPathRemoved value: -{ - "description": "Derived data path for external iOS XCTest runner execution.", - "type": "string" -} - removed
Input schema / properties / iosXctestEnvDirRemoved value: -{ - "description": "Writable directory for iOS XCTest runner env overlays.", - "type": "string" -} - removed
Input schema / properties / iosXctestrunFileRemoved value: -{ - "description": "Externally built iOS XCTest runner .xctestrun artifact path.", - "type": "string" -} - removed
Input schema / properties / stateDirRemoved value: -{ - "description": "Agent-device state directory.", - "type": "string" -}
- Changed
metro10 fields changed- removed
Input schema / properties / bearerTokenRemoved value: -{ - "type": "string" -} - removed
Input schema / properties / cwdRemoved value: -{ - "description": "Working directory for command execution.", - "type": "string" -} - removed
Input schema / properties / daemonAuthTokenRemoved value: -{ - "description": "Remote daemon auth token.", - "type": "string" -} - removed
Input schema / properties / daemonBaseUrlRemoved value: -{ - "description": "Remote daemon base URL.", - "type": "string" -} - removed
Input schema / properties / iosSimulatorDeviceSetRemoved value: -{ - "description": "iOS simulator device-set path used for device resolution.", - "type": "string" -} - removed
Input schema / properties / iosXctestDerivedDataPathRemoved value: -{ - "description": "Derived data path for external iOS XCTest runner execution.", - "type": "string" -} - removed
Input schema / properties / iosXctestEnvDirRemoved value: -{ - "description": "Writable directory for iOS XCTest runner env overlays.", - "type": "string" -} - removed
Input schema / properties / iosXctestrunFileRemoved value: -{ - "description": "Externally built iOS XCTest runner .xctestrun artifact path.", - "type": "string" -} - removed
Input schema / properties / proxyBaseUrlRemoved value: -{ - "type": "string" -} - removed
Input schema / properties / stateDirRemoved value: -{ - "description": "Agent-device state directory.", - "type": "string" -}
- Changed
network8 fields changed- removed
Input schema / properties / cwdRemoved value: -{ - "description": "Working directory for command execution.", - "type": "string" -} - removed
Input schema / properties / daemonAuthTokenRemoved value: -{ - "description": "Remote daemon auth token.", - "type": "string" -} - removed
Input schema / properties / daemonBaseUrlRemoved value: -{ - "description": "Remote daemon base URL.", - "type": "string" -} - removed
Input schema / properties / iosSimulatorDeviceSetRemoved value: -{ - "description": "iOS simulator device-set path used for device resolution.", - "type": "string" -} - removed
Input schema / properties / iosXctestDerivedDataPathRemoved value: -{ - "description": "Derived data path for external iOS XCTest runner execution.", - "type": "string" -} - removed
Input schema / properties / iosXctestEnvDirRemoved value: -{ - "description": "Writable directory for iOS XCTest runner env overlays.", - "type": "string" -} - removed
Input schema / properties / iosXctestrunFileRemoved value: -{ - "description": "Externally built iOS XCTest runner .xctestrun artifact path.", - "type": "string" -} - removed
Input schema / properties / stateDirRemoved value: -{ - "description": "Agent-device state directory.", - "type": "string" -}
- Changed
open8 fields changed- removed
Input schema / properties / cwdRemoved value: -{ - "description": "Working directory for command execution.", - "type": "string" -} - removed
Input schema / properties / daemonAuthTokenRemoved value: -{ - "description": "Remote daemon auth token.", - "type": "string" -} - removed
Input schema / properties / daemonBaseUrlRemoved value: -{ - "description": "Remote daemon base URL.", - "type": "string" -} - removed
Input schema / properties / iosSimulatorDeviceSetRemoved value: -{ - "description": "iOS simulator device-set path used for device resolution.", - "type": "string" -} - removed
Input schema / properties / iosXctestDerivedDataPathRemoved value: -{ - "description": "Derived data path for external iOS XCTest runner execution.", - "type": "string" -} - removed
Input schema / properties / iosXctestEnvDirRemoved value: -{ - "description": "Writable directory for iOS XCTest runner env overlays.", - "type": "string" -} - removed
Input schema / properties / iosXctestrunFileRemoved value: -{ - "description": "Externally built iOS XCTest runner .xctestrun artifact path.", - "type": "string" -} - removed
Input schema / properties / stateDirRemoved value: -{ - "description": "Agent-device state directory.", - "type": "string" -}
- Changed
orientation8 fields changed- removed
Input schema / properties / cwdRemoved value: -{ - "description": "Working directory for command execution.", - "type": "string" -} - removed
Input schema / properties / daemonAuthTokenRemoved value: -{ - "description": "Remote daemon auth token.", - "type": "string" -} - removed
Input schema / properties / daemonBaseUrlRemoved value: -{ - "description": "Remote daemon base URL.", - "type": "string" -} - removed
Input schema / properties / iosSimulatorDeviceSetRemoved value: -{ - "description": "iOS simulator device-set path used for device resolution.", - "type": "string" -} - removed
Input schema / properties / iosXctestDerivedDataPathRemoved value: -{ - "description": "Derived data path for external iOS XCTest runner execution.", - "type": "string" -} - removed
Input schema / properties / iosXctestEnvDirRemoved value: -{ - "description": "Writable directory for iOS XCTest runner env overlays.", - "type": "string" -} - removed
Input schema / properties / iosXctestrunFileRemoved value: -{ - "description": "Externally built iOS XCTest runner .xctestrun artifact path.", - "type": "string" -} - removed
Input schema / properties / stateDirRemoved value: -{ - "description": "Agent-device state directory.", - "type": "string" -}
- Changed
perf10 fields changed- changed
Input schema / properties / area / enumPrevious value: -[ - "metrics", - "frames", - "memory", - "cpu", - "trace" -]New value: +[ + "frames", + "memory", + "cpu", + "trace" +] - removed
Input schema / properties / cwdRemoved value: -{ - "description": "Working directory for command execution.", - "type": "string" -} - removed
Input schema / properties / daemonAuthTokenRemoved value: -{ - "description": "Remote daemon auth token.", - "type": "string" -} - removed
Input schema / properties / daemonBaseUrlRemoved value: -{ - "description": "Remote daemon base URL.", - "type": "string" -} - removed
Input schema / properties / iosSimulatorDeviceSetRemoved value: -{ - "description": "iOS simulator device-set path used for device resolution.", - "type": "string" -} - removed
Input schema / properties / iosXctestDerivedDataPathRemoved value: -{ - "description": "Derived data path for external iOS XCTest runner execution.", - "type": "string" -} - removed
Input schema / properties / iosXctestEnvDirRemoved value: -{ - "description": "Writable directory for iOS XCTest runner env overlays.", - "type": "string" -} - removed
Input schema / properties / iosXctestrunFileRemoved value: -{ - "description": "Externally built iOS XCTest runner .xctestrun artifact path.", - "type": "string" -} - removed
Input schema / properties / stateDirRemoved value: -{ - "description": "Agent-device state directory.", - "type": "string" -} - added
Input schema / requiredAdded value: +[ + "area" +]
- Changed
press8 fields changed- removed
Input schema / properties / cwdRemoved value: -{ - "description": "Working directory for command execution.", - "type": "string" -} - removed
Input schema / properties / daemonAuthTokenRemoved value: -{ - "description": "Remote daemon auth token.", - "type": "string" -} - removed
Input schema / properties / daemonBaseUrlRemoved value: -{ - "description": "Remote daemon base URL.", - "type": "string" -} - removed
Input schema / properties / iosSimulatorDeviceSetRemoved value: -{ - "description": "iOS simulator device-set path used for device resolution.", - "type": "string" -} - removed
Input schema / properties / iosXctestDerivedDataPathRemoved value: -{ - "description": "Derived data path for external iOS XCTest runner execution.", - "type": "string" -} - removed
Input schema / properties / iosXctestEnvDirRemoved value: -{ - "description": "Writable directory for iOS XCTest runner env overlays.", - "type": "string" -} - removed
Input schema / properties / iosXctestrunFileRemoved value: -{ - "description": "Externally built iOS XCTest runner .xctestrun artifact path.", - "type": "string" -} - removed
Input schema / properties / stateDirRemoved value: -{ - "description": "Agent-device state directory.", - "type": "string" -}
- Changed
push8 fields changed- removed
Input schema / properties / cwdRemoved value: -{ - "description": "Working directory for command execution.", - "type": "string" -} - removed
Input schema / properties / daemonAuthTokenRemoved value: -{ - "description": "Remote daemon auth token.", - "type": "string" -} - removed
Input schema / properties / daemonBaseUrlRemoved value: -{ - "description": "Remote daemon base URL.", - "type": "string" -} - removed
Input schema / properties / iosSimulatorDeviceSetRemoved value: -{ - "description": "iOS simulator device-set path used for device resolution.", - "type": "string" -} - removed
Input schema / properties / iosXctestDerivedDataPathRemoved value: -{ - "description": "Derived data path for external iOS XCTest runner execution.", - "type": "string" -} - removed
Input schema / properties / iosXctestEnvDirRemoved value: -{ - "description": "Writable directory for iOS XCTest runner env overlays.", - "type": "string" -} - removed
Input schema / properties / iosXctestrunFileRemoved value: -{ - "description": "Externally built iOS XCTest runner .xctestrun artifact path.", - "type": "string" -} - removed
Input schema / properties / stateDirRemoved value: -{ - "description": "Agent-device state directory.", - "type": "string" -}
- Changed
react-native8 fields changed- removed
Input schema / properties / cwdRemoved value: -{ - "description": "Working directory for command execution.", - "type": "string" -} - removed
Input schema / properties / daemonAuthTokenRemoved value: -{ - "description": "Remote daemon auth token.", - "type": "string" -} - removed
Input schema / properties / daemonBaseUrlRemoved value: -{ - "description": "Remote daemon base URL.", - "type": "string" -} - removed
Input schema / properties / iosSimulatorDeviceSetRemoved value: -{ - "description": "iOS simulator device-set path used for device resolution.", - "type": "string" -} - removed
Input schema / properties / iosXctestDerivedDataPathRemoved value: -{ - "description": "Derived data path for external iOS XCTest runner execution.", - "type": "string" -} - removed
Input schema / properties / iosXctestEnvDirRemoved value: -{ - "description": "Writable directory for iOS XCTest runner env overlays.", - "type": "string" -} - removed
Input schema / properties / iosXctestrunFileRemoved value: -{ - "description": "Externally built iOS XCTest runner .xctestrun artifact path.", - "type": "string" -} - removed
Input schema / properties / stateDirRemoved value: -{ - "description": "Agent-device state directory.", - "type": "string" -}
- Changed
record8 fields changed- removed
Input schema / properties / cwdRemoved value: -{ - "description": "Working directory for command execution.", - "type": "string" -} - removed
Input schema / properties / daemonAuthTokenRemoved value: -{ - "description": "Remote daemon auth token.", - "type": "string" -} - removed
Input schema / properties / daemonBaseUrlRemoved value: -{ - "description": "Remote daemon base URL.", - "type": "string" -} - removed
Input schema / properties / iosSimulatorDeviceSetRemoved value: -{ - "description": "iOS simulator device-set path used for device resolution.", - "type": "string" -} - removed
Input schema / properties / iosXctestDerivedDataPathRemoved value: -{ - "description": "Derived data path for external iOS XCTest runner execution.", - "type": "string" -} - removed
Input schema / properties / iosXctestEnvDirRemoved value: -{ - "description": "Writable directory for iOS XCTest runner env overlays.", - "type": "string" -} - removed
Input schema / properties / iosXctestrunFileRemoved value: -{ - "description": "Externally built iOS XCTest runner .xctestrun artifact path.", - "type": "string" -} - removed
Input schema / properties / stateDirRemoved value: -{ - "description": "Agent-device state directory.", - "type": "string" -}
- Changed
reinstall8 fields changed- removed
Input schema / properties / cwdRemoved value: -{ - "description": "Working directory for command execution.", - "type": "string" -} - removed
Input schema / properties / daemonAuthTokenRemoved value: -{ - "description": "Remote daemon auth token.", - "type": "string" -} - removed
Input schema / properties / daemonBaseUrlRemoved value: -{ - "description": "Remote daemon base URL.", - "type": "string" -} - removed
Input schema / properties / iosSimulatorDeviceSetRemoved value: -{ - "description": "iOS simulator device-set path used for device resolution.", - "type": "string" -} - removed
Input schema / properties / iosXctestDerivedDataPathRemoved value: -{ - "description": "Derived data path for external iOS XCTest runner execution.", - "type": "string" -} - removed
Input schema / properties / iosXctestEnvDirRemoved value: -{ - "description": "Writable directory for iOS XCTest runner env overlays.", - "type": "string" -} - removed
Input schema / properties / iosXctestrunFileRemoved value: -{ - "description": "Externally built iOS XCTest runner .xctestrun artifact path.", - "type": "string" -} - removed
Input schema / properties / stateDirRemoved value: -{ - "description": "Agent-device state directory.", - "type": "string" -}
- Changed
replay8 fields changed- removed
Input schema / properties / cwdRemoved value: -{ - "description": "Working directory for command execution.", - "type": "string" -} - removed
Input schema / properties / daemonAuthTokenRemoved value: -{ - "description": "Remote daemon auth token.", - "type": "string" -} - removed
Input schema / properties / daemonBaseUrlRemoved value: -{ - "description": "Remote daemon base URL.", - "type": "string" -} - removed
Input schema / properties / iosSimulatorDeviceSetRemoved value: -{ - "description": "iOS simulator device-set path used for device resolution.", - "type": "string" -} - removed
Input schema / properties / iosXctestDerivedDataPathRemoved value: -{ - "description": "Derived data path for external iOS XCTest runner execution.", - "type": "string" -} - removed
Input schema / properties / iosXctestEnvDirRemoved value: -{ - "description": "Writable directory for iOS XCTest runner env overlays.", - "type": "string" -} - removed
Input schema / properties / iosXctestrunFileRemoved value: -{ - "description": "Externally built iOS XCTest runner .xctestrun artifact path.", - "type": "string" -} - removed
Input schema / properties / stateDirRemoved value: -{ - "description": "Agent-device state directory.", - "type": "string" -}
- Changed
screenshot8 fields changed- removed
Input schema / properties / cwdRemoved value: -{ - "description": "Working directory for command execution.", - "type": "string" -} - removed
Input schema / properties / daemonAuthTokenRemoved value: -{ - "description": "Remote daemon auth token.", - "type": "string" -} - removed
Input schema / properties / daemonBaseUrlRemoved value: -{ - "description": "Remote daemon base URL.", - "type": "string" -} - removed
Input schema / properties / iosSimulatorDeviceSetRemoved value: -{ - "description": "iOS simulator device-set path used for device resolution.", - "type": "string" -} - removed
Input schema / properties / iosXctestDerivedDataPathRemoved value: -{ - "description": "Derived data path for external iOS XCTest runner execution.", - "type": "string" -} - removed
Input schema / properties / iosXctestEnvDirRemoved value: -{ - "description": "Writable directory for iOS XCTest runner env overlays.", - "type": "string" -} - removed
Input schema / properties / iosXctestrunFileRemoved value: -{ - "description": "Externally built iOS XCTest runner .xctestrun artifact path.", - "type": "string" -} - removed
Input schema / properties / stateDirRemoved value: -{ - "description": "Agent-device state directory.", - "type": "string" -}
- Changed
scroll9 fields changed- removed
Input schema / properties / cwdRemoved value: -{ - "description": "Working directory for command execution.", - "type": "string" -} - removed
Input schema / properties / daemonAuthTokenRemoved value: -{ - "description": "Remote daemon auth token.", - "type": "string" -} - removed
Input schema / properties / daemonBaseUrlRemoved value: -{ - "description": "Remote daemon base URL.", - "type": "string" -} - removed
Input schema / properties / iosSimulatorDeviceSetRemoved value: -{ - "description": "iOS simulator device-set path used for device resolution.", - "type": "string" -} - removed
Input schema / properties / iosXctestDerivedDataPathRemoved value: -{ - "description": "Derived data path for external iOS XCTest runner execution.", - "type": "string" -} - removed
Input schema / properties / iosXctestEnvDirRemoved value: -{ - "description": "Writable directory for iOS XCTest runner env overlays.", - "type": "string" -} - removed
Input schema / properties / iosXctestrunFileRemoved value: -{ - "description": "Externally built iOS XCTest runner .xctestrun artifact path.", - "type": "string" -} - removed
Input schema / properties / stateDirRemoved value: -{ - "description": "Agent-device state directory.", - "type": "string" -} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "amount": { + "type": "number" + }, + "direction": { + "enum": [ + "up", + "down", + "left", + "right" + ], + "type": "string" + }, + "durationMs": { + "type": "number" + }, + "edge": { + "enum": [ + "top", + "bottom" + ], + "type": "string" + }, + "message": { + "type": "string" + }, + "passes": { + "description": "Edge scrolls only: how many scroll-and-check passes ran.", + "type": "number" + }, + "pixels": { + "type": "number" + }, + "settle": { + "properties": { + "captures": { + "type": "number" + }, + "diff": { + "description": "Settled diff vs the pre-action tree (changed lines only).", + "properties": { + "lines": { + "items": { + "properties": { + "kind": { + "enum": [ + "added", + "removed" + ], + "type": "string" + }, + "ref": { + "description": "Plain ref body (e12) for added lines.", + "type": "string" + }, + "text": { + "type": "string" + } + }, + "required": [ + "kind", + "text" + ], + "type": "object" + }, + "type": "array" + }, + "summary": { + "properties": { + "additions": { + "type": "number" + }, + "removals": { + "type": "number" + }, + "unchanged": { + "type": "number" + } + }, + "required": [ + "additions", + "removals", + "unchanged" + ], + "type": "object" + }, + "truncated": { + "description": "Lines were capped to the response bound.", + "type": "boolean" + } + }, + "required": [ + "summary", + "lines" + ], + "type": "object" + }, + "hint": { + "type": "string" + }, + "quietMs": { + "type": "number" + }, + "refs": { + "items": { + "properties": { + "ref": { + "description": "Plain ref body (e12) minted from the stored settled tree.", + "type": "string" + } + }, + "required": [ + "ref" + ], + "type": "object" + }, + "type": "array" + }, + "refsGeneration": { + "description": "Snapshot generation of the stored settled tree; refs on added diff lines were minted from it.", + "type": "number" + }, + "settled": { + "description": "Whether the UI held the quiet window before the deadline. false is advisory, not failure.", + "type": "boolean" + }, + "tail": { + "description": "Unchanged interactive refs tail: still-present, actionable elements from the settled tree, attached only when diff carries zero added-line refs (a modal-dismiss/toast-only diff).", + "items": { + "properties": { + "label": { + "type": "string" + }, + "ref": { + "description": "Plain ref body (e12) minted from the stored settled tree.", + "type": "string" + }, + "role": { + "type": "string" + } + }, + "required": [ + "ref", + "role" + ], + "type": "object" + }, + "type": "array" + }, + "tailTruncated": { + "description": "Present (true) when tail candidates exceeded the response cap.", + "type": "boolean" + }, + "timeoutMs": { + "type": "number" + }, + "waitedMs": { + "type": "number" + } + }, + "required": [ + "settled", + "waitedMs", + "captures", + "quietMs", + "timeoutMs" + ], + "type": "object" + } + }, + "required": [ + "direction" + ], + "type": "object" +}
- Changed
session8 fields changed- removed
Input schema / properties / cwdRemoved value: -{ - "description": "Working directory for command execution.", - "type": "string" -} - removed
Input schema / properties / daemonAuthTokenRemoved value: -{ - "description": "Remote daemon auth token.", - "type": "string" -} - removed
Input schema / properties / daemonBaseUrlRemoved value: -{ - "description": "Remote daemon base URL.", - "type": "string" -} - removed
Input schema / properties / iosSimulatorDeviceSetRemoved value: -{ - "description": "iOS simulator device-set path used for device resolution.", - "type": "string" -} - removed
Input schema / properties / iosXctestDerivedDataPathRemoved value: -{ - "description": "Derived data path for external iOS XCTest runner execution.", - "type": "string" -} - removed
Input schema / properties / iosXctestEnvDirRemoved value: -{ - "description": "Writable directory for iOS XCTest runner env overlays.", - "type": "string" -} - removed
Input schema / properties / iosXctestrunFileRemoved value: -{ - "description": "Externally built iOS XCTest runner .xctestrun artifact path.", - "type": "string" -} - removed
Input schema / properties / stateDirRemoved value: -{ - "description": "Agent-device state directory.", - "type": "string" -}
- Changed
settings8 fields changed- removed
Input schema / properties / cwdRemoved value: -{ - "description": "Working directory for command execution.", - "type": "string" -} - removed
Input schema / properties / daemonAuthTokenRemoved value: -{ - "description": "Remote daemon auth token.", - "type": "string" -} - removed
Input schema / properties / daemonBaseUrlRemoved value: -{ - "description": "Remote daemon base URL.", - "type": "string" -} - removed
Input schema / properties / iosSimulatorDeviceSetRemoved value: -{ - "description": "iOS simulator device-set path used for device resolution.", - "type": "string" -} - removed
Input schema / properties / iosXctestDerivedDataPathRemoved value: -{ - "description": "Derived data path for external iOS XCTest runner execution.", - "type": "string" -} - removed
Input schema / properties / iosXctestEnvDirRemoved value: -{ - "description": "Writable directory for iOS XCTest runner env overlays.", - "type": "string" -} - removed
Input schema / properties / iosXctestrunFileRemoved value: -{ - "description": "Externally built iOS XCTest runner .xctestrun artifact path.", - "type": "string" -} - removed
Input schema / properties / stateDirRemoved value: -{ - "description": "Agent-device state directory.", - "type": "string" -}
- Changed
shutdown8 fields changed- removed
Input schema / properties / cwdRemoved value: -{ - "description": "Working directory for command execution.", - "type": "string" -} - removed
Input schema / properties / daemonAuthTokenRemoved value: -{ - "description": "Remote daemon auth token.", - "type": "string" -} - removed
Input schema / properties / daemonBaseUrlRemoved value: -{ - "description": "Remote daemon base URL.", - "type": "string" -} - removed
Input schema / properties / iosSimulatorDeviceSetRemoved value: -{ - "description": "iOS simulator device-set path used for device resolution.", - "type": "string" -} - removed
Input schema / properties / iosXctestDerivedDataPathRemoved value: -{ - "description": "Derived data path for external iOS XCTest runner execution.", - "type": "string" -} - removed
Input schema / properties / iosXctestEnvDirRemoved value: -{ - "description": "Writable directory for iOS XCTest runner env overlays.", - "type": "string" -} - removed
Input schema / properties / iosXctestrunFileRemoved value: -{ - "description": "Externally built iOS XCTest runner .xctestrun artifact path.", - "type": "string" -} - removed
Input schema / properties / stateDirRemoved value: -{ - "description": "Agent-device state directory.", - "type": "string" -}
- Changed
snapshot8 fields changed- removed
Input schema / properties / cwdRemoved value: -{ - "description": "Working directory for command execution.", - "type": "string" -} - removed
Input schema / properties / daemonAuthTokenRemoved value: -{ - "description": "Remote daemon auth token.", - "type": "string" -} - removed
Input schema / properties / daemonBaseUrlRemoved value: -{ - "description": "Remote daemon base URL.", - "type": "string" -} - removed
Input schema / properties / iosSimulatorDeviceSetRemoved value: -{ - "description": "iOS simulator device-set path used for device resolution.", - "type": "string" -} - removed
Input schema / properties / iosXctestDerivedDataPathRemoved value: -{ - "description": "Derived data path for external iOS XCTest runner execution.", - "type": "string" -} - removed
Input schema / properties / iosXctestEnvDirRemoved value: -{ - "description": "Writable directory for iOS XCTest runner env overlays.", - "type": "string" -} - removed
Input schema / properties / iosXctestrunFileRemoved value: -{ - "description": "Externally built iOS XCTest runner .xctestrun artifact path.", - "type": "string" -} - removed
Input schema / properties / stateDirRemoved value: -{ - "description": "Agent-device state directory.", - "type": "string" -}
- Changed
swipe8 fields changed- removed
Input schema / properties / cwdRemoved value: -{ - "description": "Working directory for command execution.", - "type": "string" -} - removed
Input schema / properties / daemonAuthTokenRemoved value: -{ - "description": "Remote daemon auth token.", - "type": "string" -} - removed
Input schema / properties / daemonBaseUrlRemoved value: -{ - "description": "Remote daemon base URL.", - "type": "string" -} - removed
Input schema / properties / iosSimulatorDeviceSetRemoved value: -{ - "description": "iOS simulator device-set path used for device resolution.", - "type": "string" -} - removed
Input schema / properties / iosXctestDerivedDataPathRemoved value: -{ - "description": "Derived data path for external iOS XCTest runner execution.", - "type": "string" -} - removed
Input schema / properties / iosXctestEnvDirRemoved value: -{ - "description": "Writable directory for iOS XCTest runner env overlays.", - "type": "string" -} - removed
Input schema / properties / iosXctestrunFileRemoved value: -{ - "description": "Externally built iOS XCTest runner .xctestrun artifact path.", - "type": "string" -} - removed
Input schema / properties / stateDirRemoved value: -{ - "description": "Agent-device state directory.", - "type": "string" -}
- Changed
test8 fields changed- removed
Input schema / properties / cwdRemoved value: -{ - "description": "Working directory for command execution.", - "type": "string" -} - removed
Input schema / properties / daemonAuthTokenRemoved value: -{ - "description": "Remote daemon auth token.", - "type": "string" -} - removed
Input schema / properties / daemonBaseUrlRemoved value: -{ - "description": "Remote daemon base URL.", - "type": "string" -} - removed
Input schema / properties / iosSimulatorDeviceSetRemoved value: -{ - "description": "iOS simulator device-set path used for device resolution.", - "type": "string" -} - removed
Input schema / properties / iosXctestDerivedDataPathRemoved value: -{ - "description": "Derived data path for external iOS XCTest runner execution.", - "type": "string" -} - removed
Input schema / properties / iosXctestEnvDirRemoved value: -{ - "description": "Writable directory for iOS XCTest runner env overlays.", - "type": "string" -} - removed
Input schema / properties / iosXctestrunFileRemoved value: -{ - "description": "Externally built iOS XCTest runner .xctestrun artifact path.", - "type": "string" -} - removed
Input schema / properties / stateDirRemoved value: -{ - "description": "Agent-device state directory.", - "type": "string" -}
- Changed
trace8 fields changed- removed
Input schema / properties / cwdRemoved value: -{ - "description": "Working directory for command execution.", - "type": "string" -} - removed
Input schema / properties / daemonAuthTokenRemoved value: -{ - "description": "Remote daemon auth token.", - "type": "string" -} - removed
Input schema / properties / daemonBaseUrlRemoved value: -{ - "description": "Remote daemon base URL.", - "type": "string" -} - removed
Input schema / properties / iosSimulatorDeviceSetRemoved value: -{ - "description": "iOS simulator device-set path used for device resolution.", - "type": "string" -} - removed
Input schema / properties / iosXctestDerivedDataPathRemoved value: -{ - "description": "Derived data path for external iOS XCTest runner execution.", - "type": "string" -} - removed
Input schema / properties / iosXctestEnvDirRemoved value: -{ - "description": "Writable directory for iOS XCTest runner env overlays.", - "type": "string" -} - removed
Input schema / properties / iosXctestrunFileRemoved value: -{ - "description": "Externally built iOS XCTest runner .xctestrun artifact path.", - "type": "string" -} - removed
Input schema / properties / stateDirRemoved value: -{ - "description": "Agent-device state directory.", - "type": "string" -}
- Changed
trigger-app-event8 fields changed- removed
Input schema / properties / cwdRemoved value: -{ - "description": "Working directory for command execution.", - "type": "string" -} - removed
Input schema / properties / daemonAuthTokenRemoved value: -{ - "description": "Remote daemon auth token.", - "type": "string" -} - removed
Input schema / properties / daemonBaseUrlRemoved value: -{ - "description": "Remote daemon base URL.", - "type": "string" -} - removed
Input schema / properties / iosSimulatorDeviceSetRemoved value: -{ - "description": "iOS simulator device-set path used for device resolution.", - "type": "string" -} - removed
Input schema / properties / iosXctestDerivedDataPathRemoved value: -{ - "description": "Derived data path for external iOS XCTest runner execution.", - "type": "string" -} - removed
Input schema / properties / iosXctestEnvDirRemoved value: -{ - "description": "Writable directory for iOS XCTest runner env overlays.", - "type": "string" -} - removed
Input schema / properties / iosXctestrunFileRemoved value: -{ - "description": "Externally built iOS XCTest runner .xctestrun artifact path.", - "type": "string" -} - removed
Input schema / properties / stateDirRemoved value: -{ - "description": "Agent-device state directory.", - "type": "string" -}
- Changed
tv-remote8 fields changed- removed
Input schema / properties / cwdRemoved value: -{ - "description": "Working directory for command execution.", - "type": "string" -} - removed
Input schema / properties / daemonAuthTokenRemoved value: -{ - "description": "Remote daemon auth token.", - "type": "string" -} - removed
Input schema / properties / daemonBaseUrlRemoved value: -{ - "description": "Remote daemon base URL.", - "type": "string" -} - removed
Input schema / properties / iosSimulatorDeviceSetRemoved value: -{ - "description": "iOS simulator device-set path used for device resolution.", - "type": "string" -} - removed
Input schema / properties / iosXctestDerivedDataPathRemoved value: -{ - "description": "Derived data path for external iOS XCTest runner execution.", - "type": "string" -} - removed
Input schema / properties / iosXctestEnvDirRemoved value: -{ - "description": "Writable directory for iOS XCTest runner env overlays.", - "type": "string" -} - removed
Input schema / properties / iosXctestrunFileRemoved value: -{ - "description": "Externally built iOS XCTest runner .xctestrun artifact path.", - "type": "string" -} - removed
Input schema / properties / stateDirRemoved value: -{ - "description": "Agent-device state directory.", - "type": "string" -}
- Changed
type8 fields changed- removed
Input schema / properties / cwdRemoved value: -{ - "description": "Working directory for command execution.", - "type": "string" -} - removed
Input schema / properties / daemonAuthTokenRemoved value: -{ - "description": "Remote daemon auth token.", - "type": "string" -} - removed
Input schema / properties / daemonBaseUrlRemoved value: -{ - "description": "Remote daemon base URL.", - "type": "string" -} - removed
Input schema / properties / iosSimulatorDeviceSetRemoved value: -{ - "description": "iOS simulator device-set path used for device resolution.", - "type": "string" -} - removed
Input schema / properties / iosXctestDerivedDataPathRemoved value: -{ - "description": "Derived data path for external iOS XCTest runner execution.", - "type": "string" -} - removed
Input schema / properties / iosXctestEnvDirRemoved value: -{ - "description": "Writable directory for iOS XCTest runner env overlays.", - "type": "string" -} - removed
Input schema / properties / iosXctestrunFileRemoved value: -{ - "description": "Externally built iOS XCTest runner .xctestrun artifact path.", - "type": "string" -} - removed
Input schema / properties / stateDirRemoved value: -{ - "description": "Agent-device state directory.", - "type": "string" -}
- Changed
viewport8 fields changed- removed
Input schema / properties / cwdRemoved value: -{ - "description": "Working directory for command execution.", - "type": "string" -} - removed
Input schema / properties / daemonAuthTokenRemoved value: -{ - "description": "Remote daemon auth token.", - "type": "string" -} - removed
Input schema / properties / daemonBaseUrlRemoved value: -{ - "description": "Remote daemon base URL.", - "type": "string" -} - removed
Input schema / properties / iosSimulatorDeviceSetRemoved value: -{ - "description": "iOS simulator device-set path used for device resolution.", - "type": "string" -} - removed
Input schema / properties / iosXctestDerivedDataPathRemoved value: -{ - "description": "Derived data path for external iOS XCTest runner execution.", - "type": "string" -} - removed
Input schema / properties / iosXctestEnvDirRemoved value: -{ - "description": "Writable directory for iOS XCTest runner env overlays.", - "type": "string" -} - removed
Input schema / properties / iosXctestrunFileRemoved value: -{ - "description": "Externally built iOS XCTest runner .xctestrun artifact path.", - "type": "string" -} - removed
Input schema / properties / stateDirRemoved value: -{ - "description": "Agent-device state directory.", - "type": "string" -}
- Changed
wait8 fields changed- removed
Input schema / properties / cwdRemoved value: -{ - "description": "Working directory for command execution.", - "type": "string" -} - removed
Input schema / properties / daemonAuthTokenRemoved value: -{ - "description": "Remote daemon auth token.", - "type": "string" -} - removed
Input schema / properties / daemonBaseUrlRemoved value: -{ - "description": "Remote daemon base URL.", - "type": "string" -} - removed
Input schema / properties / iosSimulatorDeviceSetRemoved value: -{ - "description": "iOS simulator device-set path used for device resolution.", - "type": "string" -} - removed
Input schema / properties / iosXctestDerivedDataPathRemoved value: -{ - "description": "Derived data path for external iOS XCTest runner execution.", - "type": "string" -} - removed
Input schema / properties / iosXctestEnvDirRemoved value: -{ - "description": "Writable directory for iOS XCTest runner env overlays.", - "type": "string" -} - removed
Input schema / properties / iosXctestrunFileRemoved value: -{ - "description": "Externally built iOS XCTest runner .xctestrun artifact path.", - "type": "string" -} - removed
Input schema / properties / stateDirRemoved value: -{ - "description": "Agent-device state directory.", - "type": "string" -}
57 tool updates
v0.20.9- Changed
alert1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "vega", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "harmonyos", + "vega", + "linux", + "web", + "ios", + "macos" +]
- Changed
app-switcher1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "vega", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "harmonyos", + "vega", + "linux", + "web", + "ios", + "macos" +]
- Changed
apps1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "vega", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "harmonyos", + "vega", + "linux", + "web", + "ios", + "macos" +]
- Changed
appstate1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "vega", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "harmonyos", + "vega", + "linux", + "web", + "ios", + "macos" +]
- Changed
artifacts1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "vega", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "harmonyos", + "vega", + "linux", + "web", + "ios", + "macos" +]
- Changed
audio1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "vega", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "harmonyos", + "vega", + "linux", + "web", + "ios", + "macos" +]
- Changed
back1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "vega", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "harmonyos", + "vega", + "linux", + "web", + "ios", + "macos" +]
- Changed
batch2 fields changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "vega", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "harmonyos", + "vega", + "linux", + "web", + "ios", + "macos" +] - changed
Input schema / properties / steps / items / properties / command / enumPrevious value: -[ - "devices", - "capabilities", - "doctor", - "apps", - "boot", - "shutdown", - "appstate", - "perf", - "logs", - "network", - "audio", - "test", - "clipboard", - "keyboard", - "install", - "reinstall", - "push", - "trigger-app-event", - "open", - "close", - "snapshot", - "diff", - "wait", - "alert", - "settings", - "react-native", - "record", - "trace", - "find", - "click", - "fill", - "longpress", - "press", - "type", - "get", - "is", - "back", - "gesture", - "home", - "tv-remote", - "orientation", - "scroll", - "swipe", - "focus", - "screenshot", - "app-switcher", - "install-from-source" -]New value: +[ + "devices", + "capabilities", + "doctor", + "apps", + "boot", + "shutdown", + "appstate", + "perf", + "logs", + "network", + "audio", + "test", + "clipboard", + "keyboard", + "install", + "reinstall", + "push", + "trigger-app-event", + "open", + "close", + "snapshot", + "diff", + "wait", + "alert", + "settings", + "react-native", + "record", + "trace", + "find", + "click", + "fill", + "longpress", + "hover", + "press", + "type", + "get", + "is", + "back", + "gesture", + "home", + "tv-remote", + "orientation", + "scroll", + "swipe", + "focus", + "screenshot", + "app-switcher", + "install-from-source" +]
- Changed
boot2 fields changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "vega", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "harmonyos", + "vega", + "linux", + "web", + "ios", + "macos" +] - changed
Output schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "vega", - "linux", - "web" -]New value: +[ + "ios", + "macos", + "android", + "harmonyos", + "vega", + "linux", + "web" +]
- Changed
capabilities1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "vega", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "harmonyos", + "vega", + "linux", + "web", + "ios", + "macos" +]
- Changed
click2 fields changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "vega", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "harmonyos", + "vega", + "linux", + "web", + "ios", + "macos" +] - changed
Output schema / properties / resolution / oneOfPrevious value: -[ - { - "properties": { - "kind": { - "const": "unique", - "type": "string" - }, - "phase": { - "const": "pre-action", - "type": "string" - }, - "source": { - "const": "runtime", - "type": "string" - } - }, - "required": [ - "source", - "phase", - "kind" - ], - "type": "object" - }, - { - "properties": { - "alternatives": { - "description": "At most 5 losing candidates, document order. Present at default/full response levels and omitted in digest. The winner is never included.", - "items": { - "properties": { - "diagnosticRef": { - "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.", - "type": "string" - }, - "label": { - "description": "UTF-8 truncated to 256 bytes.", - "type": "string" - }, - "role": { - "description": "UTF-8 truncated to 256 bytes.", - "type": "string" - } - }, - "required": [ - "diagnosticRef" - ], - "type": "object" - }, - "type": "array" - }, - "kind": { - "const": "disambiguated", - "type": "string" - }, - "matchCount": { - "description": "Total matches resolveSelectorChain found before disambiguation.", - "type": "number" - }, - "phase": { - "const": "pre-action", - "type": "string" - }, - "source": { - "const": "runtime", - "type": "string" - }, - "tiebreak": { - "description": "The comparison that decided the winner.", - "enum": [ - "visible", - "deepest", - "smallest-area" - ], - "type": "string" - }, - "winnerDiagnostic": { - "properties": { - "diagnosticRef": { - "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.", - "type": "string" - }, - "label": { - "description": "UTF-8 truncated to 256 bytes.", - "type": "string" - }, - "role": { - "description": "UTF-8 truncated to 256 bytes.", - "type": "string" - } - }, - "required": [ - "diagnosticRef" - ], - "type": "object" - } - }, - "required": [ - "source", - "phase", - "kind", - "matchCount", - "winnerDiagnostic", - "tiebreak" - ], - "type": "object" - }, - { - "properties": { - "kind": { - "const": "exact", - "type": "string" - }, - "phase": { - "const": "pre-action", - "type": "string" - }, - "source": { - "const": "ref", - "type": "string" - } - }, - "required": [ - "source", - "phase", - "kind" - ], - "type": "object" - }, - { - "properties": { - "kind": { - "const": "label-fallback", - "type": "string" - }, - "phase": { - "const": "pre-action", - "type": "string" - }, - "source": { - "const": "ref", - "type": "string" - } - }, - "required": [ - "source", - "phase", - "kind" - ], - "type": "object" - }, - { - "properties": { - "kind": { - "const": "not-observed", - "type": "string" - }, - "source": { - "const": "direct-ios", - "type": "string" - } - }, - "required": [ - "source", - "kind" - ], - "type": "object" - } -]New value: +[ + { + "properties": { + "kind": { + "const": "unique", + "type": "string" + }, + "phase": { + "const": "pre-action", + "type": "string" + }, + "source": { + "const": "runtime", + "type": "string" + } + }, + "required": [ + "source", + "phase", + "kind" + ], + "type": "object" + }, + { + "properties": { + "alternatives": { + "description": "At most 5 losing candidates, document order. Present at default/full response levels and omitted in digest. The winner is never included.", + "items": { + "properties": { + "diagnosticRef": { + "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.", + "type": "string" + }, + "label": { + "description": "UTF-8 truncated to 256 bytes.", + "type": "string" + }, + "role": { + "description": "UTF-8 truncated to 256 bytes.", + "type": "string" + } + }, + "required": [ + "diagnosticRef" + ], + "type": "object" + }, + "type": "array" + }, + "kind": { + "const": "disambiguated", + "type": "string" + }, + "matchCount": { + "description": "Total matches resolveSelectorChain found before disambiguation.", + "type": "number" + }, + "phase": { + "const": "pre-action", + "type": "string" + }, + "source": { + "const": "runtime", + "type": "string" + }, + "tiebreak": { + "description": "The comparison that decided the winner.", + "enum": [ + "visible", + "deepest", + "smallest-area", + "structural-equivalence" + ], + "type": "string" + }, + "winnerDiagnostic": { + "properties": { + "diagnosticRef": { + "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.", + "type": "string" + }, + "label": { + "description": "UTF-8 truncated to 256 bytes.", + "type": "string" + }, + "role": { + "description": "UTF-8 truncated to 256 bytes.", + "type": "string" + } + }, + "required": [ + "diagnosticRef" + ], + "type": "object" + } + }, + "required": [ + "source", + "phase", + "kind", + "matchCount", + "winnerDiagnostic", + "tiebreak" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "const": "exact", + "type": "string" + }, + "phase": { + "const": "pre-action", + "type": "string" + }, + "source": { + "const": "ref", + "type": "string" + } + }, + "required": [ + "source", + "phase", + "kind" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "const": "label-fallback", + "type": "string" + }, + "phase": { + "const": "pre-action", + "type": "string" + }, + "source": { + "const": "ref", + "type": "string" + } + }, + "required": [ + "source", + "phase", + "kind" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "const": "not-observed", + "type": "string" + }, + "source": { + "const": "direct-ios", + "type": "string" + } + }, + "required": [ + "source", + "kind" + ], + "type": "object" + } +]
- Changed
clipboard1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "vega", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "harmonyos", + "vega", + "linux", + "web", + "ios", + "macos" +]
- Changed
close1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "vega", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "harmonyos", + "vega", + "linux", + "web", + "ios", + "macos" +]
- Changed
debug1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "vega", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "harmonyos", + "vega", + "linux", + "web", + "ios", + "macos" +]
- Changed
devices2 fields changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "vega", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "harmonyos", + "vega", + "linux", + "web", + "ios", + "macos" +] - changed
Output schema / properties / devices / items / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "vega", - "linux", - "web" -]New value: +[ + "ios", + "macos", + "android", + "harmonyos", + "vega", + "linux", + "web" +]
- Changed
diff1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "vega", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "harmonyos", + "vega", + "linux", + "web", + "ios", + "macos" +]
- Changed
doctor1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "vega", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "harmonyos", + "vega", + "linux", + "web", + "ios", + "macos" +]
- Changed
events1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "vega", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "harmonyos", + "vega", + "linux", + "web", + "ios", + "macos" +]
- Changed
fill5 fields changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "vega", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "harmonyos", + "vega", + "linux", + "web", + "ios", + "macos" +] - added
Output schema / descriptionAdded value: +"Fill response. Android may return target-bound unconfirmed evidence when the exact app-owned field changed but formatting prevented raw equality." - added
Output schema / oneOfAdded value: +[ + { + "not": { + "properties": {}, + "required": [ + "verification" + ], + "type": "object" + }, + "properties": { + "cost": { + "properties": { + "nodeCount": { + "description": "Number of nodes in the original node tree when the response carries one.", + "type": "number" + }, + "runnerRoundTrips": { + "description": "Number of real runner round-trips made while serving the request.", + "type": "number" + }, + "wallClockMs": { + "description": "Total wall-clock time for the request in milliseconds.", + "type": "number" + } + }, + "required": [ + "wallClockMs", + "runnerRoundTrips" + ], + "type": "object" + }, + "delayMs": { + "description": "Delay between typed characters in milliseconds.", + "type": "number" + }, + "evidence": { + "properties": { + "changedFromBefore": { + "description": "Whether the post-action digest differs from the pre-action capture digest. false is evidence, not failure.", + "type": "boolean" + }, + "digest": { + "description": "Order-independent digest of the post-action node multiset.", + "type": "string" + }, + "foregroundApp": { + "description": "Foreground app bundle id or name, when the capture carries it.", + "type": "string" + }, + "interactiveNodeCount": { + "description": "Subset of nodeCount the platform reports as hittable.", + "type": "number" + }, + "nodeCount": { + "description": "Node count in the post-action interactive-only capture.", + "type": "number" + } + }, + "required": [ + "nodeCount", + "interactiveNodeCount", + "digest", + "changedFromBefore" + ], + "type": "object" + }, + "hint": { + "type": "string" + }, + "maestroFallbackReason": { + "const": "non-hittable-coordinate", + "type": "string" + }, + "maestroNonHittableCoordinateFallbackAllowed": { + "description": "Whether the direct iOS Maestro coordinate fallback was allowed for this selector.", + "type": "boolean" + }, + "maestroNonHittableCoordinateFallbackUsed": { + "description": "Whether the direct iOS Maestro coordinate fallback was actually used.", + "type": "boolean" + }, + "message": { + "type": "string" + }, + "ref": { + "description": "Snapshot ref without the @ prefix when the target was an @ref.", + "type": "string" + }, + "refLabel": { + "type": "string" + }, + "referenceHeight": { + "description": "Reference frame height for visualizing the interaction point.", + "type": "number" + }, + "referenceWidth": { + "description": "Reference frame width for visualizing the interaction point.", + "type": "number" + }, + "resolution": { + "description": "Pre-action disclosure of how the acting path resolved its target. Absent when resolutionDisclosure is inapplicable for the path.", + "oneOf": [ + { + "properties": { + "kind": { + "const": "unique", + "type": "string" + }, + "phase": { + "const": "pre-action", + "type": "string" + }, + "source": { + "const": "runtime", + "type": "string" + } + }, + "required": [ + "source", + "phase", + "kind" + ], + "type": "object" + }, + { + "properties": { + "alternatives": { + "description": "At most 5 losing candidates, document order. Present at default/full response levels and omitted in digest. The winner is never included.", + "items": { + "properties": { + "diagnosticRef": { + "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.", + "type": "string" + }, + "label": { + "description": "UTF-8 truncated to 256 bytes.", + "type": "string" + }, + "role": { + "description": "UTF-8 truncated to 256 bytes.", + "type": "string" + } + }, + "required": [ + "diagnosticRef" + ], + "type": "object" + }, + "type": "array" + }, + "kind": { + "const": "disambiguated", + "type": "string" + }, + "matchCount": { + "description": "Total matches resolveSelectorChain found before disambiguation.", + "type": "number" + }, + "phase": { + "const": "pre-action", + "type": "string" + }, + "source": { + "const": "runtime", + "type": "string" + }, + "tiebreak": { + "description": "The comparison that decided the winner.", + "enum": [ + "visible", + "deepest", + "smallest-area", + "structural-equivalence" + ], + "type": "string" + }, + "winnerDiagnostic": { + "properties": { + "diagnosticRef": { + "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.", + "type": "string" + }, + "label": { + "description": "UTF-8 truncated to 256 bytes.", + "type": "string" + }, + "role": { + "description": "UTF-8 truncated to 256 bytes.", + "type": "string" + } + }, + "required": [ + "diagnosticRef" + ], + "type": "object" + } + }, + "required": [ + "source", + "phase", + "kind", + "matchCount", + "winnerDiagnostic", + "tiebreak" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "const": "exact", + "type": "string" + }, + "phase": { + "const": "pre-action", + "type": "string" + }, + "source": { + "const": "ref", + "type": "string" + } + }, + "required": [ + "source", + "phase", + "kind" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "const": "label-fallback", + "type": "string" + }, + "phase": { + "const": "pre-action", + "type": "string" + }, + "source": { + "const": "ref", + "type": "string" + } + }, + "required": [ + "source", + "phase", + "kind" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "const": "not-observed", + "type": "string" + }, + "source": { + "const": "direct-ios", + "type": "string" + } + }, + "required": [ + "source", + "kind" + ], + "type": "object" + } + ], + "type": "object" + }, + "selector": { + "description": "Selector expression when the target was a selector.", + "type": "string" + }, + "selectorChain": { + "items": { + "type": "string" + }, + "type": "array" + }, + "settle": { + "properties": { + "captures": { + "type": "number" + }, + "diff": { + "description": "Settled diff vs the pre-action tree (changed lines only).", + "properties": { + "lines": { + "items": { + "properties": { + "kind": { + "enum": [ + "added", + "removed" + ], + "type": "string" + }, + "ref": { + "description": "Plain ref body (e12) for added lines.", + "type": "string" + }, + "text": { + "type": "string" + } + }, + "required": [ + "kind", + "text" + ], + "type": "object" + }, + "type": "array" + }, + "summary": { + "properties": { + "additions": { + "type": "number" + }, + "removals": { + "type": "number" + }, + "unchanged": { + "type": "number" + } + }, + "required": [ + "additions", + "removals", + "unchanged" + ], + "type": "object" + }, + "truncated": { + "description": "Lines were capped to the response bound.", + "type": "boolean" + } + }, + "required": [ + "summary", + "lines" + ], + "type": "object" + }, + "hint": { + "type": "string" + }, + "quietMs": { + "type": "number" + }, + "refs": { + "items": { + "properties": { + "ref": { + "description": "Plain ref body (e12) minted from the stored settled tree.", + "type": "string" + } + }, + "required": [ + "ref" + ], + "type": "object" + }, + "type": "array" + }, + "refsGeneration": { + "description": "Snapshot generation of the stored settled tree; refs on added diff lines were minted from it.", + "type": "number" + }, + "settled": { + "description": "Whether the UI held the quiet window before the deadline. false is advisory, not failure.", + "type": "boolean" + }, + "tail": { + "description": "Unchanged interactive refs tail: still-present, actionable elements from the settled tree, attached only when diff carries zero added-line refs (a modal-dismiss/toast-only diff).", + "items": { + "properties": { + "label": { + "type": "string" + }, + "ref": { + "description": "Plain ref body (e12) minted from the stored settled tree.", + "type": "string" + }, + "role": { + "type": "string" + } + }, + "required": [ + "ref", + "role" + ], + "type": "object" + }, + "type": "array" + }, + "tailTruncated": { + "description": "Present (true) when tail candidates exceeded the response cap.", + "type": "boolean" + }, + "timeoutMs": { + "type": "number" + }, + "waitedMs": { + "type": "number" + } + }, + "required": [ + "settled", + "waitedMs", + "captures", + "quietMs", + "timeoutMs" + ], + "type": "object" + }, + "targetHittable": { + "type": "boolean" + }, + "targetKind": { + "description": "Resolved interaction target kind.", + "enum": [ + "point", + "ref", + "selector" + ], + "type": "string" + }, + "text": { + "description": "Text submitted to the field.", + "type": "string" + }, + "warning": { + "type": "string" + }, + "x": { + "description": "Resolved interaction x coordinate when available.", + "type": "number" + }, + "y": { + "description": "Resolved interaction y coordinate when available.", + "type": "number" + } + }, + "required": [ + "targetKind", + "text" + ], + "type": "object" + }, + { + "properties": { + "after": { + "description": "Raw target text captured after the fill.", + "type": [ + "string", + "null" + ] + }, + "before": { + "description": "Raw target text captured before the fill.", + "type": [ + "string", + "null" + ] + }, + "cost": { + "properties": { + "nodeCount": { + "description": "Number of nodes in the original node tree when the response carries one.", + "type": "number" + }, + "runnerRoundTrips": { + "description": "Number of real runner round-trips made while serving the request.", + "type": "number" + }, + "wallClockMs": { + "description": "Total wall-clock time for the request in milliseconds.", + "type": "number" + } + }, + "required": [ + "wallClockMs", + "runnerRoundTrips" + ], + "type": "object" + }, + "delayMs": { + "description": "Delay between typed characters in milliseconds.", + "type": "number" + }, + "evidence": { + "properties": { + "changedFromBefore": { + "description": "Whether the post-action digest differs from the pre-action capture digest. false is evidence, not failure.", + "type": "boolean" + }, + "digest": { + "description": "Order-independent digest of the post-action node multiset.", + "type": "string" + }, + "foregroundApp": { + "description": "Foreground app bundle id or name, when the capture carries it.", + "type": "string" + }, + "interactiveNodeCount": { + "description": "Subset of nodeCount the platform reports as hittable.", + "type": "number" + }, + "nodeCount": { + "description": "Node count in the post-action interactive-only capture.", + "type": "number" + } + }, + "required": [ + "nodeCount", + "interactiveNodeCount", + "digest", + "changedFromBefore" + ], + "type": "object" + }, + "hint": { + "type": "string" + }, + "maestroFallbackReason": { + "const": "non-hittable-coordinate", + "type": "string" + }, + "maestroNonHittableCoordinateFallbackAllowed": { + "description": "Whether the direct iOS Maestro coordinate fallback was allowed for this selector.", + "type": "boolean" + }, + "maestroNonHittableCoordinateFallbackUsed": { + "description": "Whether the direct iOS Maestro coordinate fallback was actually used.", + "type": "boolean" + }, + "message": { + "type": "string" + }, + "ref": { + "description": "Snapshot ref without the @ prefix when the target was an @ref.", + "type": "string" + }, + "refLabel": { + "type": "string" + }, + "referenceHeight": { + "description": "Reference frame height for visualizing the interaction point.", + "type": "number" + }, + "referenceWidth": { + "description": "Reference frame width for visualizing the interaction point.", + "type": "number" + }, + "requested": { + "description": "Literal text requested by the fill command.", + "type": "string" + }, + "resolution": { + "description": "Pre-action disclosure of how the acting path resolved its target. Absent when resolutionDisclosure is inapplicable for the path.", + "oneOf": [ + { + "properties": { + "kind": { + "const": "unique", + "type": "string" + }, + "phase": { + "const": "pre-action", + "type": "string" + }, + "source": { + "const": "runtime", + "type": "string" + } + }, + "required": [ + "source", + "phase", + "kind" + ], + "type": "object" + }, + { + "properties": { + "alternatives": { + "description": "At most 5 losing candidates, document order. Present at default/full response levels and omitted in digest. The winner is never included.", + "items": { + "properties": { + "diagnosticRef": { + "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.", + "type": "string" + }, + "label": { + "description": "UTF-8 truncated to 256 bytes.", + "type": "string" + }, + "role": { + "description": "UTF-8 truncated to 256 bytes.", + "type": "string" + } + }, + "required": [ + "diagnosticRef" + ], + "type": "object" + }, + "type": "array" + }, + "kind": { + "const": "disambiguated", + "type": "string" + }, + "matchCount": { + "description": "Total matches resolveSelectorChain found before disambiguation.", + "type": "number" + }, + "phase": { + "const": "pre-action", + "type": "string" + }, + "source": { + "const": "runtime", + "type": "string" + }, + "tiebreak": { + "description": "The comparison that decided the winner.", + "enum": [ + "visible", + "deepest", + "smallest-area", + "structural-equivalence" + ], + "type": "string" + }, + "winnerDiagnostic": { + "properties": { + "diagnosticRef": { + "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.", + "type": "string" + }, + "label": { + "description": "UTF-8 truncated to 256 bytes.", + "type": "string" + }, + "role": { + "description": "UTF-8 truncated to 256 bytes.", + "type": "string" + } + }, + "required": [ + "diagnosticRef" + ], + "type": "object" + } + }, + "required": [ + "source", + "phase", + "kind", + "matchCount", + "winnerDiagnostic", + "tiebreak" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "const": "exact", + "type": "string" + }, + "phase": { + "const": "pre-action", + "type": "string" + }, + "source": { + "const": "ref", + "type": "string" + } + }, + "required": [ + "source", + "phase", + "kind" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "const": "label-fallback", + "type": "string" + }, + "phase": { + "const": "pre-action", + "type": "string" + }, + "source": { + "const": "ref", + "type": "string" + } + }, + "required": [ + "source", + "phase", + "kind" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "const": "not-observed", + "type": "string" + }, + "source": { + "const": "direct-ios", + "type": "string" + } + }, + "required": [ + "source", + "kind" + ], + "type": "object" + } + ], + "type": "object" + }, + "selector": { + "description": "Selector expression when the target was a selector.", + "type": "string" + }, + "selectorChain": { + "items": { + "type": "string" + }, + "type": "array" + }, + "settle": { + "properties": { + "captures": { + "type": "number" + }, + "diff": { + "description": "Settled diff vs the pre-action tree (changed lines only).", + "properties": { + "lines": { + "items": { + "properties": { + "kind": { + "enum": [ + "added", + "removed" + ], + "type": "string" + }, + "ref": { + "description": "Plain ref body (e12) for added lines.", + "type": "string" + }, + "text": { + "type": "string" + } + }, + "required": [ + "kind", + "text" + ], + "type": "object" + }, + "type": "array" + }, + "summary": { + "properties": { + "additions": { + "type": "number" + }, + "removals": { + "type": "number" + }, + "unchanged": { + "type": "number" + } + }, + "required": [ + "additions", + "removals", + "unchanged" + ], + "type": "object" + }, + "truncated": { + "description": "Lines were capped to the response bound.", + "type": "boolean" + } + }, + "required": [ + "summary", + "lines" + ], + "type": "object" + }, + "hint": { + "type": "string" + }, + "quietMs": { + "type": "number" + }, + "refs": { + "items": { + "properties": { + "ref": { + "description": "Plain ref body (e12) minted from the stored settled tree.", + "type": "string" + } + }, + "required": [ + "ref" + ], + "type": "object" + }, + "type": "array" + }, + "refsGeneration": { + "description": "Snapshot generation of the stored settled tree; refs on added diff lines were minted from it.", + "type": "number" + }, + "settled": { + "description": "Whether the UI held the quiet window before the deadline. false is advisory, not failure.", + "type": "boolean" + }, + "tail": { + "description": "Unchanged interactive refs tail: still-present, actionable elements from the settled tree, attached only when diff carries zero added-line refs (a modal-dismiss/toast-only diff).", + "items": { + "properties": { + "label": { + "type": "string" + }, + "ref": { + "description": "Plain ref body (e12) minted from the stored settled tree.", + "type": "string" + }, + "role": { + "type": "string" + } + }, + "required": [ + "ref", + "role" + ], + "type": "object" + }, + "type": "array" + }, + "tailTruncated": { + "description": "Present (true) when tail candidates exceeded the response cap.", + "type": "boolean" + }, + "timeoutMs": { + "type": "number" + }, + "waitedMs": { + "type": "number" + } + }, + "required": [ + "settled", + "waitedMs", + "captures", + "quietMs", + "timeoutMs" + ], + "type": "object" + }, + "target": { + "description": "Target identity captured before fill and matched after fill.", + "properties": { + "className": { + "description": "Android class name of the exact field that changed.", + "type": [ + "string", + "null" + ] + }, + "packageName": { + "description": "Android package name that owns the exact field.", + "type": [ + "string", + "null" + ] + }, + "rect": { + "description": "Screen-space rectangle of the exact field that changed.", + "properties": { + "height": { + "type": "number" + }, + "width": { + "type": "number" + }, + "x": { + "type": "number" + }, + "y": { + "type": "number" + } + }, + "required": [ + "x", + "y", + "width", + "height" + ], + "type": "object" + }, + "resourceId": { + "description": "Android resource id of the exact field that changed.", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "resourceId", + "className", + "packageName", + "rect" + ], + "type": "object" + }, + "targetHittable": { + "type": "boolean" + }, + "targetKind": { + "description": "Resolved interaction target kind.", + "enum": [ + "point", + "ref", + "selector" + ], + "type": "string" + }, + "text": { + "description": "Text submitted to the field.", + "type": "string" + }, + "verification": { + "const": "unconfirmed", + "type": "string" + }, + "warning": { + "type": "string" + }, + "x": { + "description": "Resolved interaction x coordinate when available.", + "type": "number" + }, + "y": { + "description": "Resolved interaction y coordinate when available.", + "type": "number" + } + }, + "required": [ + "targetKind", + "text", + "verification", + "requested", + "before", + "after", + "target" + ], + "type": "object" + } +] - removed
Output schema / propertiesRemoved value: -{ - "cost": { - "properties": { - "nodeCount": { - "description": "Number of nodes in the original node tree when the response carries one.", - "type": "number" - }, - "runnerRoundTrips": { - "description": "Number of real runner round-trips made while serving the request.", - "type": "number" - }, - "wallClockMs": { - "description": "Total wall-clock time for the request in milliseconds.", - "type": "number" - } - }, - "required": [ - "wallClockMs", - "runnerRoundTrips" - ], - "type": "object" - }, - "delayMs": { - "description": "Delay between typed characters in milliseconds.", - "type": "number" - }, - "evidence": { - "properties": { - "changedFromBefore": { - "description": "Whether the post-action digest differs from the pre-action capture digest. false is evidence, not failure.", - "type": "boolean" - }, - "digest": { - "description": "Order-independent digest of the post-action node multiset.", - "type": "string" - }, - "foregroundApp": { - "description": "Foreground app bundle id or name, when the capture carries it.", - "type": "string" - }, - "interactiveNodeCount": { - "description": "Subset of nodeCount the platform reports as hittable.", - "type": "number" - }, - "nodeCount": { - "description": "Node count in the post-action interactive-only capture.", - "type": "number" - } - }, - "required": [ - "nodeCount", - "interactiveNodeCount", - "digest", - "changedFromBefore" - ], - "type": "object" - }, - "hint": { - "type": "string" - }, - "maestroFallbackReason": { - "const": "non-hittable-coordinate", - "type": "string" - }, - "maestroNonHittableCoordinateFallbackAllowed": { - "description": "Whether the direct iOS Maestro coordinate fallback was allowed for this selector.", - "type": "boolean" - }, - "maestroNonHittableCoordinateFallbackUsed": { - "description": "Whether the direct iOS Maestro coordinate fallback was actually used.", - "type": "boolean" - }, - "message": { - "type": "string" - }, - "ref": { - "description": "Snapshot ref without the @ prefix when the target was an @ref.", - "type": "string" - }, - "refLabel": { - "type": "string" - }, - "referenceHeight": { - "description": "Reference frame height for visualizing the interaction point.", - "type": "number" - }, - "referenceWidth": { - "description": "Reference frame width for visualizing the interaction point.", - "type": "number" - }, - "resolution": { - "description": "Pre-action disclosure of how the acting path resolved its target. Absent when resolutionDisclosure is inapplicable for the path.", - "oneOf": [ - { - "properties": { - "kind": { - "const": "unique", - "type": "string" - }, - "phase": { - "const": "pre-action", - "type": "string" - }, - "source": { - "const": "runtime", - "type": "string" - } - }, - "required": [ - "source", - "phase", - "kind" - ], - "type": "object" - }, - { - "properties": { - "alternatives": { - "description": "At most 5 losing candidates, document order. Present at default/full response levels and omitted in digest. The winner is never included.", - "items": { - "properties": { - "diagnosticRef": { - "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.", - "type": "string" - }, - "label": { - "description": "UTF-8 truncated to 256 bytes.", - "type": "string" - }, - "role": { - "description": "UTF-8 truncated to 256 bytes.", - "type": "string" - } - }, - "required": [ - "diagnosticRef" - ], - "type": "object" - }, - "type": "array" - }, - "kind": { - "const": "disambiguated", - "type": "string" - }, - "matchCount": { - "description": "Total matches resolveSelectorChain found before disambiguation.", - "type": "number" - }, - "phase": { - "const": "pre-action", - "type": "string" - }, - "source": { - "const": "runtime", - "type": "string" - }, - "tiebreak": { - "description": "The comparison that decided the winner.", - "enum": [ - "visible", - "deepest", - "smallest-area" - ], - "type": "string" - }, - "winnerDiagnostic": { - "properties": { - "diagnosticRef": { - "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.", - "type": "string" - }, - "label": { - "description": "UTF-8 truncated to 256 bytes.", - "type": "string" - }, - "role": { - "description": "UTF-8 truncated to 256 bytes.", - "type": "string" - } - }, - "required": [ - "diagnosticRef" - ], - "type": "object" - } - }, - "required": [ - "source", - "phase", - "kind", - "matchCount", - "winnerDiagnostic", - "tiebreak" - ], - "type": "object" - }, - { - "properties": { - "kind": { - "const": "exact", - "type": "string" - }, - "phase": { - "const": "pre-action", - "type": "string" - }, - "source": { - "const": "ref", - "type": "string" - } - }, - "required": [ - "source", - "phase", - "kind" - ], - "type": "object" - }, - { - "properties": { - "kind": { - "const": "label-fallback", - "type": "string" - }, - "phase": { - "const": "pre-action", - "type": "string" - }, - "source": { - "const": "ref", - "type": "string" - } - }, - "required": [ - "source", - "phase", - "kind" - ], - "type": "object" - }, - { - "properties": { - "kind": { - "const": "not-observed", - "type": "string" - }, - "source": { - "const": "direct-ios", - "type": "string" - } - }, - "required": [ - "source", - "kind" - ], - "type": "object" - } - ], - "type": "object" - }, - "selector": { - "description": "Selector expression when the target was a selector.", - "type": "string" - }, - "selectorChain": { - "items": { - "type": "string" - }, - "type": "array" - }, - "settle": { - "properties": { - "captures": { - "type": "number" - }, - "diff": { - "description": "Settled diff vs the pre-action tree (changed lines only).", - "properties": { - "lines": { - "items": { - "properties": { - "kind": { - "enum": [ - "added", - "removed" - ], - "type": "string" - }, - "ref": { - "description": "Plain ref body (e12) for added lines.", - "type": "string" - }, - "text": { - "type": "string" - } - }, - "required": [ - "kind", - "text" - ], - "type": "object" - }, - "type": "array" - }, - "summary": { - "properties": { - "additions": { - "type": "number" - }, - "removals": { - "type": "number" - }, - "unchanged": { - "type": "number" - } - }, - "required": [ - "additions", - "removals", - "unchanged" - ], - "type": "object" - }, - "truncated": { - "description": "Lines were capped to the response bound.", - "type": "boolean" - } - }, - "required": [ - "summary", - "lines" - ], - "type": "object" - }, - "hint": { - "type": "string" - }, - "quietMs": { - "type": "number" - }, - "refs": { - "items": { - "properties": { - "ref": { - "description": "Plain ref body (e12) minted from the stored settled tree.", - "type": "string" - } - }, - "required": [ - "ref" - ], - "type": "object" - }, - "type": "array" - }, - "refsGeneration": { - "description": "Snapshot generation of the stored settled tree; refs on added diff lines were minted from it.", - "type": "number" - }, - "settled": { - "description": "Whether the UI held the quiet window before the deadline. false is advisory, not failure.", - "type": "boolean" - }, - "tail": { - "description": "Unchanged interactive refs tail: still-present, actionable elements from the settled tree, attached only when diff carries zero added-line refs (a modal-dismiss/toast-only diff).", - "items": { - "properties": { - "label": { - "type": "string" - }, - "ref": { - "description": "Plain ref body (e12) minted from the stored settled tree.", - "type": "string" - }, - "role": { - "type": "string" - } - }, - "required": [ - "ref", - "role" - ], - "type": "object" - }, - "type": "array" - }, - "tailTruncated": { - "description": "Present (true) when tail candidates exceeded the response cap.", - "type": "boolean" - }, - "timeoutMs": { - "type": "number" - }, - "waitedMs": { - "type": "number" - } - }, - "required": [ - "settled", - "waitedMs", - "captures", - "quietMs", - "timeoutMs" - ], - "type": "object" - }, - "targetHittable": { - "type": "boolean" - }, - "targetKind": { - "description": "Resolved interaction target kind.", - "enum": [ - "point", - "ref", - "selector" - ], - "type": "string" - }, - "text": { - "description": "Text submitted to the field.", - "type": "string" - }, - "warning": { - "type": "string" - }, - "x": { - "description": "Resolved interaction x coordinate when available.", - "type": "number" - }, - "y": { - "description": "Resolved interaction y coordinate when available.", - "type": "number" - } -} - removed
Output schema / requiredRemoved value: -[ - "targetKind", - "text" -]
- Changed
find1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "vega", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "harmonyos", + "vega", + "linux", + "web", + "ios", + "macos" +]
- Changed
focus1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "vega", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "harmonyos", + "vega", + "linux", + "web", + "ios", + "macos" +]
- Changed
gesture1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "vega", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "harmonyos", + "vega", + "linux", + "web", + "ios", + "macos" +]
- Changed
get1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "vega", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "harmonyos", + "vega", + "linux", + "web", + "ios", + "macos" +]
- Added
help - Changed
home1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "vega", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "harmonyos", + "vega", + "linux", + "web", + "ios", + "macos" +]
- Added
hover - Changed
install1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "vega", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "harmonyos", + "vega", + "linux", + "web", + "ios", + "macos" +]
- Changed
install-from-source1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "vega", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "harmonyos", + "vega", + "linux", + "web", + "ios", + "macos" +]
- Changed
is1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "vega", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "harmonyos", + "vega", + "linux", + "web", + "ios", + "macos" +]
- Changed
keyboard2 fields changed- changed
Input schema / properties / action / enumPrevious value: -[ - "status", - "dismiss" -]New value: +[ + "status", + "dismiss", + "enter", + "return" +] - changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "vega", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "harmonyos", + "vega", + "linux", + "web", + "ios", + "macos" +]
- Changed
logs1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "vega", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "harmonyos", + "vega", + "linux", + "web", + "ios", + "macos" +]
- Changed
longpress2 fields changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "vega", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "harmonyos", + "vega", + "linux", + "web", + "ios", + "macos" +] - changed
Output schema / properties / resolution / oneOfPrevious value: -[ - { - "properties": { - "kind": { - "const": "unique", - "type": "string" - }, - "phase": { - "const": "pre-action", - "type": "string" - }, - "source": { - "const": "runtime", - "type": "string" - } - }, - "required": [ - "source", - "phase", - "kind" - ], - "type": "object" - }, - { - "properties": { - "alternatives": { - "description": "At most 5 losing candidates, document order. Present at default/full response levels and omitted in digest. The winner is never included.", - "items": { - "properties": { - "diagnosticRef": { - "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.", - "type": "string" - }, - "label": { - "description": "UTF-8 truncated to 256 bytes.", - "type": "string" - }, - "role": { - "description": "UTF-8 truncated to 256 bytes.", - "type": "string" - } - }, - "required": [ - "diagnosticRef" - ], - "type": "object" - }, - "type": "array" - }, - "kind": { - "const": "disambiguated", - "type": "string" - }, - "matchCount": { - "description": "Total matches resolveSelectorChain found before disambiguation.", - "type": "number" - }, - "phase": { - "const": "pre-action", - "type": "string" - }, - "source": { - "const": "runtime", - "type": "string" - }, - "tiebreak": { - "description": "The comparison that decided the winner.", - "enum": [ - "visible", - "deepest", - "smallest-area" - ], - "type": "string" - }, - "winnerDiagnostic": { - "properties": { - "diagnosticRef": { - "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.", - "type": "string" - }, - "label": { - "description": "UTF-8 truncated to 256 bytes.", - "type": "string" - }, - "role": { - "description": "UTF-8 truncated to 256 bytes.", - "type": "string" - } - }, - "required": [ - "diagnosticRef" - ], - "type": "object" - } - }, - "required": [ - "source", - "phase", - "kind", - "matchCount", - "winnerDiagnostic", - "tiebreak" - ], - "type": "object" - }, - { - "properties": { - "kind": { - "const": "exact", - "type": "string" - }, - "phase": { - "const": "pre-action", - "type": "string" - }, - "source": { - "const": "ref", - "type": "string" - } - }, - "required": [ - "source", - "phase", - "kind" - ], - "type": "object" - }, - { - "properties": { - "kind": { - "const": "label-fallback", - "type": "string" - }, - "phase": { - "const": "pre-action", - "type": "string" - }, - "source": { - "const": "ref", - "type": "string" - } - }, - "required": [ - "source", - "phase", - "kind" - ], - "type": "object" - }, - { - "properties": { - "kind": { - "const": "not-observed", - "type": "string" - }, - "source": { - "const": "direct-ios", - "type": "string" - } - }, - "required": [ - "source", - "kind" - ], - "type": "object" - } -]New value: +[ + { + "properties": { + "kind": { + "const": "unique", + "type": "string" + }, + "phase": { + "const": "pre-action", + "type": "string" + }, + "source": { + "const": "runtime", + "type": "string" + } + }, + "required": [ + "source", + "phase", + "kind" + ], + "type": "object" + }, + { + "properties": { + "alternatives": { + "description": "At most 5 losing candidates, document order. Present at default/full response levels and omitted in digest. The winner is never included.", + "items": { + "properties": { + "diagnosticRef": { + "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.", + "type": "string" + }, + "label": { + "description": "UTF-8 truncated to 256 bytes.", + "type": "string" + }, + "role": { + "description": "UTF-8 truncated to 256 bytes.", + "type": "string" + } + }, + "required": [ + "diagnosticRef" + ], + "type": "object" + }, + "type": "array" + }, + "kind": { + "const": "disambiguated", + "type": "string" + }, + "matchCount": { + "description": "Total matches resolveSelectorChain found before disambiguation.", + "type": "number" + }, + "phase": { + "const": "pre-action", + "type": "string" + }, + "source": { + "const": "runtime", + "type": "string" + }, + "tiebreak": { + "description": "The comparison that decided the winner.", + "enum": [ + "visible", + "deepest", + "smallest-area", + "structural-equivalence" + ], + "type": "string" + }, + "winnerDiagnostic": { + "properties": { + "diagnosticRef": { + "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.", + "type": "string" + }, + "label": { + "description": "UTF-8 truncated to 256 bytes.", + "type": "string" + }, + "role": { + "description": "UTF-8 truncated to 256 bytes.", + "type": "string" + } + }, + "required": [ + "diagnosticRef" + ], + "type": "object" + } + }, + "required": [ + "source", + "phase", + "kind", + "matchCount", + "winnerDiagnostic", + "tiebreak" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "const": "exact", + "type": "string" + }, + "phase": { + "const": "pre-action", + "type": "string" + }, + "source": { + "const": "ref", + "type": "string" + } + }, + "required": [ + "source", + "phase", + "kind" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "const": "label-fallback", + "type": "string" + }, + "phase": { + "const": "pre-action", + "type": "string" + }, + "source": { + "const": "ref", + "type": "string" + } + }, + "required": [ + "source", + "phase", + "kind" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "const": "not-observed", + "type": "string" + }, + "source": { + "const": "direct-ios", + "type": "string" + } + }, + "required": [ + "source", + "kind" + ], + "type": "object" + } +]
- Changed
metro1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "vega", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "harmonyos", + "vega", + "linux", + "web", + "ios", + "macos" +]
- Changed
network1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "vega", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "harmonyos", + "vega", + "linux", + "web", + "ios", + "macos" +]
- Changed
open2 fields changed- changed
Input schema / properties / foreground / descriptionPrevious value: -"[RFC prototype] On a fresh session with no app argument, resolve the target from the sole booted iOS simulator's sole running app and include an initial interactive snapshot in the response. Fails with AMBIGUOUS_MATCH when the environment is not unambiguous (0 or 2+ booted simulators, or no confidently-detectable running app) — never guesses."New value: +"Include an initial interactive snapshot in a fresh open response. With no app argument, discover the sole running app on the sole booted iOS simulator; ambiguous environments fail closed." - changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "vega", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "harmonyos", + "vega", + "linux", + "web", + "ios", + "macos" +]
- Changed
orientation1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "vega", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "harmonyos", + "vega", + "linux", + "web", + "ios", + "macos" +]
- Changed
perf1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "vega", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "harmonyos", + "vega", + "linux", + "web", + "ios", + "macos" +]
- Changed
press2 fields changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "vega", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "harmonyos", + "vega", + "linux", + "web", + "ios", + "macos" +] - changed
Output schema / properties / resolution / oneOfPrevious value: -[ - { - "properties": { - "kind": { - "const": "unique", - "type": "string" - }, - "phase": { - "const": "pre-action", - "type": "string" - }, - "source": { - "const": "runtime", - "type": "string" - } - }, - "required": [ - "source", - "phase", - "kind" - ], - "type": "object" - }, - { - "properties": { - "alternatives": { - "description": "At most 5 losing candidates, document order. Present at default/full response levels and omitted in digest. The winner is never included.", - "items": { - "properties": { - "diagnosticRef": { - "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.", - "type": "string" - }, - "label": { - "description": "UTF-8 truncated to 256 bytes.", - "type": "string" - }, - "role": { - "description": "UTF-8 truncated to 256 bytes.", - "type": "string" - } - }, - "required": [ - "diagnosticRef" - ], - "type": "object" - }, - "type": "array" - }, - "kind": { - "const": "disambiguated", - "type": "string" - }, - "matchCount": { - "description": "Total matches resolveSelectorChain found before disambiguation.", - "type": "number" - }, - "phase": { - "const": "pre-action", - "type": "string" - }, - "source": { - "const": "runtime", - "type": "string" - }, - "tiebreak": { - "description": "The comparison that decided the winner.", - "enum": [ - "visible", - "deepest", - "smallest-area" - ], - "type": "string" - }, - "winnerDiagnostic": { - "properties": { - "diagnosticRef": { - "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.", - "type": "string" - }, - "label": { - "description": "UTF-8 truncated to 256 bytes.", - "type": "string" - }, - "role": { - "description": "UTF-8 truncated to 256 bytes.", - "type": "string" - } - }, - "required": [ - "diagnosticRef" - ], - "type": "object" - } - }, - "required": [ - "source", - "phase", - "kind", - "matchCount", - "winnerDiagnostic", - "tiebreak" - ], - "type": "object" - }, - { - "properties": { - "kind": { - "const": "exact", - "type": "string" - }, - "phase": { - "const": "pre-action", - "type": "string" - }, - "source": { - "const": "ref", - "type": "string" - } - }, - "required": [ - "source", - "phase", - "kind" - ], - "type": "object" - }, - { - "properties": { - "kind": { - "const": "label-fallback", - "type": "string" - }, - "phase": { - "const": "pre-action", - "type": "string" - }, - "source": { - "const": "ref", - "type": "string" - } - }, - "required": [ - "source", - "phase", - "kind" - ], - "type": "object" - }, - { - "properties": { - "kind": { - "const": "not-observed", - "type": "string" - }, - "source": { - "const": "direct-ios", - "type": "string" - } - }, - "required": [ - "source", - "kind" - ], - "type": "object" - } -]New value: +[ + { + "properties": { + "kind": { + "const": "unique", + "type": "string" + }, + "phase": { + "const": "pre-action", + "type": "string" + }, + "source": { + "const": "runtime", + "type": "string" + } + }, + "required": [ + "source", + "phase", + "kind" + ], + "type": "object" + }, + { + "properties": { + "alternatives": { + "description": "At most 5 losing candidates, document order. Present at default/full response levels and omitted in digest. The winner is never included.", + "items": { + "properties": { + "diagnosticRef": { + "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.", + "type": "string" + }, + "label": { + "description": "UTF-8 truncated to 256 bytes.", + "type": "string" + }, + "role": { + "description": "UTF-8 truncated to 256 bytes.", + "type": "string" + } + }, + "required": [ + "diagnosticRef" + ], + "type": "object" + }, + "type": "array" + }, + "kind": { + "const": "disambiguated", + "type": "string" + }, + "matchCount": { + "description": "Total matches resolveSelectorChain found before disambiguation.", + "type": "number" + }, + "phase": { + "const": "pre-action", + "type": "string" + }, + "source": { + "const": "runtime", + "type": "string" + }, + "tiebreak": { + "description": "The comparison that decided the winner.", + "enum": [ + "visible", + "deepest", + "smallest-area", + "structural-equivalence" + ], + "type": "string" + }, + "winnerDiagnostic": { + "properties": { + "diagnosticRef": { + "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.", + "type": "string" + }, + "label": { + "description": "UTF-8 truncated to 256 bytes.", + "type": "string" + }, + "role": { + "description": "UTF-8 truncated to 256 bytes.", + "type": "string" + } + }, + "required": [ + "diagnosticRef" + ], + "type": "object" + } + }, + "required": [ + "source", + "phase", + "kind", + "matchCount", + "winnerDiagnostic", + "tiebreak" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "const": "exact", + "type": "string" + }, + "phase": { + "const": "pre-action", + "type": "string" + }, + "source": { + "const": "ref", + "type": "string" + } + }, + "required": [ + "source", + "phase", + "kind" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "const": "label-fallback", + "type": "string" + }, + "phase": { + "const": "pre-action", + "type": "string" + }, + "source": { + "const": "ref", + "type": "string" + } + }, + "required": [ + "source", + "phase", + "kind" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "const": "not-observed", + "type": "string" + }, + "source": { + "const": "direct-ios", + "type": "string" + } + }, + "required": [ + "source", + "kind" + ], + "type": "object" + } +]
- Changed
push1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "vega", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "harmonyos", + "vega", + "linux", + "web", + "ios", + "macos" +]
- Changed
react-native1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "vega", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "harmonyos", + "vega", + "linux", + "web", + "ios", + "macos" +]
- Changed
record1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "vega", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "harmonyos", + "vega", + "linux", + "web", + "ios", + "macos" +]
- Changed
reinstall1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "vega", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "harmonyos", + "vega", + "linux", + "web", + "ios", + "macos" +]
- Changed
replay1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "vega", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "harmonyos", + "vega", + "linux", + "web", + "ios", + "macos" +]
- Changed
screenshot1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "vega", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "harmonyos", + "vega", + "linux", + "web", + "ios", + "macos" +]
- Changed
scroll1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "vega", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "harmonyos", + "vega", + "linux", + "web", + "ios", + "macos" +]
- Changed
session1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "vega", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "harmonyos", + "vega", + "linux", + "web", + "ios", + "macos" +]
- Changed
settings1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "vega", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "harmonyos", + "vega", + "linux", + "web", + "ios", + "macos" +]
- Changed
shutdown2 fields changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "vega", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "harmonyos", + "vega", + "linux", + "web", + "ios", + "macos" +] - changed
Output schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "vega", - "linux", - "web" -]New value: +[ + "ios", + "macos", + "android", + "harmonyos", + "vega", + "linux", + "web" +]
- Changed
snapshot1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "vega", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "harmonyos", + "vega", + "linux", + "web", + "ios", + "macos" +]
- Changed
swipe1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "vega", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "harmonyos", + "vega", + "linux", + "web", + "ios", + "macos" +]
- Changed
test1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "vega", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "harmonyos", + "vega", + "linux", + "web", + "ios", + "macos" +]
- Changed
trace1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "vega", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "harmonyos", + "vega", + "linux", + "web", + "ios", + "macos" +]
- Changed
trigger-app-event1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "vega", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "harmonyos", + "vega", + "linux", + "web", + "ios", + "macos" +]
- Changed
tv-remote1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "vega", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "harmonyos", + "vega", + "linux", + "web", + "ios", + "macos" +]
- Changed
type1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "vega", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "harmonyos", + "vega", + "linux", + "web", + "ios", + "macos" +]
- Changed
viewport1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "vega", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "harmonyos", + "vega", + "linux", + "web", + "ios", + "macos" +]
- Changed
wait1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "vega", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "harmonyos", + "vega", + "linux", + "web", + "ios", + "macos" +]
11 tool updates
v0.20.6- Changed
apps1 field changed- added
Input schema / properties / appsFilter / descriptionAdded value: +"Restrict the listing to user-installed apps, or include system and OEM apps."
- Changed
back4 fields changed- added
Input schema / properties / settleAdded value: +{ + "description": "After the action, wait for the UI to go quiet and return the settled diff vs the pre-action tree in the same response. Best-effort; never fails the action.", + "type": "boolean" +} - added
Input schema / properties / settleQuietMsAdded value: +{ + "description": "Settle: quiet window in milliseconds (default 500).", + "minimum": 0, + "type": "integer" +} - added
Input schema / properties / timeoutMsAdded value: +{ + "description": "Settle: wait deadline in milliseconds (default 10000).", + "minimum": 1, + "type": "integer" +} - added
Output schema / properties / settleAdded value: +{ + "properties": { + "captures": { + "type": "number" + }, + "diff": { + "description": "Settled diff vs the pre-action tree (changed lines only).", + "properties": { + "lines": { + "items": { + "properties": { + "kind": { + "enum": [ + "added", + "removed" + ], + "type": "string" + }, + "ref": { + "description": "Plain ref body (e12) for added lines.", + "type": "string" + }, + "text": { + "type": "string" + } + }, + "required": [ + "kind", + "text" + ], + "type": "object" + }, + "type": "array" + }, + "summary": { + "properties": { + "additions": { + "type": "number" + }, + "removals": { + "type": "number" + }, + "unchanged": { + "type": "number" + } + }, + "required": [ + "additions", + "removals", + "unchanged" + ], + "type": "object" + }, + "truncated": { + "description": "Lines were capped to the response bound.", + "type": "boolean" + } + }, + "required": [ + "summary", + "lines" + ], + "type": "object" + }, + "hint": { + "type": "string" + }, + "quietMs": { + "type": "number" + }, + "refs": { + "items": { + "properties": { + "ref": { + "description": "Plain ref body (e12) minted from the stored settled tree.", + "type": "string" + } + }, + "required": [ + "ref" + ], + "type": "object" + }, + "type": "array" + }, + "refsGeneration": { + "description": "Snapshot generation of the stored settled tree; refs on added diff lines were minted from it.", + "type": "number" + }, + "settled": { + "description": "Whether the UI held the quiet window before the deadline. false is advisory, not failure.", + "type": "boolean" + }, + "tail": { + "description": "Unchanged interactive refs tail: still-present, actionable elements from the settled tree, attached only when diff carries zero added-line refs (a modal-dismiss/toast-only diff).", + "items": { + "properties": { + "label": { + "type": "string" + }, + "ref": { + "description": "Plain ref body (e12) minted from the stored settled tree.", + "type": "string" + }, + "role": { + "type": "string" + } + }, + "required": [ + "ref", + "role" + ], + "type": "object" + }, + "type": "array" + }, + "tailTruncated": { + "description": "Present (true) when tail candidates exceeded the response cap.", + "type": "boolean" + }, + "timeoutMs": { + "type": "number" + }, + "waitedMs": { + "type": "number" + } + }, + "required": [ + "settled", + "waitedMs", + "captures", + "quietMs", + "timeoutMs" + ], + "type": "object" +}
- Changed
find2 fields changed- changed
Input schema / properties / action / enumPrevious value: -[ - "click", - "focus", - "exists", - "getText", - "getAttrs", - "wait", - "fill", - "type" -]New value: +[ + "click", + "focus", + "exists", + "list", + "getText", + "getAttrs", + "wait", + "fill", + "type" +] - added
Output schema / properties / matchesAdded value: +{ + "description": "Every match for the read-only find list action (#1625): { ref, node } each.", + "items": { + "additionalProperties": true, + "description": "One listed match with its snapshot ref and node.", + "type": "object" + }, + "type": "array" +}
- Changed
gesture6 fields changed- added
Input schema / properties / destinationAdded value: +{ + "description": "Drag destination @ref or selector.", + "type": "string" +} - added
Input schema / properties / destinationHoldMsAdded value: +{ + "description": "Hold before releasing at the destination.", + "maximum": 10000, + "minimum": 0, + "type": "integer" +} - changed
Input schema / properties / kind / enumPrevious value: -[ - "pan", - "fling", - "swipe", - "pinch", - "rotate", - "transform" -]New value: +[ + "pan", + "fling", + "swipe", + "pinch", + "rotate", + "transform", + "drag" +] - added
Input schema / properties / moveMsAdded value: +{ + "description": "Drag movement duration.", + "maximum": 10000, + "minimum": 16, + "type": "integer" +} - added
Input schema / properties / sourceAdded value: +{ + "description": "Drag source @ref or selector.", + "type": "string" +} - added
Input schema / properties / sourceHoldMsAdded value: +{ + "description": "Drag activation hold duration.", + "maximum": 10000, + "minimum": 1, + "type": "integer" +}
- Changed
open2 fields changed- added
Input schema / properties / foregroundAdded value: +{ + "description": "[RFC prototype] On a fresh session with no app argument, resolve the target from the sole booted iOS simulator's sole running app and include an initial interactive snapshot in the response. Fails with AMBIGUOUS_MATCH when the environment is not unambiguous (0 or 2+ booted simulators, or no confidently-detectable running app) — never guesses.", + "type": "boolean" +} - added
Input schema / properties / surface / descriptionAdded value: +"macOS presentation surface to open: the app itself, the frontmost app, the desktop, or the menu bar."
- Changed
record1 field changed- removed
Input schema / properties / maxSizeRemoved value: -{ - "type": "integer" -}
- Changed
replay1 field changed- added
Input schema / properties / timeoutMsAdded value: +{ + "description": "Maximum wall-clock duration for the replay request.", + "type": "integer" +}
- Changed
screenshot2 fields changed- removed
Input schema / properties / maxSizeRemoved value: -{ - "type": "integer" -} - added
Input schema / properties / scaleAdded value: +{ + "description": "Screenshot scale factor.", + "maximum": 1, + "minimum": 0.01, + "type": "number" +}
- Changed
scroll3 fields changed- added
Input schema / properties / settleAdded value: +{ + "description": "After the action, wait for the UI to go quiet and return the settled diff vs the pre-action tree in the same response. Best-effort; never fails the action.", + "type": "boolean" +} - added
Input schema / properties / settleQuietMsAdded value: +{ + "description": "Settle: quiet window in milliseconds (default 500).", + "minimum": 0, + "type": "integer" +} - added
Input schema / properties / timeoutMsAdded value: +{ + "description": "Settle: wait deadline in milliseconds (default 10000).", + "minimum": 1, + "type": "integer" +}
- Changed
snapshot1 field changed- added
Input schema / properties / customActionsAdded value: +{ + "description": "Name the affordances an element merged away (iOS UIAccessibilityCustomAction, React Native accessibilityActions) — a card whose reply/options controls are not separate elements still lists them here. The names are for PLANNING, not invocation: there is no API to trigger them, so reach the affordance through the element detail screen, through the same control exposed as a labeled element elsewhere, or by coordinates from its rect. iOS simulator only; costs one accessibility round trip per merged element.", + "type": "boolean" +}
- Changed
trigger-app-event2 fields changed- added
Input schema / properties / event / descriptionAdded value: +"Name of an app-defined automation or test event the app documents." - added
Input schema / properties / payload / descriptionAdded value: +"Structured payload passed to the event, in the shape the app documents for it."
1 tool update
v0.20.4- Changed
replay1 field changed- added
Input schema / properties / keepSessionAdded value: +{ + "description": "Leave the session active by suppressing exactly an authored terminal close in native .ad.", + "type": "boolean" +}
56 tool updates
v0.20.2- Changed
alert3 fields changed- added
Input schema / properties / noRecordAdded value: +{ + "description": "Do not record this action.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "vega", + "linux", + "web", + "ios", + "macos" +] - changed
Input schema / properties / serial / descriptionPrevious value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
- Changed
app-switcher3 fields changed- added
Input schema / properties / noRecordAdded value: +{ + "description": "Do not record this action.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "vega", + "linux", + "web", + "ios", + "macos" +] - changed
Input schema / properties / serial / descriptionPrevious value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
- Changed
apps3 fields changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "vega", + "linux", + "web", + "ios", + "macos" +] - changed
Input schema / properties / serial / descriptionPrevious value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "apps": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "apps" + ], + "type": "object" +}
- Changed
appstate2 fields changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "vega", + "linux", + "web", + "ios", + "macos" +] - changed
Input schema / properties / serial / descriptionPrevious value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
- Changed
artifacts2 fields changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "vega", + "linux", + "web", + "ios", + "macos" +] - changed
Input schema / properties / serial / descriptionPrevious value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
- Changed
audio2 fields changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "vega", + "linux", + "web", + "ios", + "macos" +] - changed
Input schema / properties / serial / descriptionPrevious value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
- Changed
back3 fields changed- added
Input schema / properties / noRecordAdded value: +{ + "description": "Do not record this action.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "vega", + "linux", + "web", + "ios", + "macos" +] - changed
Input schema / properties / serial / descriptionPrevious value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
- Changed
batch3 fields changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "vega", + "linux", + "web", + "ios", + "macos" +] - changed
Input schema / properties / serial / descriptionPrevious value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector." - changed
Input schema / properties / steps / items / properties / command / enumPrevious value: -[ - "devices", - "doctor", - "apps", - "boot", - "shutdown", - "appstate", - "perf", - "logs", - "network", - "audio", - "test", - "clipboard", - "keyboard", - "install", - "reinstall", - "push", - "trigger-app-event", - "open", - "close", - "snapshot", - "diff", - "wait", - "alert", - "settings", - "react-native", - "record", - "trace", - "find", - "click", - "fill", - "longpress", - "press", - "type", - "get", - "is", - "back", - "gesture", - "home", - "rotate", - "scroll", - "swipe", - "focus", - "screenshot", - "app-switcher", - "install-from-source" -]New value: +[ + "devices", + "capabilities", + "doctor", + "apps", + "boot", + "shutdown", + "appstate", + "perf", + "logs", + "network", + "audio", + "test", + "clipboard", + "keyboard", + "install", + "reinstall", + "push", + "trigger-app-event", + "open", + "close", + "snapshot", + "diff", + "wait", + "alert", + "settings", + "react-native", + "record", + "trace", + "find", + "click", + "fill", + "longpress", + "press", + "type", + "get", + "is", + "back", + "gesture", + "home", + "tv-remote", + "orientation", + "scroll", + "swipe", + "focus", + "screenshot", + "app-switcher", + "install-from-source" +]
- Changed
boot3 fields changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "vega", + "linux", + "web", + "ios", + "macos" +] - changed
Input schema / properties / serial / descriptionPrevious value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector." - changed
Output schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "linux", - "web" -]New value: +[ + "ios", + "macos", + "android", + "vega", + "linux", + "web" +]
- Added
capabilities - Changed
click7 fields changed- added
Input schema / properties / noRecordAdded value: +{ + "description": "Do not record this action.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "vega", + "linux", + "web", + "ios", + "macos" +] - changed
Input schema / properties / serial / descriptionPrevious value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector." - added
Input schema / properties / settleAdded value: +{ + "description": "After the action, wait for the UI to go quiet and return the settled diff vs the pre-action tree in the same response. Best-effort; never fails the action.", + "type": "boolean" +} - added
Input schema / properties / settleQuietMsAdded value: +{ + "description": "Settle: quiet window in milliseconds (default 500).", + "minimum": 0, + "type": "integer" +} - added
Input schema / properties / timeoutMsAdded value: +{ + "description": "Settle: wait deadline in milliseconds (default 10000).", + "minimum": 1, + "type": "integer" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "button": { + "enum": [ + "secondary", + "middle" + ], + "type": "string" + }, + "cost": { + "properties": { + "nodeCount": { + "description": "Number of nodes in the original node tree when the response carries one.", + "type": "number" + }, + "runnerRoundTrips": { + "description": "Number of real runner round-trips made while serving the request.", + "type": "number" + }, + "wallClockMs": { + "description": "Total wall-clock time for the request in milliseconds.", + "type": "number" + } + }, + "required": [ + "wallClockMs", + "runnerRoundTrips" + ], + "type": "object" + }, + "count": { + "description": "Number of press/click repetitions.", + "type": "number" + }, + "doubleTap": { + "description": "Whether the command requested a double-tap action.", + "type": "boolean" + }, + "evidence": { + "properties": { + "changedFromBefore": { + "description": "Whether the post-action digest differs from the pre-action capture digest. false is evidence, not failure.", + "type": "boolean" + }, + "digest": { + "description": "Order-independent digest of the post-action node multiset.", + "type": "string" + }, + "foregroundApp": { + "description": "Foreground app bundle id or name, when the capture carries it.", + "type": "string" + }, + "interactiveNodeCount": { + "description": "Subset of nodeCount the platform reports as hittable.", + "type": "number" + }, + "nodeCount": { + "description": "Node count in the post-action interactive-only capture.", + "type": "number" + } + }, + "required": [ + "nodeCount", + "interactiveNodeCount", + "digest", + "changedFromBefore" + ], + "type": "object" + }, + "hint": { + "type": "string" + }, + "holdMs": { + "description": "Hold duration for each action.", + "type": "number" + }, + "intervalMs": { + "description": "Delay between repeated press/click actions.", + "type": "number" + }, + "jitterPx": { + "description": "Randomization radius in pixels.", + "type": "number" + }, + "maestroFallbackReason": { + "const": "non-hittable-coordinate", + "type": "string" + }, + "maestroNonHittableCoordinateFallbackAllowed": { + "description": "Whether the direct iOS Maestro coordinate fallback was allowed for this selector.", + "type": "boolean" + }, + "maestroNonHittableCoordinateFallbackUsed": { + "description": "Whether the direct iOS Maestro coordinate fallback was actually used.", + "type": "boolean" + }, + "message": { + "type": "string" + }, + "ref": { + "description": "Snapshot ref without the @ prefix when the target was an @ref.", + "type": "string" + }, + "refLabel": { + "type": "string" + }, + "referenceHeight": { + "description": "Reference frame height for visualizing the interaction point.", + "type": "number" + }, + "referenceWidth": { + "description": "Reference frame width for visualizing the interaction point.", + "type": "number" + }, + "resolution": { + "description": "Pre-action disclosure of how the acting path resolved its target. Absent when resolutionDisclosure is inapplicable for the path.", + "oneOf": [ + { + "properties": { + "kind": { + "const": "unique", + "type": "string" + }, + "phase": { + "const": "pre-action", + "type": "string" + }, + "source": { + "const": "runtime", + "type": "string" + } + }, + "required": [ + "source", + "phase", + "kind" + ], + "type": "object" + }, + { + "properties": { + "alternatives": { + "description": "At most 5 losing candidates, document order. Present at default/full response levels and omitted in digest. The winner is never included.", + "items": { + "properties": { + "diagnosticRef": { + "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.", + "type": "string" + }, + "label": { + "description": "UTF-8 truncated to 256 bytes.", + "type": "string" + }, + "role": { + "description": "UTF-8 truncated to 256 bytes.", + "type": "string" + } + }, + "required": [ + "diagnosticRef" + ], + "type": "object" + }, + "type": "array" + }, + "kind": { + "const": "disambiguated", + "type": "string" + }, + "matchCount": { + "description": "Total matches resolveSelectorChain found before disambiguation.", + "type": "number" + }, + "phase": { + "const": "pre-action", + "type": "string" + }, + "source": { + "const": "runtime", + "type": "string" + }, + "tiebreak": { + "description": "The comparison that decided the winner.", + "enum": [ + "visible", + "deepest", + "smallest-area" + ], + "type": "string" + }, + "winnerDiagnostic": { + "properties": { + "diagnosticRef": { + "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.", + "type": "string" + }, + "label": { + "description": "UTF-8 truncated to 256 bytes.", + "type": "string" + }, + "role": { + "description": "UTF-8 truncated to 256 bytes.", + "type": "string" + } + }, + "required": [ + "diagnosticRef" + ], + "type": "object" + } + }, + "required": [ + "source", + "phase", + "kind", + "matchCount", + "winnerDiagnostic", + "tiebreak" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "const": "exact", + "type": "string" + }, + "phase": { + "const": "pre-action", + "type": "string" + }, + "source": { + "const": "ref", + "type": "string" + } + }, + "required": [ + "source", + "phase", + "kind" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "const": "label-fallback", + "type": "string" + }, + "phase": { + "const": "pre-action", + "type": "string" + }, + "source": { + "const": "ref", + "type": "string" + } + }, + "required": [ + "source", + "phase", + "kind" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "const": "not-observed", + "type": "string" + }, + "source": { + "const": "direct-ios", + "type": "string" + } + }, + "required": [ + "source", + "kind" + ], + "type": "object" + } + ], + "type": "object" + }, + "selector": { + "description": "Selector expression when the target was a selector.", + "type": "string" + }, + "selectorChain": { + "items": { + "type": "string" + }, + "type": "array" + }, + "settle": { + "properties": { + "captures": { + "type": "number" + }, + "diff": { + "description": "Settled diff vs the pre-action tree (changed lines only).", + "properties": { + "lines": { + "items": { + "properties": { + "kind": { + "enum": [ + "added", + "removed" + ], + "type": "string" + }, + "ref": { + "description": "Plain ref body (e12) for added lines.", + "type": "string" + }, + "text": { + "type": "string" + } + }, + "required": [ + "kind", + "text" + ], + "type": "object" + }, + "type": "array" + }, + "summary": { + "properties": { + "additions": { + "type": "number" + }, + "removals": { + "type": "number" + }, + "unchanged": { + "type": "number" + } + }, + "required": [ + "additions", + "removals", + "unchanged" + ], + "type": "object" + }, + "truncated": { + "description": "Lines were capped to the response bound.", + "type": "boolean" + } + }, + "required": [ + "summary", + "lines" + ], + "type": "object" + }, + "hint": { + "type": "string" + }, + "quietMs": { + "type": "number" + }, + "refs": { + "items": { + "properties": { + "ref": { + "description": "Plain ref body (e12) minted from the stored settled tree.", + "type": "string" + } + }, + "required": [ + "ref" + ], + "type": "object" + }, + "type": "array" + }, + "refsGeneration": { + "description": "Snapshot generation of the stored settled tree; refs on added diff lines were minted from it.", + "type": "number" + }, + "settled": { + "description": "Whether the UI held the quiet window before the deadline. false is advisory, not failure.", + "type": "boolean" + }, + "tail": { + "description": "Unchanged interactive refs tail: still-present, actionable elements from the settled tree, attached only when diff carries zero added-line refs (a modal-dismiss/toast-only diff).", + "items": { + "properties": { + "label": { + "type": "string" + }, + "ref": { + "description": "Plain ref body (e12) minted from the stored settled tree.", + "type": "string" + }, + "role": { + "type": "string" + } + }, + "required": [ + "ref", + "role" + ], + "type": "object" + }, + "type": "array" + }, + "tailTruncated": { + "description": "Present (true) when tail candidates exceeded the response cap.", + "type": "boolean" + }, + "timeoutMs": { + "type": "number" + }, + "waitedMs": { + "type": "number" + } + }, + "required": [ + "settled", + "waitedMs", + "captures", + "quietMs", + "timeoutMs" + ], + "type": "object" + }, + "targetHittable": { + "type": "boolean" + }, + "targetKind": { + "description": "Resolved interaction target kind.", + "enum": [ + "point", + "ref", + "selector" + ], + "type": "string" + }, + "warning": { + "type": "string" + }, + "x": { + "description": "Resolved interaction x coordinate when available.", + "type": "number" + }, + "y": { + "description": "Resolved interaction y coordinate when available.", + "type": "number" + } + }, + "required": [ + "targetKind" + ], + "type": "object" +}
- Changed
clipboard3 fields changed- added
Input schema / properties / noRecordAdded value: +{ + "description": "Do not record this action.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "vega", + "linux", + "web", + "ios", + "macos" +] - changed
Input schema / properties / serial / descriptionPrevious value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
- Changed
close4 fields changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite an existing --save-script target instead of refusing (alias: --overwrite).", + "type": "boolean" +} - added
Input schema / properties / noRecordAdded value: +{ + "description": "Do not record this action.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "vega", + "linux", + "web", + "ios", + "macos" +] - changed
Input schema / properties / serial / descriptionPrevious value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
- Changed
debug2 fields changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "vega", + "linux", + "web", + "ios", + "macos" +] - changed
Input schema / properties / serial / descriptionPrevious value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
- Changed
devices3 fields changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "vega", + "linux", + "web", + "ios", + "macos" +] - changed
Input schema / properties / serial / descriptionPrevious value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "devices": { + "items": { + "properties": { + "id": { + "type": "string" + }, + "kind": { + "enum": [ + "simulator", + "emulator", + "device" + ], + "type": "string" + }, + "name": { + "type": "string" + }, + "platform": { + "enum": [ + "ios", + "macos", + "android", + "vega", + "linux", + "web" + ], + "type": "string" + }, + "target": { + "enum": [ + "mobile", + "tv", + "desktop" + ], + "type": "string" + } + }, + "required": [ + "platform", + "target", + "kind", + "id", + "name" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "devices" + ], + "type": "object" +}
- Changed
diff4 fields changed- added
Input schema / properties / noRecordAdded value: +{ + "description": "Do not record this action.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "vega", + "linux", + "web", + "ios", + "macos" +] - changed
Input schema / properties / serial / descriptionPrevious value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "baselineInitialized": { + "type": "boolean" + }, + "lines": { + "items": { + "properties": { + "kind": { + "enum": [ + "added", + "removed" + ], + "type": "string" + }, + "ref": { + "type": "string" + }, + "text": { + "type": "string" + } + }, + "required": [ + "kind", + "text" + ], + "type": "object" + }, + "type": "array" + }, + "mode": { + "const": "snapshot", + "type": "string" + }, + "summary": { + "properties": { + "additions": { + "type": "number" + }, + "removals": { + "type": "number" + }, + "unchanged": { + "type": "number" + } + }, + "required": [ + "additions", + "removals", + "unchanged" + ], + "type": "object" + }, + "warnings": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "mode", + "baselineInitialized", + "summary", + "lines" + ], + "type": "object" +}
- Changed
doctor3 fields changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "vega", + "linux", + "web", + "ios", + "macos" +] - changed
Input schema / properties / serial / descriptionPrevious value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "checks": { + "items": { + "properties": { + "command": { + "type": "string" + }, + "evidence": { + "additionalProperties": true, + "type": "object" + }, + "hint": { + "type": "string" + }, + "id": { + "type": "string" + }, + "status": { + "enum": [ + "pass", + "warn", + "fail", + "info" + ], + "type": "string" + }, + "summary": { + "type": "string" + } + }, + "required": [ + "id", + "status", + "summary" + ], + "type": "object" + }, + "type": "array" + }, + "kind": { + "enum": [ + "auto", + "react-native", + "expo", + "repack" + ], + "type": "string" + }, + "metro": { + "properties": { + "host": { + "type": "string" + }, + "port": { + "type": "number" + } + }, + "required": [ + "host", + "port" + ], + "type": "object" + }, + "platform": { + "type": "string" + }, + "status": { + "enum": [ + "pass", + "warn", + "fail", + "info" + ], + "type": "string" + }, + "summary": { + "type": "string" + }, + "target": { + "enum": [ + "mobile", + "tv", + "desktop" + ], + "type": "string" + }, + "targetApp": { + "type": "string" + } + }, + "required": [ + "status", + "summary", + "kind", + "checks" + ], + "type": "object" +}
- Added
events - Changed
fill10 fields changed- added
Input schema / properties / noRecordAdded value: +{ + "description": "Do not record this action.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "vega", + "linux", + "web", + "ios", + "macos" +] - added
Input schema / properties / recordAsAdded value: +{ + "description": "When script recording is armed, send text to the live app but publish it as ${VAR}. Use an uppercase replay variable name such as PASSWORD.", + "type": "string" +} - changed
Input schema / properties / serial / descriptionPrevious value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector." - added
Input schema / properties / settleAdded value: +{ + "description": "After the action, wait for the UI to go quiet and return the settled diff vs the pre-action tree in the same response. Best-effort; never fails the action.", + "type": "boolean" +} - added
Input schema / properties / settleQuietMsAdded value: +{ + "description": "Settle: quiet window in milliseconds (default 500).", + "minimum": 0, + "type": "integer" +} - added
Input schema / properties / timeoutMsAdded value: +{ + "description": "Settle: wait deadline in milliseconds (default 10000).", + "minimum": 1, + "type": "integer" +} - removed
Output schema / oneOfRemoved value: -[ - { - "properties": { - "backendResult": { - "additionalProperties": true, - "description": "Raw backend result passthrough.", - "type": "object" - }, - "evidence": { - "properties": { - "changedFromBefore": { - "description": "Whether the post-action digest differs from the pre-action capture digest. false is evidence, not failure.", - "type": "boolean" - }, - "digest": { - "description": "Order-independent digest of the post-action node multiset.", - "type": "string" - }, - "foregroundApp": { - "description": "Foreground app bundle id or name, when the capture carries it.", - "type": "string" - }, - "interactiveNodeCount": { - "description": "Subset of nodeCount the platform reports as hittable.", - "type": "number" - }, - "nodeCount": { - "description": "Node count in the post-action interactive-only capture.", - "type": "number" - } - }, - "required": [ - "nodeCount", - "interactiveNodeCount", - "digest", - "changedFromBefore" - ], - "type": "object" - }, - "kind": { - "const": "point", - "type": "string" - }, - "message": { - "type": "string" - }, - "point": { - "properties": { - "x": { - "type": "number" - }, - "y": { - "type": "number" - } - }, - "required": [ - "x", - "y" - ], - "type": "object" - }, - "text": { - "description": "Text submitted to the field.", - "type": "string" - }, - "warning": { - "type": "string" - } - }, - "required": [ - "kind", - "point", - "text" - ], - "type": "object" - }, - { - "properties": { - "backendResult": { - "additionalProperties": true, - "description": "Raw backend result passthrough.", - "type": "object" - }, - "evidence": { - "properties": { - "changedFromBefore": { - "description": "Whether the post-action digest differs from the pre-action capture digest. false is evidence, not failure.", - "type": "boolean" - }, - "digest": { - "description": "Order-independent digest of the post-action node multiset.", - "type": "string" - }, - "foregroundApp": { - "description": "Foreground app bundle id or name, when the capture carries it.", - "type": "string" - }, - "interactiveNodeCount": { - "description": "Subset of nodeCount the platform reports as hittable.", - "type": "number" - }, - "nodeCount": { - "description": "Node count in the post-action interactive-only capture.", - "type": "number" - } - }, - "required": [ - "nodeCount", - "interactiveNodeCount", - "digest", - "changedFromBefore" - ], - "type": "object" - }, - "hint": { - "type": "string" - }, - "kind": { - "const": "ref", - "type": "string" - }, - "message": { - "type": "string" - }, - "node": { - "description": "Resolved snapshot node for the matched element.", - "properties": { - "appName": { - "type": "string" - }, - "bundleId": { - "type": "string" - }, - "depth": { - "type": "number" - }, - "enabled": { - "type": "boolean" - }, - "focused": { - "type": "boolean" - }, - "hiddenContentAbove": { - "type": "boolean" - }, - "hiddenContentBelow": { - "type": "boolean" - }, - "hittable": { - "type": "boolean" - }, - "identifier": { - "type": "string" - }, - "index": { - "type": "number" - }, - "interactionBlocked": { - "enum": [ - "covered" - ], - "type": "string" - }, - "label": { - "type": "string" - }, - "parentIndex": { - "type": "number" - }, - "pid": { - "type": "number" - }, - "presentationHints": { - "items": { - "type": "string" - }, - "type": "array" - }, - "rect": { - "properties": { - "height": { - "type": "number" - }, - "width": { - "type": "number" - }, - "x": { - "type": "number" - }, - "y": { - "type": "number" - } - }, - "required": [ - "x", - "y", - "width", - "height" - ], - "type": "object" - }, - "ref": { - "description": "Stable snapshot ref such as e12.", - "type": "string" - }, - "role": { - "type": "string" - }, - "selected": { - "type": "boolean" - }, - "subrole": { - "type": "string" - }, - "surface": { - "type": "string" - }, - "type": { - "type": "string" - }, - "value": { - "type": "string" - }, - "visibleToUser": { - "type": "boolean" - }, - "windowTitle": { - "type": "string" - } - }, - "required": [ - "index", - "ref" - ], - "type": "object" - }, - "point": { - "properties": { - "x": { - "type": "number" - }, - "y": { - "type": "number" - } - }, - "required": [ - "x", - "y" - ], - "type": "object" - }, - "refLabel": { - "type": "string" - }, - "selectorChain": { - "items": { - "type": "string" - }, - "type": "array" - }, - "target": { - "properties": { - "kind": { - "const": "ref", - "type": "string" - }, - "ref": { - "type": "string" - } - }, - "required": [ - "kind", - "ref" - ], - "type": "object" - }, - "targetHittable": { - "type": "boolean" - }, - "text": { - "description": "Text submitted to the field.", - "type": "string" - }, - "warning": { - "type": "string" - } - }, - "required": [ - "kind", - "target", - "text" - ], - "type": "object" - }, - { - "properties": { - "backendResult": { - "additionalProperties": true, - "description": "Raw backend result passthrough.", - "type": "object" - }, - "evidence": { - "properties": { - "changedFromBefore": { - "description": "Whether the post-action digest differs from the pre-action capture digest. false is evidence, not failure.", - "type": "boolean" - }, - "digest": { - "description": "Order-independent digest of the post-action node multiset.", - "type": "string" - }, - "foregroundApp": { - "description": "Foreground app bundle id or name, when the capture carries it.", - "type": "string" - }, - "interactiveNodeCount": { - "description": "Subset of nodeCount the platform reports as hittable.", - "type": "number" - }, - "nodeCount": { - "description": "Node count in the post-action interactive-only capture.", - "type": "number" - } - }, - "required": [ - "nodeCount", - "interactiveNodeCount", - "digest", - "changedFromBefore" - ], - "type": "object" - }, - "hint": { - "type": "string" - }, - "kind": { - "const": "selector", - "type": "string" - }, - "message": { - "type": "string" - }, - "node": { - "description": "Resolved snapshot node for the matched element.", - "properties": { - "appName": { - "type": "string" - }, - "bundleId": { - "type": "string" - }, - "depth": { - "type": "number" - }, - "enabled": { - "type": "boolean" - }, - "focused": { - "type": "boolean" - }, - "hiddenContentAbove": { - "type": "boolean" - }, - "hiddenContentBelow": { - "type": "boolean" - }, - "hittable": { - "type": "boolean" - }, - "identifier": { - "type": "string" - }, - "index": { - "type": "number" - }, - "interactionBlocked": { - "enum": [ - "covered" - ], - "type": "string" - }, - "label": { - "type": "string" - }, - "parentIndex": { - "type": "number" - }, - "pid": { - "type": "number" - }, - "presentationHints": { - "items": { - "type": "string" - }, - "type": "array" - }, - "rect": { - "properties": { - "height": { - "type": "number" - }, - "width": { - "type": "number" - }, - "x": { - "type": "number" - }, - "y": { - "type": "number" - } - }, - "required": [ - "x", - "y", - "width", - "height" - ], - "type": "object" - }, - "ref": { - "description": "Stable snapshot ref such as e12.", - "type": "string" - }, - "role": { - "type": "string" - }, - "selected": { - "type": "boolean" - }, - "subrole": { - "type": "string" - }, - "surface": { - "type": "string" - }, - "type": { - "type": "string" - }, - "value": { - "type": "string" - }, - "visibleToUser": { - "type": "boolean" - }, - "windowTitle": { - "type": "string" - } - }, - "required": [ - "index", - "ref" - ], - "type": "object" - }, - "point": { - "properties": { - "x": { - "type": "number" - }, - "y": { - "type": "number" - } - }, - "required": [ - "x", - "y" - ], - "type": "object" - }, - "refLabel": { - "type": "string" - }, - "selectorChain": { - "items": { - "type": "string" - }, - "type": "array" - }, - "target": { - "properties": { - "kind": { - "const": "selector", - "type": "string" - }, - "selector": { - "type": "string" - } - }, - "required": [ - "kind", - "selector" - ], - "type": "object" - }, - "targetHittable": { - "type": "boolean" - }, - "text": { - "description": "Text submitted to the field.", - "type": "string" - }, - "warning": { - "type": "string" - } - }, - "required": [ - "kind", - "point", - "target", - "node", - "selectorChain", - "text" - ], - "type": "object" - } -] - added
Output schema / propertiesAdded value: +{ + "cost": { + "properties": { + "nodeCount": { + "description": "Number of nodes in the original node tree when the response carries one.", + "type": "number" + }, + "runnerRoundTrips": { + "description": "Number of real runner round-trips made while serving the request.", + "type": "number" + }, + "wallClockMs": { + "description": "Total wall-clock time for the request in milliseconds.", + "type": "number" + } + }, + "required": [ + "wallClockMs", + "runnerRoundTrips" + ], + "type": "object" + }, + "delayMs": { + "description": "Delay between typed characters in milliseconds.", + "type": "number" + }, + "evidence": { + "properties": { + "changedFromBefore": { + "description": "Whether the post-action digest differs from the pre-action capture digest. false is evidence, not failure.", + "type": "boolean" + }, + "digest": { + "description": "Order-independent digest of the post-action node multiset.", + "type": "string" + }, + "foregroundApp": { + "description": "Foreground app bundle id or name, when the capture carries it.", + "type": "string" + }, + "interactiveNodeCount": { + "description": "Subset of nodeCount the platform reports as hittable.", + "type": "number" + }, + "nodeCount": { + "description": "Node count in the post-action interactive-only capture.", + "type": "number" + } + }, + "required": [ + "nodeCount", + "interactiveNodeCount", + "digest", + "changedFromBefore" + ], + "type": "object" + }, + "hint": { + "type": "string" + }, + "maestroFallbackReason": { + "const": "non-hittable-coordinate", + "type": "string" + }, + "maestroNonHittableCoordinateFallbackAllowed": { + "description": "Whether the direct iOS Maestro coordinate fallback was allowed for this selector.", + "type": "boolean" + }, + "maestroNonHittableCoordinateFallbackUsed": { + "description": "Whether the direct iOS Maestro coordinate fallback was actually used.", + "type": "boolean" + }, + "message": { + "type": "string" + }, + "ref": { + "description": "Snapshot ref without the @ prefix when the target was an @ref.", + "type": "string" + }, + "refLabel": { + "type": "string" + }, + "referenceHeight": { + "description": "Reference frame height for visualizing the interaction point.", + "type": "number" + }, + "referenceWidth": { + "description": "Reference frame width for visualizing the interaction point.", + "type": "number" + }, + "resolution": { + "description": "Pre-action disclosure of how the acting path resolved its target. Absent when resolutionDisclosure is inapplicable for the path.", + "oneOf": [ + { + "properties": { + "kind": { + "const": "unique", + "type": "string" + }, + "phase": { + "const": "pre-action", + "type": "string" + }, + "source": { + "const": "runtime", + "type": "string" + } + }, + "required": [ + "source", + "phase", + "kind" + ], + "type": "object" + }, + { + "properties": { + "alternatives": { + "description": "At most 5 losing candidates, document order. Present at default/full response levels and omitted in digest. The winner is never included.", + "items": { + "properties": { + "diagnosticRef": { + "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.", + "type": "string" + }, + "label": { + "description": "UTF-8 truncated to 256 bytes.", + "type": "string" + }, + "role": { + "description": "UTF-8 truncated to 256 bytes.", + "type": "string" + } + }, + "required": [ + "diagnosticRef" + ], + "type": "object" + }, + "type": "array" + }, + "kind": { + "const": "disambiguated", + "type": "string" + }, + "matchCount": { + "description": "Total matches resolveSelectorChain found before disambiguation.", + "type": "number" + }, + "phase": { + "const": "pre-action", + "type": "string" + }, + "source": { + "const": "runtime", + "type": "string" + }, + "tiebreak": { + "description": "The comparison that decided the winner.", + "enum": [ + "visible", + "deepest", + "smallest-area" + ], + "type": "string" + }, + "winnerDiagnostic": { + "properties": { + "diagnosticRef": { + "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.", + "type": "string" + }, + "label": { + "description": "UTF-8 truncated to 256 bytes.", + "type": "string" + }, + "role": { + "description": "UTF-8 truncated to 256 bytes.", + "type": "string" + } + }, + "required": [ + "diagnosticRef" + ], + "type": "object" + } + }, + "required": [ + "source", + "phase", + "kind", + "matchCount", + "winnerDiagnostic", + "tiebreak" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "const": "exact", + "type": "string" + }, + "phase": { + "const": "pre-action", + "type": "string" + }, + "source": { + "const": "ref", + "type": "string" + } + }, + "required": [ + "source", + "phase", + "kind" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "const": "label-fallback", + "type": "string" + }, + "phase": { + "const": "pre-action", + "type": "string" + }, + "source": { + "const": "ref", + "type": "string" + } + }, + "required": [ + "source", + "phase", + "kind" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "const": "not-observed", + "type": "string" + }, + "source": { + "const": "direct-ios", + "type": "string" + } + }, + "required": [ + "source", + "kind" + ], + "type": "object" + } + ], + "type": "object" + }, + "selector": { + "description": "Selector expression when the target was a selector.", + "type": "string" + }, + "selectorChain": { + "items": { + "type": "string" + }, + "type": "array" + }, + "settle": { + "properties": { + "captures": { + "type": "number" + }, + "diff": { + "description": "Settled diff vs the pre-action tree (changed lines only).", + "properties": { + "lines": { + "items": { + "properties": { + "kind": { + "enum": [ + "added", + "removed" + ], + "type": "string" + }, + "ref": { + "description": "Plain ref body (e12) for added lines.", + "type": "string" + }, + "text": { + "type": "string" + } + }, + "required": [ + "kind", + "text" + ], + "type": "object" + }, + "type": "array" + }, + "summary": { + "properties": { + "additions": { + "type": "number" + }, + "removals": { + "type": "number" + }, + "unchanged": { + "type": "number" + } + }, + "required": [ + "additions", + "removals", + "unchanged" + ], + "type": "object" + }, + "truncated": { + "description": "Lines were capped to the response bound.", + "type": "boolean" + } + }, + "required": [ + "summary", + "lines" + ], + "type": "object" + }, + "hint": { + "type": "string" + }, + "quietMs": { + "type": "number" + }, + "refs": { + "items": { + "properties": { + "ref": { + "description": "Plain ref body (e12) minted from the stored settled tree.", + "type": "string" + } + }, + "required": [ + "ref" + ], + "type": "object" + }, + "type": "array" + }, + "refsGeneration": { + "description": "Snapshot generation of the stored settled tree; refs on added diff lines were minted from it.", + "type": "number" + }, + "settled": { + "description": "Whether the UI held the quiet window before the deadline. false is advisory, not failure.", + "type": "boolean" + }, + "tail": { + "description": "Unchanged interactive refs tail: still-present, actionable elements from the settled tree, attached only when diff carries zero added-line refs (a modal-dismiss/toast-only diff).", + "items": { + "properties": { + "label": { + "type": "string" + }, + "ref": { + "description": "Plain ref body (e12) minted from the stored settled tree.", + "type": "string" + }, + "role": { + "type": "string" + } + }, + "required": [ + "ref", + "role" + ], + "type": "object" + }, + "type": "array" + }, + "tailTruncated": { + "description": "Present (true) when tail candidates exceeded the response cap.", + "type": "boolean" + }, + "timeoutMs": { + "type": "number" + }, + "waitedMs": { + "type": "number" + } + }, + "required": [ + "settled", + "waitedMs", + "captures", + "quietMs", + "timeoutMs" + ], + "type": "object" + }, + "targetHittable": { + "type": "boolean" + }, + "targetKind": { + "description": "Resolved interaction target kind.", + "enum": [ + "point", + "ref", + "selector" + ], + "type": "string" + }, + "text": { + "description": "Text submitted to the field.", + "type": "string" + }, + "warning": { + "type": "string" + }, + "x": { + "description": "Resolved interaction x coordinate when available.", + "type": "number" + }, + "y": { + "description": "Resolved interaction y coordinate when available.", + "type": "number" + } +} - added
Output schema / requiredAdded value: +[ + "targetKind", + "text" +]
- Changed
find5 fields changed- added
Input schema / properties / noRecordAdded value: +{ + "description": "Do not record this action.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "vega", + "linux", + "web", + "ios", + "macos" +] - added
Input schema / properties / recordAdded value: +{ + "description": "Force-record this out-of-band observation into a repair-armed heal (mutually exclusive with noRecord). Authored replay steps are recorded automatically and never need this. On find, valid only for a read-only action.", + "type": "boolean" +} - changed
Input schema / properties / serial / descriptionPrevious value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "Daemon response data for the find command.", + "properties": { + "cost": { + "properties": { + "nodeCount": { + "description": "Number of nodes in the original node tree when the response carries one.", + "type": "number" + }, + "runnerRoundTrips": { + "description": "Number of real runner round-trips made while serving the request.", + "type": "number" + }, + "wallClockMs": { + "description": "Total wall-clock time for the request in milliseconds.", + "type": "number" + } + }, + "required": [ + "wallClockMs", + "runnerRoundTrips" + ], + "type": "object" + }, + "found": { + "description": "Whether a wait/exists/read-only find satisfied its condition.", + "type": "boolean" + }, + "locator": { + "description": "Locator kind used for the find action.", + "type": "string" + }, + "message": { + "description": "Diagnostic message for mutating find actions.", + "type": "string" + }, + "node": { + "additionalProperties": true, + "description": "Snapshot node for find get_attrs/get_text.", + "type": "object" + }, + "query": { + "description": "Query argument used for the find action.", + "type": "string" + }, + "ref": { + "description": "Snapshot ref without the @ prefix when the find action returns one.", + "type": "string" + }, + "refsGeneration": { + "description": "ADR 0014 ref frame epoch for read-only find actions.", + "type": "number" + }, + "settle": { + "properties": { + "captures": { + "type": "number" + }, + "diff": { + "description": "Settled diff vs the pre-action tree (changed lines only).", + "properties": { + "lines": { + "items": { + "properties": { + "kind": { + "enum": [ + "added", + "removed" + ], + "type": "string" + }, + "ref": { + "description": "Plain ref body (e12) for added lines.", + "type": "string" + }, + "text": { + "type": "string" + } + }, + "required": [ + "kind", + "text" + ], + "type": "object" + }, + "type": "array" + }, + "summary": { + "properties": { + "additions": { + "type": "number" + }, + "removals": { + "type": "number" + }, + "unchanged": { + "type": "number" + } + }, + "required": [ + "additions", + "removals", + "unchanged" + ], + "type": "object" + }, + "truncated": { + "description": "Lines were capped to the response bound.", + "type": "boolean" + } + }, + "required": [ + "summary", + "lines" + ], + "type": "object" + }, + "hint": { + "type": "string" + }, + "quietMs": { + "type": "number" + }, + "refs": { + "items": { + "properties": { + "ref": { + "description": "Plain ref body (e12) minted from the stored settled tree.", + "type": "string" + } + }, + "required": [ + "ref" + ], + "type": "object" + }, + "type": "array" + }, + "refsGeneration": { + "description": "Snapshot generation of the stored settled tree; refs on added diff lines were minted from it.", + "type": "number" + }, + "settled": { + "description": "Whether the UI held the quiet window before the deadline. false is advisory, not failure.", + "type": "boolean" + }, + "tail": { + "description": "Unchanged interactive refs tail: still-present, actionable elements from the settled tree, attached only when diff carries zero added-line refs (a modal-dismiss/toast-only diff).", + "items": { + "properties": { + "label": { + "type": "string" + }, + "ref": { + "description": "Plain ref body (e12) minted from the stored settled tree.", + "type": "string" + }, + "role": { + "type": "string" + } + }, + "required": [ + "ref", + "role" + ], + "type": "object" + }, + "type": "array" + }, + "tailTruncated": { + "description": "Present (true) when tail candidates exceeded the response cap.", + "type": "boolean" + }, + "timeoutMs": { + "type": "number" + }, + "waitedMs": { + "type": "number" + } + }, + "required": [ + "settled", + "waitedMs", + "captures", + "quietMs", + "timeoutMs" + ], + "type": "object" + }, + "text": { + "description": "Text value returned by find get_text.", + "type": "string" + }, + "waitedMs": { + "description": "Milliseconds waited for a read-only find condition.", + "type": "number" + }, + "x": { + "description": "Resolved x coordinate for mutating find actions.", + "type": "number" + }, + "y": { + "description": "Resolved y coordinate for mutating find actions.", + "type": "number" + } + }, + "type": "object" +}
- Changed
focus3 fields changed- added
Input schema / properties / noRecordAdded value: +{ + "description": "Do not record this action.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "vega", + "linux", + "web", + "ios", + "macos" +] - changed
Input schema / properties / serial / descriptionPrevious value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
- Changed
gesture8 fields changed- changed
Input schema / properties / durationMs / descriptionPrevious value: -"Gesture duration in milliseconds."New value: +"Pan/transform duration." - added
Input schema / properties / durationMs / maximumAdded value: +10000 - changed
Input schema / properties / durationMs / minimumPrevious value: -0New value: +16 - added
Input schema / properties / noRecordAdded value: +{ + "description": "Do not record this action.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "vega", + "linux", + "web", + "ios", + "macos" +] - added
Input schema / properties / pointerCountAdded value: +{ + "description": "Pan touch pointer count (1 or 2).", + "maximum": 2, + "minimum": 1, + "type": "integer" +} - changed
Input schema / properties / serial / descriptionPrevious value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector." - removed
Input schema / properties / velocityRemoved value: -{ - "description": "Rotate gesture velocity.", - "minimum": 0, - "type": "integer" -}
- Changed
get4 fields changed- added
Input schema / properties / noRecordAdded value: +{ + "description": "Do not record this action.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "vega", + "linux", + "web", + "ios", + "macos" +] - added
Input schema / properties / recordAdded value: +{ + "description": "Force-record this out-of-band observation into a repair-armed heal (mutually exclusive with noRecord). Authored replay steps are recorded automatically and never need this. On find, valid only for a read-only action.", + "type": "boolean" +} - changed
Input schema / properties / serial / descriptionPrevious value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
- Changed
home3 fields changed- added
Input schema / properties / noRecordAdded value: +{ + "description": "Do not record this action.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "vega", + "linux", + "web", + "ios", + "macos" +] - changed
Input schema / properties / serial / descriptionPrevious value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
- Changed
install3 fields changed- added
Input schema / properties / noRecordAdded value: +{ + "description": "Do not record this action.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "vega", + "linux", + "web", + "ios", + "macos" +] - changed
Input schema / properties / serial / descriptionPrevious value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
- Changed
install-from-source3 fields changed- added
Input schema / properties / noRecordAdded value: +{ + "description": "Do not record this action.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "vega", + "linux", + "web", + "ios", + "macos" +] - changed
Input schema / properties / serial / descriptionPrevious value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
- Changed
is5 fields changed- added
Input schema / properties / noRecordAdded value: +{ + "description": "Do not record this action.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "vega", + "linux", + "web", + "ios", + "macos" +] - changed
Input schema / properties / predicate / enumPrevious value: -[ - "visible", - "hidden", - "exists", - "editable", - "selected", - "text" -]New value: +[ + "visible", + "hidden", + "exists", + "editable", + "selected", + "focused", + "text" +] - added
Input schema / properties / recordAdded value: +{ + "description": "Force-record this out-of-band observation into a repair-armed heal (mutually exclusive with noRecord). Authored replay steps are recorded automatically and never need this. On find, valid only for a read-only action.", + "type": "boolean" +} - changed
Input schema / properties / serial / descriptionPrevious value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
- Changed
keyboard3 fields changed- added
Input schema / properties / noRecordAdded value: +{ + "description": "Do not record this action.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "vega", + "linux", + "web", + "ios", + "macos" +] - changed
Input schema / properties / serial / descriptionPrevious value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
- Changed
logs2 fields changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "vega", + "linux", + "web", + "ios", + "macos" +] - changed
Input schema / properties / serial / descriptionPrevious value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
- Changed
longpress9 fields changed- added
Input schema / properties / noRecordAdded value: +{ + "description": "Do not record this action.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "vega", + "linux", + "web", + "ios", + "macos" +] - changed
Input schema / properties / serial / descriptionPrevious value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector." - added
Input schema / properties / settleAdded value: +{ + "description": "After the action, wait for the UI to go quiet and return the settled diff vs the pre-action tree in the same response. Best-effort; never fails the action.", + "type": "boolean" +} - added
Input schema / properties / settleQuietMsAdded value: +{ + "description": "Settle: quiet window in milliseconds (default 500).", + "minimum": 0, + "type": "integer" +} - added
Input schema / properties / timeoutMsAdded value: +{ + "description": "Settle: wait deadline in milliseconds (default 10000).", + "minimum": 1, + "type": "integer" +} - removed
Output schema / oneOfRemoved value: -[ - { - "properties": { - "backendResult": { - "additionalProperties": true, - "description": "Raw backend result passthrough.", - "type": "object" - }, - "durationMs": { - "type": "number" - }, - "kind": { - "const": "point", - "type": "string" - }, - "message": { - "type": "string" - }, - "point": { - "properties": { - "x": { - "type": "number" - }, - "y": { - "type": "number" - } - }, - "required": [ - "x", - "y" - ], - "type": "object" - }, - "warning": { - "type": "string" - } - }, - "required": [ - "kind", - "point" - ], - "type": "object" - }, - { - "properties": { - "backendResult": { - "additionalProperties": true, - "description": "Raw backend result passthrough.", - "type": "object" - }, - "durationMs": { - "type": "number" - }, - "hint": { - "type": "string" - }, - "kind": { - "const": "ref", - "type": "string" - }, - "message": { - "type": "string" - }, - "node": { - "description": "Resolved snapshot node for the matched element.", - "properties": { - "appName": { - "type": "string" - }, - "bundleId": { - "type": "string" - }, - "depth": { - "type": "number" - }, - "enabled": { - "type": "boolean" - }, - "focused": { - "type": "boolean" - }, - "hiddenContentAbove": { - "type": "boolean" - }, - "hiddenContentBelow": { - "type": "boolean" - }, - "hittable": { - "type": "boolean" - }, - "identifier": { - "type": "string" - }, - "index": { - "type": "number" - }, - "interactionBlocked": { - "enum": [ - "covered" - ], - "type": "string" - }, - "label": { - "type": "string" - }, - "parentIndex": { - "type": "number" - }, - "pid": { - "type": "number" - }, - "presentationHints": { - "items": { - "type": "string" - }, - "type": "array" - }, - "rect": { - "properties": { - "height": { - "type": "number" - }, - "width": { - "type": "number" - }, - "x": { - "type": "number" - }, - "y": { - "type": "number" - } - }, - "required": [ - "x", - "y", - "width", - "height" - ], - "type": "object" - }, - "ref": { - "description": "Stable snapshot ref such as e12.", - "type": "string" - }, - "role": { - "type": "string" - }, - "selected": { - "type": "boolean" - }, - "subrole": { - "type": "string" - }, - "surface": { - "type": "string" - }, - "type": { - "type": "string" - }, - "value": { - "type": "string" - }, - "visibleToUser": { - "type": "boolean" - }, - "windowTitle": { - "type": "string" - } - }, - "required": [ - "index", - "ref" - ], - "type": "object" - }, - "point": { - "properties": { - "x": { - "type": "number" - }, - "y": { - "type": "number" - } - }, - "required": [ - "x", - "y" - ], - "type": "object" - }, - "refLabel": { - "type": "string" - }, - "selectorChain": { - "items": { - "type": "string" - }, - "type": "array" - }, - "target": { - "properties": { - "kind": { - "const": "ref", - "type": "string" - }, - "ref": { - "type": "string" - } - }, - "required": [ - "kind", - "ref" - ], - "type": "object" - }, - "targetHittable": { - "type": "boolean" - }, - "warning": { - "type": "string" - } - }, - "required": [ - "kind", - "target" - ], - "type": "object" - }, - { - "properties": { - "backendResult": { - "additionalProperties": true, - "description": "Raw backend result passthrough.", - "type": "object" - }, - "durationMs": { - "type": "number" - }, - "hint": { - "type": "string" - }, - "kind": { - "const": "selector", - "type": "string" - }, - "message": { - "type": "string" - }, - "node": { - "description": "Resolved snapshot node for the matched element.", - "properties": { - "appName": { - "type": "string" - }, - "bundleId": { - "type": "string" - }, - "depth": { - "type": "number" - }, - "enabled": { - "type": "boolean" - }, - "focused": { - "type": "boolean" - }, - "hiddenContentAbove": { - "type": "boolean" - }, - "hiddenContentBelow": { - "type": "boolean" - }, - "hittable": { - "type": "boolean" - }, - "identifier": { - "type": "string" - }, - "index": { - "type": "number" - }, - "interactionBlocked": { - "enum": [ - "covered" - ], - "type": "string" - }, - "label": { - "type": "string" - }, - "parentIndex": { - "type": "number" - }, - "pid": { - "type": "number" - }, - "presentationHints": { - "items": { - "type": "string" - }, - "type": "array" - }, - "rect": { - "properties": { - "height": { - "type": "number" - }, - "width": { - "type": "number" - }, - "x": { - "type": "number" - }, - "y": { - "type": "number" - } - }, - "required": [ - "x", - "y", - "width", - "height" - ], - "type": "object" - }, - "ref": { - "description": "Stable snapshot ref such as e12.", - "type": "string" - }, - "role": { - "type": "string" - }, - "selected": { - "type": "boolean" - }, - "subrole": { - "type": "string" - }, - "surface": { - "type": "string" - }, - "type": { - "type": "string" - }, - "value": { - "type": "string" - }, - "visibleToUser": { - "type": "boolean" - }, - "windowTitle": { - "type": "string" - } - }, - "required": [ - "index", - "ref" - ], - "type": "object" - }, - "point": { - "properties": { - "x": { - "type": "number" - }, - "y": { - "type": "number" - } - }, - "required": [ - "x", - "y" - ], - "type": "object" - }, - "refLabel": { - "type": "string" - }, - "selectorChain": { - "items": { - "type": "string" - }, - "type": "array" - }, - "target": { - "properties": { - "kind": { - "const": "selector", - "type": "string" - }, - "selector": { - "type": "string" - } - }, - "required": [ - "kind", - "selector" - ], - "type": "object" - }, - "targetHittable": { - "type": "boolean" - }, - "warning": { - "type": "string" - } - }, - "required": [ - "kind", - "point", - "target", - "node", - "selectorChain" - ], - "type": "object" - } -] - added
Output schema / propertiesAdded value: +{ + "cost": { + "properties": { + "nodeCount": { + "description": "Number of nodes in the original node tree when the response carries one.", + "type": "number" + }, + "runnerRoundTrips": { + "description": "Number of real runner round-trips made while serving the request.", + "type": "number" + }, + "wallClockMs": { + "description": "Total wall-clock time for the request in milliseconds.", + "type": "number" + } + }, + "required": [ + "wallClockMs", + "runnerRoundTrips" + ], + "type": "object" + }, + "durationMs": { + "type": "number" + }, + "evidence": { + "properties": { + "changedFromBefore": { + "description": "Whether the post-action digest differs from the pre-action capture digest. false is evidence, not failure.", + "type": "boolean" + }, + "digest": { + "description": "Order-independent digest of the post-action node multiset.", + "type": "string" + }, + "foregroundApp": { + "description": "Foreground app bundle id or name, when the capture carries it.", + "type": "string" + }, + "interactiveNodeCount": { + "description": "Subset of nodeCount the platform reports as hittable.", + "type": "number" + }, + "nodeCount": { + "description": "Node count in the post-action interactive-only capture.", + "type": "number" + } + }, + "required": [ + "nodeCount", + "interactiveNodeCount", + "digest", + "changedFromBefore" + ], + "type": "object" + }, + "gesture": { + "const": "longpress", + "type": "string" + }, + "hint": { + "type": "string" + }, + "maestroFallbackReason": { + "const": "non-hittable-coordinate", + "type": "string" + }, + "maestroNonHittableCoordinateFallbackAllowed": { + "description": "Whether the direct iOS Maestro coordinate fallback was allowed for this selector.", + "type": "boolean" + }, + "maestroNonHittableCoordinateFallbackUsed": { + "description": "Whether the direct iOS Maestro coordinate fallback was actually used.", + "type": "boolean" + }, + "message": { + "type": "string" + }, + "ref": { + "description": "Snapshot ref without the @ prefix when the target was an @ref.", + "type": "string" + }, + "refLabel": { + "type": "string" + }, + "referenceHeight": { + "description": "Reference frame height for visualizing the interaction point.", + "type": "number" + }, + "referenceWidth": { + "description": "Reference frame width for visualizing the interaction point.", + "type": "number" + }, + "resolution": { + "description": "Pre-action disclosure of how the acting path resolved its target. Absent when resolutionDisclosure is inapplicable for the path.", + "oneOf": [ + { + "properties": { + "kind": { + "const": "unique", + "type": "string" + }, + "phase": { + "const": "pre-action", + "type": "string" + }, + "source": { + "const": "runtime", + "type": "string" + } + }, + "required": [ + "source", + "phase", + "kind" + ], + "type": "object" + }, + { + "properties": { + "alternatives": { + "description": "At most 5 losing candidates, document order. Present at default/full response levels and omitted in digest. The winner is never included.", + "items": { + "properties": { + "diagnosticRef": { + "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.", + "type": "string" + }, + "label": { + "description": "UTF-8 truncated to 256 bytes.", + "type": "string" + }, + "role": { + "description": "UTF-8 truncated to 256 bytes.", + "type": "string" + } + }, + "required": [ + "diagnosticRef" + ], + "type": "object" + }, + "type": "array" + }, + "kind": { + "const": "disambiguated", + "type": "string" + }, + "matchCount": { + "description": "Total matches resolveSelectorChain found before disambiguation.", + "type": "number" + }, + "phase": { + "const": "pre-action", + "type": "string" + }, + "source": { + "const": "runtime", + "type": "string" + }, + "tiebreak": { + "description": "The comparison that decided the winner.", + "enum": [ + "visible", + "deepest", + "smallest-area" + ], + "type": "string" + }, + "winnerDiagnostic": { + "properties": { + "diagnosticRef": { + "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.", + "type": "string" + }, + "label": { + "description": "UTF-8 truncated to 256 bytes.", + "type": "string" + }, + "role": { + "description": "UTF-8 truncated to 256 bytes.", + "type": "string" + } + }, + "required": [ + "diagnosticRef" + ], + "type": "object" + } + }, + "required": [ + "source", + "phase", + "kind", + "matchCount", + "winnerDiagnostic", + "tiebreak" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "const": "exact", + "type": "string" + }, + "phase": { + "const": "pre-action", + "type": "string" + }, + "source": { + "const": "ref", + "type": "string" + } + }, + "required": [ + "source", + "phase", + "kind" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "const": "label-fallback", + "type": "string" + }, + "phase": { + "const": "pre-action", + "type": "string" + }, + "source": { + "const": "ref", + "type": "string" + } + }, + "required": [ + "source", + "phase", + "kind" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "const": "not-observed", + "type": "string" + }, + "source": { + "const": "direct-ios", + "type": "string" + } + }, + "required": [ + "source", + "kind" + ], + "type": "object" + } + ], + "type": "object" + }, + "selector": { + "description": "Selector expression when the target was a selector.", + "type": "string" + }, + "selectorChain": { + "items": { + "type": "string" + }, + "type": "array" + }, + "settle": { + "properties": { + "captures": { + "type": "number" + }, + "diff": { + "description": "Settled diff vs the pre-action tree (changed lines only).", + "properties": { + "lines": { + "items": { + "properties": { + "kind": { + "enum": [ + "added", + "removed" + ], + "type": "string" + }, + "ref": { + "description": "Plain ref body (e12) for added lines.", + "type": "string" + }, + "text": { + "type": "string" + } + }, + "required": [ + "kind", + "text" + ], + "type": "object" + }, + "type": "array" + }, + "summary": { + "properties": { + "additions": { + "type": "number" + }, + "removals": { + "type": "number" + }, + "unchanged": { + "type": "number" + } + }, + "required": [ + "additions", + "removals", + "unchanged" + ], + "type": "object" + }, + "truncated": { + "description": "Lines were capped to the response bound.", + "type": "boolean" + } + }, + "required": [ + "summary", + "lines" + ], + "type": "object" + }, + "hint": { + "type": "string" + }, + "quietMs": { + "type": "number" + }, + "refs": { + "items": { + "properties": { + "ref": { + "description": "Plain ref body (e12) minted from the stored settled tree.", + "type": "string" + } + }, + "required": [ + "ref" + ], + "type": "object" + }, + "type": "array" + }, + "refsGeneration": { + "description": "Snapshot generation of the stored settled tree; refs on added diff lines were minted from it.", + "type": "number" + }, + "settled": { + "description": "Whether the UI held the quiet window before the deadline. false is advisory, not failure.", + "type": "boolean" + }, + "tail": { + "description": "Unchanged interactive refs tail: still-present, actionable elements from the settled tree, attached only when diff carries zero added-line refs (a modal-dismiss/toast-only diff).", + "items": { + "properties": { + "label": { + "type": "string" + }, + "ref": { + "description": "Plain ref body (e12) minted from the stored settled tree.", + "type": "string" + }, + "role": { + "type": "string" + } + }, + "required": [ + "ref", + "role" + ], + "type": "object" + }, + "type": "array" + }, + "tailTruncated": { + "description": "Present (true) when tail candidates exceeded the response cap.", + "type": "boolean" + }, + "timeoutMs": { + "type": "number" + }, + "waitedMs": { + "type": "number" + } + }, + "required": [ + "settled", + "waitedMs", + "captures", + "quietMs", + "timeoutMs" + ], + "type": "object" + }, + "targetHittable": { + "type": "boolean" + }, + "targetKind": { + "description": "Resolved interaction target kind.", + "enum": [ + "point", + "ref", + "selector" + ], + "type": "string" + }, + "warning": { + "type": "string" + }, + "x": { + "description": "Resolved interaction x coordinate when available.", + "type": "number" + }, + "y": { + "description": "Resolved interaction y coordinate when available.", + "type": "number" + } +} - added
Output schema / requiredAdded value: +[ + "targetKind" +]
- Changed
metro2 fields changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "vega", + "linux", + "web", + "ios", + "macos" +] - changed
Input schema / properties / serial / descriptionPrevious value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
- Changed
network2 fields changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "vega", + "linux", + "web", + "ios", + "macos" +] - changed
Input schema / properties / serial / descriptionPrevious value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
- Changed
open8 fields changed- added
Input schema / properties / bundleUrlAdded value: +{ + "description": "Session-scoped bundle URL hint applied to the opened app.", + "type": "string" +} - added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite an existing --save-script target instead of refusing (alias: --overwrite).", + "type": "boolean" +} - added
Input schema / properties / launchUrlAdded value: +{ + "description": "Session-scoped launch URL hint applied to the opened app.", + "type": "string" +} - added
Input schema / properties / metroHostAdded value: +{ + "description": "Session-scoped Metro/debug host hint applied to the opened app.", + "type": "string" +} - added
Input schema / properties / metroPortAdded value: +{ + "description": "Session-scoped Metro/debug port hint applied to the opened app. On an emulator/simulator the host defaults to the loopback alias (Android 10.0.2.2, iOS 127.0.0.1) when --metro-host is omitted; physical devices still require an explicit --metro-host.", + "maximum": 65535, + "minimum": 1, + "type": "integer" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "vega", + "linux", + "web", + "ios", + "macos" +] - changed
Input schema / properties / serial / descriptionPrevious value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector." - added
Input schema / properties / testImeAdded value: +{ + "description": "Activate the headless Android test IME for deterministic Unicode text entry (default on for emulators; opt-in on real devices).", + "type": "boolean" +}
- Added
orientation - Changed
perf3 fields changed- added
Input schema / properties / noRecordAdded value: +{ + "description": "Do not record this action.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "vega", + "linux", + "web", + "ios", + "macos" +] - changed
Input schema / properties / serial / descriptionPrevious value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
- Changed
press9 fields changed- added
Input schema / properties / noRecordAdded value: +{ + "description": "Do not record this action.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "vega", + "linux", + "web", + "ios", + "macos" +] - changed
Input schema / properties / serial / descriptionPrevious value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector." - added
Input schema / properties / settleAdded value: +{ + "description": "After the action, wait for the UI to go quiet and return the settled diff vs the pre-action tree in the same response. Best-effort; never fails the action.", + "type": "boolean" +} - added
Input schema / properties / settleQuietMsAdded value: +{ + "description": "Settle: quiet window in milliseconds (default 500).", + "minimum": 0, + "type": "integer" +} - added
Input schema / properties / timeoutMsAdded value: +{ + "description": "Settle: wait deadline in milliseconds (default 10000).", + "minimum": 1, + "type": "integer" +} - removed
Output schema / oneOfRemoved value: -[ - { - "properties": { - "backendResult": { - "additionalProperties": true, - "description": "Raw backend result passthrough.", - "type": "object" - }, - "evidence": { - "properties": { - "changedFromBefore": { - "description": "Whether the post-action digest differs from the pre-action capture digest. false is evidence, not failure.", - "type": "boolean" - }, - "digest": { - "description": "Order-independent digest of the post-action node multiset.", - "type": "string" - }, - "foregroundApp": { - "description": "Foreground app bundle id or name, when the capture carries it.", - "type": "string" - }, - "interactiveNodeCount": { - "description": "Subset of nodeCount the platform reports as hittable.", - "type": "number" - }, - "nodeCount": { - "description": "Node count in the post-action interactive-only capture.", - "type": "number" - } - }, - "required": [ - "nodeCount", - "interactiveNodeCount", - "digest", - "changedFromBefore" - ], - "type": "object" - }, - "kind": { - "const": "point", - "type": "string" - }, - "message": { - "type": "string" - }, - "point": { - "properties": { - "x": { - "type": "number" - }, - "y": { - "type": "number" - } - }, - "required": [ - "x", - "y" - ], - "type": "object" - }, - "warning": { - "type": "string" - } - }, - "required": [ - "kind", - "point" - ], - "type": "object" - }, - { - "properties": { - "backendResult": { - "additionalProperties": true, - "description": "Raw backend result passthrough.", - "type": "object" - }, - "evidence": { - "properties": { - "changedFromBefore": { - "description": "Whether the post-action digest differs from the pre-action capture digest. false is evidence, not failure.", - "type": "boolean" - }, - "digest": { - "description": "Order-independent digest of the post-action node multiset.", - "type": "string" - }, - "foregroundApp": { - "description": "Foreground app bundle id or name, when the capture carries it.", - "type": "string" - }, - "interactiveNodeCount": { - "description": "Subset of nodeCount the platform reports as hittable.", - "type": "number" - }, - "nodeCount": { - "description": "Node count in the post-action interactive-only capture.", - "type": "number" - } - }, - "required": [ - "nodeCount", - "interactiveNodeCount", - "digest", - "changedFromBefore" - ], - "type": "object" - }, - "hint": { - "type": "string" - }, - "kind": { - "const": "ref", - "type": "string" - }, - "message": { - "type": "string" - }, - "node": { - "description": "Resolved snapshot node for the matched element.", - "properties": { - "appName": { - "type": "string" - }, - "bundleId": { - "type": "string" - }, - "depth": { - "type": "number" - }, - "enabled": { - "type": "boolean" - }, - "focused": { - "type": "boolean" - }, - "hiddenContentAbove": { - "type": "boolean" - }, - "hiddenContentBelow": { - "type": "boolean" - }, - "hittable": { - "type": "boolean" - }, - "identifier": { - "type": "string" - }, - "index": { - "type": "number" - }, - "interactionBlocked": { - "enum": [ - "covered" - ], - "type": "string" - }, - "label": { - "type": "string" - }, - "parentIndex": { - "type": "number" - }, - "pid": { - "type": "number" - }, - "presentationHints": { - "items": { - "type": "string" - }, - "type": "array" - }, - "rect": { - "properties": { - "height": { - "type": "number" - }, - "width": { - "type": "number" - }, - "x": { - "type": "number" - }, - "y": { - "type": "number" - } - }, - "required": [ - "x", - "y", - "width", - "height" - ], - "type": "object" - }, - "ref": { - "description": "Stable snapshot ref such as e12.", - "type": "string" - }, - "role": { - "type": "string" - }, - "selected": { - "type": "boolean" - }, - "subrole": { - "type": "string" - }, - "surface": { - "type": "string" - }, - "type": { - "type": "string" - }, - "value": { - "type": "string" - }, - "visibleToUser": { - "type": "boolean" - }, - "windowTitle": { - "type": "string" - } - }, - "required": [ - "index", - "ref" - ], - "type": "object" - }, - "point": { - "properties": { - "x": { - "type": "number" - }, - "y": { - "type": "number" - } - }, - "required": [ - "x", - "y" - ], - "type": "object" - }, - "refLabel": { - "type": "string" - }, - "selectorChain": { - "items": { - "type": "string" - }, - "type": "array" - }, - "target": { - "properties": { - "kind": { - "const": "ref", - "type": "string" - }, - "ref": { - "type": "string" - } - }, - "required": [ - "kind", - "ref" - ], - "type": "object" - }, - "targetHittable": { - "type": "boolean" - }, - "warning": { - "type": "string" - } - }, - "required": [ - "kind", - "target" - ], - "type": "object" - }, - { - "properties": { - "backendResult": { - "additionalProperties": true, - "description": "Raw backend result passthrough.", - "type": "object" - }, - "evidence": { - "properties": { - "changedFromBefore": { - "description": "Whether the post-action digest differs from the pre-action capture digest. false is evidence, not failure.", - "type": "boolean" - }, - "digest": { - "description": "Order-independent digest of the post-action node multiset.", - "type": "string" - }, - "foregroundApp": { - "description": "Foreground app bundle id or name, when the capture carries it.", - "type": "string" - }, - "interactiveNodeCount": { - "description": "Subset of nodeCount the platform reports as hittable.", - "type": "number" - }, - "nodeCount": { - "description": "Node count in the post-action interactive-only capture.", - "type": "number" - } - }, - "required": [ - "nodeCount", - "interactiveNodeCount", - "digest", - "changedFromBefore" - ], - "type": "object" - }, - "hint": { - "type": "string" - }, - "kind": { - "const": "selector", - "type": "string" - }, - "message": { - "type": "string" - }, - "node": { - "description": "Resolved snapshot node for the matched element.", - "properties": { - "appName": { - "type": "string" - }, - "bundleId": { - "type": "string" - }, - "depth": { - "type": "number" - }, - "enabled": { - "type": "boolean" - }, - "focused": { - "type": "boolean" - }, - "hiddenContentAbove": { - "type": "boolean" - }, - "hiddenContentBelow": { - "type": "boolean" - }, - "hittable": { - "type": "boolean" - }, - "identifier": { - "type": "string" - }, - "index": { - "type": "number" - }, - "interactionBlocked": { - "enum": [ - "covered" - ], - "type": "string" - }, - "label": { - "type": "string" - }, - "parentIndex": { - "type": "number" - }, - "pid": { - "type": "number" - }, - "presentationHints": { - "items": { - "type": "string" - }, - "type": "array" - }, - "rect": { - "properties": { - "height": { - "type": "number" - }, - "width": { - "type": "number" - }, - "x": { - "type": "number" - }, - "y": { - "type": "number" - } - }, - "required": [ - "x", - "y", - "width", - "height" - ], - "type": "object" - }, - "ref": { - "description": "Stable snapshot ref such as e12.", - "type": "string" - }, - "role": { - "type": "string" - }, - "selected": { - "type": "boolean" - }, - "subrole": { - "type": "string" - }, - "surface": { - "type": "string" - }, - "type": { - "type": "string" - }, - "value": { - "type": "string" - }, - "visibleToUser": { - "type": "boolean" - }, - "windowTitle": { - "type": "string" - } - }, - "required": [ - "index", - "ref" - ], - "type": "object" - }, - "point": { - "properties": { - "x": { - "type": "number" - }, - "y": { - "type": "number" - } - }, - "required": [ - "x", - "y" - ], - "type": "object" - }, - "refLabel": { - "type": "string" - }, - "selectorChain": { - "items": { - "type": "string" - }, - "type": "array" - }, - "target": { - "properties": { - "kind": { - "const": "selector", - "type": "string" - }, - "selector": { - "type": "string" - } - }, - "required": [ - "kind", - "selector" - ], - "type": "object" - }, - "targetHittable": { - "type": "boolean" - }, - "warning": { - "type": "string" - } - }, - "required": [ - "kind", - "point", - "target", - "node", - "selectorChain" - ], - "type": "object" - } -] - added
Output schema / propertiesAdded value: +{ + "button": { + "enum": [ + "secondary", + "middle" + ], + "type": "string" + }, + "cost": { + "properties": { + "nodeCount": { + "description": "Number of nodes in the original node tree when the response carries one.", + "type": "number" + }, + "runnerRoundTrips": { + "description": "Number of real runner round-trips made while serving the request.", + "type": "number" + }, + "wallClockMs": { + "description": "Total wall-clock time for the request in milliseconds.", + "type": "number" + } + }, + "required": [ + "wallClockMs", + "runnerRoundTrips" + ], + "type": "object" + }, + "count": { + "description": "Number of press/click repetitions.", + "type": "number" + }, + "doubleTap": { + "description": "Whether the command requested a double-tap action.", + "type": "boolean" + }, + "evidence": { + "properties": { + "changedFromBefore": { + "description": "Whether the post-action digest differs from the pre-action capture digest. false is evidence, not failure.", + "type": "boolean" + }, + "digest": { + "description": "Order-independent digest of the post-action node multiset.", + "type": "string" + }, + "foregroundApp": { + "description": "Foreground app bundle id or name, when the capture carries it.", + "type": "string" + }, + "interactiveNodeCount": { + "description": "Subset of nodeCount the platform reports as hittable.", + "type": "number" + }, + "nodeCount": { + "description": "Node count in the post-action interactive-only capture.", + "type": "number" + } + }, + "required": [ + "nodeCount", + "interactiveNodeCount", + "digest", + "changedFromBefore" + ], + "type": "object" + }, + "hint": { + "type": "string" + }, + "holdMs": { + "description": "Hold duration for each action.", + "type": "number" + }, + "intervalMs": { + "description": "Delay between repeated press/click actions.", + "type": "number" + }, + "jitterPx": { + "description": "Randomization radius in pixels.", + "type": "number" + }, + "maestroFallbackReason": { + "const": "non-hittable-coordinate", + "type": "string" + }, + "maestroNonHittableCoordinateFallbackAllowed": { + "description": "Whether the direct iOS Maestro coordinate fallback was allowed for this selector.", + "type": "boolean" + }, + "maestroNonHittableCoordinateFallbackUsed": { + "description": "Whether the direct iOS Maestro coordinate fallback was actually used.", + "type": "boolean" + }, + "message": { + "type": "string" + }, + "ref": { + "description": "Snapshot ref without the @ prefix when the target was an @ref.", + "type": "string" + }, + "refLabel": { + "type": "string" + }, + "referenceHeight": { + "description": "Reference frame height for visualizing the interaction point.", + "type": "number" + }, + "referenceWidth": { + "description": "Reference frame width for visualizing the interaction point.", + "type": "number" + }, + "resolution": { + "description": "Pre-action disclosure of how the acting path resolved its target. Absent when resolutionDisclosure is inapplicable for the path.", + "oneOf": [ + { + "properties": { + "kind": { + "const": "unique", + "type": "string" + }, + "phase": { + "const": "pre-action", + "type": "string" + }, + "source": { + "const": "runtime", + "type": "string" + } + }, + "required": [ + "source", + "phase", + "kind" + ], + "type": "object" + }, + { + "properties": { + "alternatives": { + "description": "At most 5 losing candidates, document order. Present at default/full response levels and omitted in digest. The winner is never included.", + "items": { + "properties": { + "diagnosticRef": { + "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.", + "type": "string" + }, + "label": { + "description": "UTF-8 truncated to 256 bytes.", + "type": "string" + }, + "role": { + "description": "UTF-8 truncated to 256 bytes.", + "type": "string" + } + }, + "required": [ + "diagnosticRef" + ], + "type": "object" + }, + "type": "array" + }, + "kind": { + "const": "disambiguated", + "type": "string" + }, + "matchCount": { + "description": "Total matches resolveSelectorChain found before disambiguation.", + "type": "number" + }, + "phase": { + "const": "pre-action", + "type": "string" + }, + "source": { + "const": "runtime", + "type": "string" + }, + "tiebreak": { + "description": "The comparison that decided the winner.", + "enum": [ + "visible", + "deepest", + "smallest-area" + ], + "type": "string" + }, + "winnerDiagnostic": { + "properties": { + "diagnosticRef": { + "description": "Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.", + "type": "string" + }, + "label": { + "description": "UTF-8 truncated to 256 bytes.", + "type": "string" + }, + "role": { + "description": "UTF-8 truncated to 256 bytes.", + "type": "string" + } + }, + "required": [ + "diagnosticRef" + ], + "type": "object" + } + }, + "required": [ + "source", + "phase", + "kind", + "matchCount", + "winnerDiagnostic", + "tiebreak" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "const": "exact", + "type": "string" + }, + "phase": { + "const": "pre-action", + "type": "string" + }, + "source": { + "const": "ref", + "type": "string" + } + }, + "required": [ + "source", + "phase", + "kind" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "const": "label-fallback", + "type": "string" + }, + "phase": { + "const": "pre-action", + "type": "string" + }, + "source": { + "const": "ref", + "type": "string" + } + }, + "required": [ + "source", + "phase", + "kind" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "const": "not-observed", + "type": "string" + }, + "source": { + "const": "direct-ios", + "type": "string" + } + }, + "required": [ + "source", + "kind" + ], + "type": "object" + } + ], + "type": "object" + }, + "selector": { + "description": "Selector expression when the target was a selector.", + "type": "string" + }, + "selectorChain": { + "items": { + "type": "string" + }, + "type": "array" + }, + "settle": { + "properties": { + "captures": { + "type": "number" + }, + "diff": { + "description": "Settled diff vs the pre-action tree (changed lines only).", + "properties": { + "lines": { + "items": { + "properties": { + "kind": { + "enum": [ + "added", + "removed" + ], + "type": "string" + }, + "ref": { + "description": "Plain ref body (e12) for added lines.", + "type": "string" + }, + "text": { + "type": "string" + } + }, + "required": [ + "kind", + "text" + ], + "type": "object" + }, + "type": "array" + }, + "summary": { + "properties": { + "additions": { + "type": "number" + }, + "removals": { + "type": "number" + }, + "unchanged": { + "type": "number" + } + }, + "required": [ + "additions", + "removals", + "unchanged" + ], + "type": "object" + }, + "truncated": { + "description": "Lines were capped to the response bound.", + "type": "boolean" + } + }, + "required": [ + "summary", + "lines" + ], + "type": "object" + }, + "hint": { + "type": "string" + }, + "quietMs": { + "type": "number" + }, + "refs": { + "items": { + "properties": { + "ref": { + "description": "Plain ref body (e12) minted from the stored settled tree.", + "type": "string" + } + }, + "required": [ + "ref" + ], + "type": "object" + }, + "type": "array" + }, + "refsGeneration": { + "description": "Snapshot generation of the stored settled tree; refs on added diff lines were minted from it.", + "type": "number" + }, + "settled": { + "description": "Whether the UI held the quiet window before the deadline. false is advisory, not failure.", + "type": "boolean" + }, + "tail": { + "description": "Unchanged interactive refs tail: still-present, actionable elements from the settled tree, attached only when diff carries zero added-line refs (a modal-dismiss/toast-only diff).", + "items": { + "properties": { + "label": { + "type": "string" + }, + "ref": { + "description": "Plain ref body (e12) minted from the stored settled tree.", + "type": "string" + }, + "role": { + "type": "string" + } + }, + "required": [ + "ref", + "role" + ], + "type": "object" + }, + "type": "array" + }, + "tailTruncated": { + "description": "Present (true) when tail candidates exceeded the response cap.", + "type": "boolean" + }, + "timeoutMs": { + "type": "number" + }, + "waitedMs": { + "type": "number" + } + }, + "required": [ + "settled", + "waitedMs", + "captures", + "quietMs", + "timeoutMs" + ], + "type": "object" + }, + "targetHittable": { + "type": "boolean" + }, + "targetKind": { + "description": "Resolved interaction target kind.", + "enum": [ + "point", + "ref", + "selector" + ], + "type": "string" + }, + "warning": { + "type": "string" + }, + "x": { + "description": "Resolved interaction x coordinate when available.", + "type": "number" + }, + "y": { + "description": "Resolved interaction y coordinate when available.", + "type": "number" + } +} - added
Output schema / requiredAdded value: +[ + "targetKind" +]
- Changed
push4 fields changed- added
Input schema / properties / noRecordAdded value: +{ + "description": "Do not record this action.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "vega", + "linux", + "web", + "ios", + "macos" +] - changed
Input schema / properties / serial / descriptionPrevious value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "oneOf": [ + { + "properties": { + "bundleId": { + "type": "string" + }, + "message": { + "type": "string" + }, + "platform": { + "const": "ios", + "type": "string" + } + }, + "required": [ + "platform", + "bundleId", + "message" + ], + "type": "object" + }, + { + "properties": { + "action": { + "type": "string" + }, + "extrasCount": { + "type": "number" + }, + "message": { + "type": "string" + }, + "package": { + "type": "string" + }, + "platform": { + "const": "android", + "type": "string" + } + }, + "required": [ + "platform", + "package", + "action", + "extrasCount", + "message" + ], + "type": "object" + } + ], + "type": "object" +}
- Changed
react-native3 fields changed- added
Input schema / properties / noRecordAdded value: +{ + "description": "Do not record this action.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "vega", + "linux", + "web", + "ios", + "macos" +] - changed
Input schema / properties / serial / descriptionPrevious value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
- Changed
record5 fields changed- added
Input schema / properties / noRecordAdded value: +{ + "description": "Do not record this action.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "vega", + "linux", + "web", + "ios", + "macos" +] - added
Input schema / properties / recordingScopeAdded value: +{ + "enum": [ + "app", + "device", + "system" + ], + "type": "string" +} - changed
Input schema / properties / serial / descriptionPrevious value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "oneOf": [ + { + "properties": { + "activeSessionApp": { + "additionalProperties": true, + "type": "object" + }, + "outPath": { + "type": "string" + }, + "recordOnlySession": { + "type": "boolean" + }, + "recording": { + "const": "started", + "type": "string" + }, + "recordingBackend": { + "type": "string" + }, + "recordingScope": { + "type": "string" + }, + "sessionStateDir": { + "type": "string" + }, + "showTouches": { + "type": "boolean" + } + }, + "required": [ + "recording", + "outPath", + "sessionStateDir", + "showTouches" + ], + "type": "object" + }, + { + "properties": { + "activeSessionApp": { + "additionalProperties": true, + "type": "object" + }, + "artifacts": { + "items": { + "properties": { + "artifactType": { + "type": "string" + }, + "field": { + "type": "string" + }, + "fileName": { + "type": "string" + }, + "localPath": { + "type": "string" + }, + "path": { + "type": "string" + } + }, + "required": [ + "field" + ], + "type": "object" + }, + "type": "array" + }, + "chunks": { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "durationMs": { + "type": "number" + }, + "outPath": { + "type": "string" + }, + "overlayWarning": { + "type": "string" + }, + "recordOnlySession": { + "type": "boolean" + }, + "recording": { + "const": "stopped", + "type": "string" + }, + "recordingBackend": { + "type": "string" + }, + "recordingScope": { + "type": "string" + }, + "showTouches": { + "type": "boolean" + }, + "telemetryPath": { + "type": "string" + }, + "warning": { + "type": "string" + } + }, + "required": [ + "recording", + "outPath", + "artifacts", + "durationMs", + "showTouches" + ], + "type": "object" + } + ], + "type": "object" +}
- Changed
reinstall3 fields changed- added
Input schema / properties / noRecordAdded value: +{ + "description": "Do not record this action.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "vega", + "linux", + "web", + "ios", + "macos" +] - changed
Input schema / properties / serial / descriptionPrevious value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
- Changed
replay10 fields changed- added
Input schema / properties / bundleUrlAdded value: +{ + "description": "Bundle URL hint inherited by replay-opened sessions.", + "type": "string" +} - added
Input schema / properties / forceAdded value: +{ + "type": "boolean" +} - added
Input schema / properties / metroHostAdded value: +{ + "description": "Metro/debug host hint inherited by replay-opened sessions.", + "type": "string" +} - added
Input schema / properties / metroPortAdded value: +{ + "description": "Metro/debug port hint inherited by replay-opened sessions.", + "type": "integer" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "vega", + "linux", + "web", + "ios", + "macos" +] - added
Input schema / properties / resumeFromAdded value: +{ + "type": "integer" +} - added
Input schema / properties / resumePlanDigestAdded value: +{ + "type": "string" +} - added
Input schema / properties / saveScriptAdded value: +{ + "oneOf": [ + { + "type": "boolean" + }, + { + "type": "string" + } + ] +} - changed
Input schema / properties / serial / descriptionPrevious value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "artifactPaths": { + "items": { + "type": "string" + }, + "type": "array" + }, + "healed": { + "type": "number" + }, + "message": { + "type": "string" + }, + "replayed": { + "type": "number" + }, + "session": { + "type": "string" + }, + "sessionActive": { + "description": "True iff the session is still active — the script had no terminal close.", + "type": "boolean" + }, + "snapshotDiagnostics": { + "additionalProperties": true, + "type": "object" + } + }, + "required": [ + "replayed", + "healed", + "session", + "sessionActive", + "artifactPaths", + "message" + ], + "type": "object" +}
- Removed
rotate - Changed
screenshot4 fields changed- added
Input schema / properties / noRecordAdded value: +{ + "description": "Do not record this action.", + "type": "boolean" +} - added
Input schema / properties / pixelDensityAdded value: +{ + "description": "Output screenshot pixel density in pixels per logical point.", + "minimum": 1, + "type": "integer" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "vega", + "linux", + "web", + "ios", + "macos" +] - changed
Input schema / properties / serial / descriptionPrevious value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
- Changed
scroll3 fields changed- added
Input schema / properties / noRecordAdded value: +{ + "description": "Do not record this action.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "vega", + "linux", + "web", + "ios", + "macos" +] - changed
Input schema / properties / serial / descriptionPrevious value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
- Changed
session6 fields changed- changed
Input schema / properties / action / descriptionPrevious value: -"list shows active sessions; state-dir prints the resolved daemon state directory without contacting the daemon."New value: +"list shows active sessions; state-dir prints the daemon state directory; save-script publishes an armed recording without teardown." - changed
Input schema / properties / action / enumPrevious value: -[ - "list", - "state-dir" -]New value: +[ + "list", + "state-dir", + "save-script" +] - added
Input schema / properties / forceAdded value: +{ + "description": "Atomically replace an existing save-script target.", + "type": "boolean" +} - added
Input schema / properties / pathAdded value: +{ + "description": "Optional .ad output path for save-script.", + "type": "string" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "vega", + "linux", + "web", + "ios", + "macos" +] - changed
Input schema / properties / serial / descriptionPrevious value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
- Changed
settings3 fields changed- added
Input schema / properties / noRecordAdded value: +{ + "description": "Do not record this action.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "vega", + "linux", + "web", + "ios", + "macos" +] - changed
Input schema / properties / serial / descriptionPrevious value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
- Changed
shutdown3 fields changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "vega", + "linux", + "web", + "ios", + "macos" +] - changed
Input schema / properties / serial / descriptionPrevious value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector." - changed
Output schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "linux", - "web" -]New value: +[ + "ios", + "macos", + "android", + "vega", + "linux", + "web" +]
- Changed
snapshot4 fields changed- added
Input schema / properties / noRecordAdded value: +{ + "description": "Do not record this action.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "vega", + "linux", + "web", + "ios", + "macos" +] - added
Input schema / properties / recordAdded value: +{ + "description": "Force-record this out-of-band observation into a repair-armed heal (mutually exclusive with noRecord). Authored replay steps are recorded automatically and never need this.", + "type": "boolean" +} - changed
Input schema / properties / serial / descriptionPrevious value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
- Changed
swipe6 fields changed- added
Input schema / properties / count / maximumAdded value: +200 - removed
Input schema / properties / durationMsRemoved value: -{ - "description": "Swipe duration in milliseconds.", - "minimum": 0, - "type": "integer" -} - added
Input schema / properties / noRecordAdded value: +{ + "description": "Do not record this action.", + "type": "boolean" +} - added
Input schema / properties / pauseMs / maximumAdded value: +10000 - changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "vega", + "linux", + "web", + "ios", + "macos" +] - changed
Input schema / properties / serial / descriptionPrevious value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
- Changed
test6 fields changed- added
Input schema / properties / bundleUrlAdded value: +{ + "description": "Bundle URL hint inherited by each test session.", + "type": "string" +} - added
Input schema / properties / metroHostAdded value: +{ + "description": "Metro/debug host hint inherited by each test session.", + "type": "string" +} - added
Input schema / properties / metroPortAdded value: +{ + "description": "Metro/debug port hint inherited by each test session.", + "type": "integer" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "vega", + "linux", + "web", + "ios", + "macos" +] - changed
Input schema / properties / serial / descriptionPrevious value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "durationMs": { + "type": "number" + }, + "executed": { + "type": "number" + }, + "failed": { + "type": "number" + }, + "failures": { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "notRun": { + "type": "number" + }, + "passed": { + "type": "number" + }, + "skipped": { + "type": "number" + }, + "snapshotDiagnostics": { + "additionalProperties": true, + "type": "object" + }, + "tests": { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "total": { + "type": "number" + } + }, + "required": [ + "total", + "executed", + "passed", + "failed", + "skipped", + "notRun", + "durationMs", + "failures", + "tests" + ], + "type": "object" +}
- Changed
trace4 fields changed- added
Input schema / properties / noRecordAdded value: +{ + "description": "Do not record this action.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "vega", + "linux", + "web", + "ios", + "macos" +] - changed
Input schema / properties / serial / descriptionPrevious value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "oneOf": [ + { + "properties": { + "outPath": { + "type": "string" + }, + "trace": { + "const": "started", + "type": "string" + } + }, + "required": [ + "trace", + "outPath" + ], + "type": "object" + }, + { + "properties": { + "artifacts": { + "items": { + "properties": { + "artifactType": { + "type": "string" + }, + "field": { + "type": "string" + }, + "fileName": { + "type": "string" + }, + "localPath": { + "type": "string" + }, + "path": { + "type": "string" + } + }, + "required": [ + "field" + ], + "type": "object" + }, + "type": "array" + }, + "outPath": { + "type": "string" + }, + "trace": { + "const": "stopped", + "type": "string" + } + }, + "required": [ + "trace", + "outPath", + "artifacts" + ], + "type": "object" + } + ], + "type": "object" +}
- Changed
trigger-app-event4 fields changed- added
Input schema / properties / noRecordAdded value: +{ + "description": "Do not record this action.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "vega", + "linux", + "web", + "ios", + "macos" +] - changed
Input schema / properties / serial / descriptionPrevious value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "event": { + "type": "string" + }, + "eventUrl": { + "type": "string" + }, + "message": { + "type": "string" + }, + "transport": { + "const": "deep-link", + "type": "string" + } + }, + "required": [ + "event", + "eventUrl", + "transport", + "message" + ], + "type": "object" +}
- Added
tv-remote - Changed
type3 fields changed- added
Input schema / properties / noRecordAdded value: +{ + "description": "Do not record this action.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "vega", + "linux", + "web", + "ios", + "macos" +] - changed
Input schema / properties / serial / descriptionPrevious value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
- Changed
viewport3 fields changed- added
Input schema / properties / noRecordAdded value: +{ + "description": "Do not record this action.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "vega", + "linux", + "web", + "ios", + "macos" +] - changed
Input schema / properties / serial / descriptionPrevious value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector."
- Changed
wait4 fields changed- added
Input schema / properties / noRecordAdded value: +{ + "description": "Do not record this action.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "apple", - "android", - "linux", - "web", - "ios", - "macos" -]New value: +[ + "apple", + "android", + "vega", + "linux", + "web", + "ios", + "macos" +] - changed
Input schema / properties / serial / descriptionPrevious value: -"Android serial selector."New value: +"Android device or Vega VVD serial selector." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "captures": { + "type": "number" + }, + "hint": { + "type": "string" + }, + "kind": { + "const": "selector", + "type": "string" + }, + "nodeCount": { + "type": "number" + }, + "selector": { + "type": "string" + }, + "text": { + "type": "string" + }, + "waitedMs": { + "type": "number" + }, + "warning": { + "type": "string" + } + }, + "required": [ + "waitedMs" + ], + "type": "object" +}
52 tool updates
v0.17.11- Changed
alert3 fields changed- added
Input schema / properties / includeCostAdded value: +{ + "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "web", - "apple" -]New value: +[ + "apple", + "android", + "linux", + "web", + "ios", + "macos" +] - added
Input schema / properties / responseLevelAdded value: +{ + "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.", + "enum": [ + "digest", + "default", + "full" + ], + "type": "string" +}
- Changed
app-switcher4 fields changed- added
Input schema / properties / includeCostAdded value: +{ + "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "web", - "apple" -]New value: +[ + "apple", + "android", + "linux", + "web", + "ios", + "macos" +] - added
Input schema / properties / responseLevelAdded value: +{ + "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.", + "enum": [ + "digest", + "default", + "full" + ], + "type": "string" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "action": { + "const": "app-switcher", + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "action", + "message" + ], + "type": "object" +}
- Changed
apps3 fields changed- added
Input schema / properties / includeCostAdded value: +{ + "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "web", - "apple" -]New value: +[ + "apple", + "android", + "linux", + "web", + "ios", + "macos" +] - added
Input schema / properties / responseLevelAdded value: +{ + "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.", + "enum": [ + "digest", + "default", + "full" + ], + "type": "string" +}
- Changed
appstate4 fields changed- added
Input schema / properties / includeCostAdded value: +{ + "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "web", - "apple" -]New value: +[ + "apple", + "android", + "linux", + "web", + "ios", + "macos" +] - added
Input schema / properties / responseLevelAdded value: +{ + "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.", + "enum": [ + "digest", + "default", + "full" + ], + "type": "string" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "oneOf": [ + { + "properties": { + "appBundleId": { + "type": "string" + }, + "appName": { + "type": "string" + }, + "device_udid": { + "description": "iOS only — the session device UDID.", + "type": "string" + }, + "ios_simulator_device_set": { + "description": "iOS only — the simulator set path, or null when unknown.", + "type": [ + "string", + "null" + ] + }, + "platform": { + "enum": [ + "ios", + "macos" + ], + "type": "string" + }, + "source": { + "const": "session", + "type": "string" + }, + "surface": { + "enum": [ + "app", + "frontmost-app", + "desktop", + "menubar" + ], + "type": "string" + } + }, + "required": [ + "platform", + "appName", + "source", + "surface" + ], + "type": "object" + }, + { + "properties": { + "activity": { + "type": "string" + }, + "package": { + "type": "string" + }, + "platform": { + "const": "android", + "type": "string" + } + }, + "required": [ + "platform", + "package", + "activity" + ], + "type": "object" + } + ], + "type": "object" +}
- Added
artifacts - Added
audio - Changed
back4 fields changed- added
Input schema / properties / includeCostAdded value: +{ + "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "web", - "apple" -]New value: +[ + "apple", + "android", + "linux", + "web", + "ios", + "macos" +] - added
Input schema / properties / responseLevelAdded value: +{ + "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.", + "enum": [ + "digest", + "default", + "full" + ], + "type": "string" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "action": { + "const": "back", + "type": "string" + }, + "message": { + "type": "string" + }, + "mode": { + "enum": [ + "in-app", + "system" + ], + "type": "string" + } + }, + "required": [ + "action", + "mode", + "message" + ], + "type": "object" +}
- Changed
batch4 fields changed- added
Input schema / properties / includeCostAdded value: +{ + "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "web", - "apple" -]New value: +[ + "apple", + "android", + "linux", + "web", + "ios", + "macos" +] - added
Input schema / properties / responseLevelAdded value: +{ + "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.", + "enum": [ + "digest", + "default", + "full" + ], + "type": "string" +} - changed
Input schema / properties / steps / items / properties / command / enumPrevious value: -[ - "devices", - "boot", - "shutdown", - "apps", - "open", - "close", - "install", - "reinstall", - "install-from-source", - "push", - "trigger-app-event", - "snapshot", - "screenshot", - "diff", - "wait", - "alert", - "settings", - "click", - "press", - "longpress", - "swipe", - "focus", - "type", - "fill", - "scroll", - "get", - "gesture", - "is", - "find", - "perf", - "logs", - "network", - "record", - "trace", - "test", - "appstate", - "back", - "home", - "rotate", - "app-switcher", - "keyboard", - "clipboard", - "react-native" -]New value: +[ + "devices", + "doctor", + "apps", + "boot", + "shutdown", + "appstate", + "perf", + "logs", + "network", + "audio", + "test", + "clipboard", + "keyboard", + "install", + "reinstall", + "push", + "trigger-app-event", + "open", + "close", + "snapshot", + "diff", + "wait", + "alert", + "settings", + "react-native", + "record", + "trace", + "find", + "click", + "fill", + "longpress", + "press", + "type", + "get", + "is", + "back", + "gesture", + "home", + "rotate", + "scroll", + "swipe", + "focus", + "screenshot", + "app-switcher", + "install-from-source" +]
- Changed
boot4 fields changed- added
Input schema / properties / includeCostAdded value: +{ + "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "web", - "apple" -]New value: +[ + "apple", + "android", + "linux", + "web", + "ios", + "macos" +] - added
Input schema / properties / responseLevelAdded value: +{ + "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.", + "enum": [ + "digest", + "default", + "full" + ], + "type": "string" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "booted": { + "const": true, + "type": "boolean" + }, + "device": { + "description": "Human-readable device name.", + "type": "string" + }, + "id": { + "description": "Stable device id.", + "type": "string" + }, + "kind": { + "enum": [ + "simulator", + "emulator", + "device" + ], + "type": "string" + }, + "platform": { + "enum": [ + "apple", + "android", + "linux", + "web" + ], + "type": "string" + }, + "target": { + "enum": [ + "mobile", + "tv", + "desktop" + ], + "type": "string" + } + }, + "required": [ + "platform", + "target", + "device", + "id", + "kind", + "booted" + ], + "type": "object" +}
- Changed
click4 fields changed- added
Input schema / properties / includeCostAdded value: +{ + "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "web", - "apple" -]New value: +[ + "apple", + "android", + "linux", + "web", + "ios", + "macos" +] - added
Input schema / properties / responseLevelAdded value: +{ + "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.", + "enum": [ + "digest", + "default", + "full" + ], + "type": "string" +} - added
Input schema / properties / verifyAdded value: +{ + "description": "Capture cheap post-action evidence (AX digest, node counts, changedFromBefore) instead of a follow-up snapshot.", + "type": "boolean" +}
- Changed
clipboard4 fields changed- added
Input schema / properties / includeCostAdded value: +{ + "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "web", - "apple" -]New value: +[ + "apple", + "android", + "linux", + "web", + "ios", + "macos" +] - added
Input schema / properties / responseLevelAdded value: +{ + "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.", + "enum": [ + "digest", + "default", + "full" + ], + "type": "string" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "oneOf": [ + { + "properties": { + "action": { + "const": "read", + "type": "string" + }, + "text": { + "type": "string" + } + }, + "required": [ + "action", + "text" + ], + "type": "object" + }, + { + "properties": { + "action": { + "const": "write", + "type": "string" + }, + "message": { + "type": "string" + }, + "textLength": { + "type": "number" + } + }, + "required": [ + "action", + "textLength", + "message" + ], + "type": "object" + } + ], + "type": "object" +}
- Changed
close3 fields changed- added
Input schema / properties / includeCostAdded value: +{ + "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "web", - "apple" -]New value: +[ + "apple", + "android", + "linux", + "web", + "ios", + "macos" +] - added
Input schema / properties / responseLevelAdded value: +{ + "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.", + "enum": [ + "digest", + "default", + "full" + ], + "type": "string" +}
- Changed
debug3 fields changed- added
Input schema / properties / includeCostAdded value: +{ + "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "web", - "apple" -]New value: +[ + "apple", + "android", + "linux", + "web", + "ios", + "macos" +] - added
Input schema / properties / responseLevelAdded value: +{ + "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.", + "enum": [ + "digest", + "default", + "full" + ], + "type": "string" +}
- Changed
devices3 fields changed- added
Input schema / properties / includeCostAdded value: +{ + "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "web", - "apple" -]New value: +[ + "apple", + "android", + "linux", + "web", + "ios", + "macos" +] - added
Input schema / properties / responseLevelAdded value: +{ + "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.", + "enum": [ + "digest", + "default", + "full" + ], + "type": "string" +}
- Changed
diff3 fields changed- added
Input schema / properties / includeCostAdded value: +{ + "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "web", - "apple" -]New value: +[ + "apple", + "android", + "linux", + "web", + "ios", + "macos" +] - added
Input schema / properties / responseLevelAdded value: +{ + "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.", + "enum": [ + "digest", + "default", + "full" + ], + "type": "string" +}
- Added
doctor - Changed
fill5 fields changed- added
Input schema / properties / includeCostAdded value: +{ + "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "web", - "apple" -]New value: +[ + "apple", + "android", + "linux", + "web", + "ios", + "macos" +] - added
Input schema / properties / responseLevelAdded value: +{ + "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.", + "enum": [ + "digest", + "default", + "full" + ], + "type": "string" +} - added
Input schema / properties / verifyAdded value: +{ + "description": "Capture cheap post-action evidence (AX digest, node counts, changedFromBefore) instead of a follow-up snapshot.", + "type": "boolean" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "oneOf": [ + { + "properties": { + "backendResult": { + "additionalProperties": true, + "description": "Raw backend result passthrough.", + "type": "object" + }, + "evidence": { + "properties": { + "changedFromBefore": { + "description": "Whether the post-action digest differs from the pre-action capture digest. false is evidence, not failure.", + "type": "boolean" + }, + "digest": { + "description": "Order-independent digest of the post-action node multiset.", + "type": "string" + }, + "foregroundApp": { + "description": "Foreground app bundle id or name, when the capture carries it.", + "type": "string" + }, + "interactiveNodeCount": { + "description": "Subset of nodeCount the platform reports as hittable.", + "type": "number" + }, + "nodeCount": { + "description": "Node count in the post-action interactive-only capture.", + "type": "number" + } + }, + "required": [ + "nodeCount", + "interactiveNodeCount", + "digest", + "changedFromBefore" + ], + "type": "object" + }, + "kind": { + "const": "point", + "type": "string" + }, + "message": { + "type": "string" + }, + "point": { + "properties": { + "x": { + "type": "number" + }, + "y": { + "type": "number" + } + }, + "required": [ + "x", + "y" + ], + "type": "object" + }, + "text": { + "description": "Text submitted to the field.", + "type": "string" + }, + "warning": { + "type": "string" + } + }, + "required": [ + "kind", + "point", + "text" + ], + "type": "object" + }, + { + "properties": { + "backendResult": { + "additionalProperties": true, + "description": "Raw backend result passthrough.", + "type": "object" + }, + "evidence": { + "properties": { + "changedFromBefore": { + "description": "Whether the post-action digest differs from the pre-action capture digest. false is evidence, not failure.", + "type": "boolean" + }, + "digest": { + "description": "Order-independent digest of the post-action node multiset.", + "type": "string" + }, + "foregroundApp": { + "description": "Foreground app bundle id or name, when the capture carries it.", + "type": "string" + }, + "interactiveNodeCount": { + "description": "Subset of nodeCount the platform reports as hittable.", + "type": "number" + }, + "nodeCount": { + "description": "Node count in the post-action interactive-only capture.", + "type": "number" + } + }, + "required": [ + "nodeCount", + "interactiveNodeCount", + "digest", + "changedFromBefore" + ], + "type": "object" + }, + "hint": { + "type": "string" + }, + "kind": { + "const": "ref", + "type": "string" + }, + "message": { + "type": "string" + }, + "node": { + "description": "Resolved snapshot node for the matched element.", + "properties": { + "appName": { + "type": "string" + }, + "bundleId": { + "type": "string" + }, + "depth": { + "type": "number" + }, + "enabled": { + "type": "boolean" + }, + "focused": { + "type": "boolean" + }, + "hiddenContentAbove": { + "type": "boolean" + }, + "hiddenContentBelow": { + "type": "boolean" + }, + "hittable": { + "type": "boolean" + }, + "identifier": { + "type": "string" + }, + "index": { + "type": "number" + }, + "interactionBlocked": { + "enum": [ + "covered" + ], + "type": "string" + }, + "label": { + "type": "string" + }, + "parentIndex": { + "type": "number" + }, + "pid": { + "type": "number" + }, + "presentationHints": { + "items": { + "type": "string" + }, + "type": "array" + }, + "rect": { + "properties": { + "height": { + "type": "number" + }, + "width": { + "type": "number" + }, + "x": { + "type": "number" + }, + "y": { + "type": "number" + } + }, + "required": [ + "x", + "y", + "width", + "height" + ], + "type": "object" + }, + "ref": { + "description": "Stable snapshot ref such as e12.", + "type": "string" + }, + "role": { + "type": "string" + }, + "selected": { + "type": "boolean" + }, + "subrole": { + "type": "string" + }, + "surface": { + "type": "string" + }, + "type": { + "type": "string" + }, + "value": { + "type": "string" + }, + "visibleToUser": { + "type": "boolean" + }, + "windowTitle": { + "type": "string" + } + }, + "required": [ + "index", + "ref" + ], + "type": "object" + }, + "point": { + "properties": { + "x": { + "type": "number" + }, + "y": { + "type": "number" + } + }, + "required": [ + "x", + "y" + ], + "type": "object" + }, + "refLabel": { + "type": "string" + }, + "selectorChain": { + "items": { + "type": "string" + }, + "type": "array" + }, + "target": { + "properties": { + "kind": { + "const": "ref", + "type": "string" + }, + "ref": { + "type": "string" + } + }, + "required": [ + "kind", + "ref" + ], + "type": "object" + }, + "targetHittable": { + "type": "boolean" + }, + "text": { + "description": "Text submitted to the field.", + "type": "string" + }, + "warning": { + "type": "string" + } + }, + "required": [ + "kind", + "target", + "text" + ], + "type": "object" + }, + { + "properties": { + "backendResult": { + "additionalProperties": true, + "description": "Raw backend result passthrough.", + "type": "object" + }, + "evidence": { + "properties": { + "changedFromBefore": { + "description": "Whether the post-action digest differs from the pre-action capture digest. false is evidence, not failure.", + "type": "boolean" + }, + "digest": { + "description": "Order-independent digest of the post-action node multiset.", + "type": "string" + }, + "foregroundApp": { + "description": "Foreground app bundle id or name, when the capture carries it.", + "type": "string" + }, + "interactiveNodeCount": { + "description": "Subset of nodeCount the platform reports as hittable.", + "type": "number" + }, + "nodeCount": { + "description": "Node count in the post-action interactive-only capture.", + "type": "number" + } + }, + "required": [ + "nodeCount", + "interactiveNodeCount", + "digest", + "changedFromBefore" + ], + "type": "object" + }, + "hint": { + "type": "string" + }, + "kind": { + "const": "selector", + "type": "string" + }, + "message": { + "type": "string" + }, + "node": { + "description": "Resolved snapshot node for the matched element.", + "properties": { + "appName": { + "type": "string" + }, + "bundleId": { + "type": "string" + }, + "depth": { + "type": "number" + }, + "enabled": { + "type": "boolean" + }, + "focused": { + "type": "boolean" + }, + "hiddenContentAbove": { + "type": "boolean" + }, + "hiddenContentBelow": { + "type": "boolean" + }, + "hittable": { + "type": "boolean" + }, + "identifier": { + "type": "string" + }, + "index": { + "type": "number" + }, + "interactionBlocked": { + "enum": [ + "covered" + ], + "type": "string" + }, + "label": { + "type": "string" + }, + "parentIndex": { + "type": "number" + }, + "pid": { + "type": "number" + }, + "presentationHints": { + "items": { + "type": "string" + }, + "type": "array" + }, + "rect": { + "properties": { + "height": { + "type": "number" + }, + "width": { + "type": "number" + }, + "x": { + "type": "number" + }, + "y": { + "type": "number" + } + }, + "required": [ + "x", + "y", + "width", + "height" + ], + "type": "object" + }, + "ref": { + "description": "Stable snapshot ref such as e12.", + "type": "string" + }, + "role": { + "type": "string" + }, + "selected": { + "type": "boolean" + }, + "subrole": { + "type": "string" + }, + "surface": { + "type": "string" + }, + "type": { + "type": "string" + }, + "value": { + "type": "string" + }, + "visibleToUser": { + "type": "boolean" + }, + "windowTitle": { + "type": "string" + } + }, + "required": [ + "index", + "ref" + ], + "type": "object" + }, + "point": { + "properties": { + "x": { + "type": "number" + }, + "y": { + "type": "number" + } + }, + "required": [ + "x", + "y" + ], + "type": "object" + }, + "refLabel": { + "type": "string" + }, + "selectorChain": { + "items": { + "type": "string" + }, + "type": "array" + }, + "target": { + "properties": { + "kind": { + "const": "selector", + "type": "string" + }, + "selector": { + "type": "string" + } + }, + "required": [ + "kind", + "selector" + ], + "type": "object" + }, + "targetHittable": { + "type": "boolean" + }, + "text": { + "description": "Text submitted to the field.", + "type": "string" + }, + "warning": { + "type": "string" + } + }, + "required": [ + "kind", + "point", + "target", + "node", + "selectorChain", + "text" + ], + "type": "object" + } + ], + "type": "object" +}
- Changed
find3 fields changed- added
Input schema / properties / includeCostAdded value: +{ + "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "web", - "apple" -]New value: +[ + "apple", + "android", + "linux", + "web", + "ios", + "macos" +] - added
Input schema / properties / responseLevelAdded value: +{ + "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.", + "enum": [ + "digest", + "default", + "full" + ], + "type": "string" +}
- Changed
focus3 fields changed- added
Input schema / properties / includeCostAdded value: +{ + "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "web", - "apple" -]New value: +[ + "apple", + "android", + "linux", + "web", + "ios", + "macos" +] - added
Input schema / properties / responseLevelAdded value: +{ + "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.", + "enum": [ + "digest", + "default", + "full" + ], + "type": "string" +}
- Changed
gesture3 fields changed- added
Input schema / properties / includeCostAdded value: +{ + "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "web", - "apple" -]New value: +[ + "apple", + "android", + "linux", + "web", + "ios", + "macos" +] - added
Input schema / properties / responseLevelAdded value: +{ + "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.", + "enum": [ + "digest", + "default", + "full" + ], + "type": "string" +}
- Changed
get3 fields changed- added
Input schema / properties / includeCostAdded value: +{ + "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "web", - "apple" -]New value: +[ + "apple", + "android", + "linux", + "web", + "ios", + "macos" +] - added
Input schema / properties / responseLevelAdded value: +{ + "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.", + "enum": [ + "digest", + "default", + "full" + ], + "type": "string" +}
- Changed
home4 fields changed- added
Input schema / properties / includeCostAdded value: +{ + "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "web", - "apple" -]New value: +[ + "apple", + "android", + "linux", + "web", + "ios", + "macos" +] - added
Input schema / properties / responseLevelAdded value: +{ + "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.", + "enum": [ + "digest", + "default", + "full" + ], + "type": "string" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "action": { + "const": "home", + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "action", + "message" + ], + "type": "object" +}
- Changed
install5 fields changed- added
Input schema / properties / app / descriptionAdded value: +"Optional app identifier hint." - added
Input schema / properties / includeCostAdded value: +{ + "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "web", - "apple" -]New value: +[ + "apple", + "android", + "linux", + "web", + "ios", + "macos" +] - added
Input schema / properties / responseLevelAdded value: +{ + "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.", + "enum": [ + "digest", + "default", + "full" + ], + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "app", - "appPath" -]New value: +[ + "appPath" +]
- Changed
install-from-source3 fields changed- added
Input schema / properties / includeCostAdded value: +{ + "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "web", - "apple" -]New value: +[ + "apple", + "android", + "linux", + "web", + "ios", + "macos" +] - added
Input schema / properties / responseLevelAdded value: +{ + "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.", + "enum": [ + "digest", + "default", + "full" + ], + "type": "string" +}
- Changed
is3 fields changed- added
Input schema / properties / includeCostAdded value: +{ + "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "web", - "apple" -]New value: +[ + "apple", + "android", + "linux", + "web", + "ios", + "macos" +] - added
Input schema / properties / responseLevelAdded value: +{ + "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.", + "enum": [ + "digest", + "default", + "full" + ], + "type": "string" +}
- Changed
keyboard4 fields changed- added
Input schema / properties / includeCostAdded value: +{ + "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "web", - "apple" -]New value: +[ + "apple", + "android", + "linux", + "web", + "ios", + "macos" +] - added
Input schema / properties / responseLevelAdded value: +{ + "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.", + "enum": [ + "digest", + "default", + "full" + ], + "type": "string" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "action": { + "enum": [ + "status", + "dismiss", + "enter" + ], + "type": "string" + }, + "attempts": { + "type": "number" + }, + "dismissed": { + "type": "boolean" + }, + "focusedPackage": { + "type": "string" + }, + "focusedResourceId": { + "type": "string" + }, + "inputMethodPackage": { + "type": "string" + }, + "inputOwner": { + "enum": [ + "app", + "ime", + "unknown" + ], + "type": "string" + }, + "inputType": { + "type": "string" + }, + "message": { + "type": "string" + }, + "platform": { + "enum": [ + "android", + "ios" + ], + "type": "string" + }, + "type": { + "enum": [ + "text", + "number", + "email", + "phone", + "password", + "datetime", + "unknown" + ], + "type": "string" + }, + "visible": { + "type": "boolean" + }, + "wasVisible": { + "type": "boolean" + } + }, + "required": [ + "platform", + "action" + ], + "type": "object" +}
- Changed
logs3 fields changed- added
Input schema / properties / includeCostAdded value: +{ + "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "web", - "apple" -]New value: +[ + "apple", + "android", + "linux", + "web", + "ios", + "macos" +] - added
Input schema / properties / responseLevelAdded value: +{ + "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.", + "enum": [ + "digest", + "default", + "full" + ], + "type": "string" +}
- Changed
longpress4 fields changed- added
Input schema / properties / includeCostAdded value: +{ + "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "web", - "apple" -]New value: +[ + "apple", + "android", + "linux", + "web", + "ios", + "macos" +] - added
Input schema / properties / responseLevelAdded value: +{ + "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.", + "enum": [ + "digest", + "default", + "full" + ], + "type": "string" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "oneOf": [ + { + "properties": { + "backendResult": { + "additionalProperties": true, + "description": "Raw backend result passthrough.", + "type": "object" + }, + "durationMs": { + "type": "number" + }, + "kind": { + "const": "point", + "type": "string" + }, + "message": { + "type": "string" + }, + "point": { + "properties": { + "x": { + "type": "number" + }, + "y": { + "type": "number" + } + }, + "required": [ + "x", + "y" + ], + "type": "object" + }, + "warning": { + "type": "string" + } + }, + "required": [ + "kind", + "point" + ], + "type": "object" + }, + { + "properties": { + "backendResult": { + "additionalProperties": true, + "description": "Raw backend result passthrough.", + "type": "object" + }, + "durationMs": { + "type": "number" + }, + "hint": { + "type": "string" + }, + "kind": { + "const": "ref", + "type": "string" + }, + "message": { + "type": "string" + }, + "node": { + "description": "Resolved snapshot node for the matched element.", + "properties": { + "appName": { + "type": "string" + }, + "bundleId": { + "type": "string" + }, + "depth": { + "type": "number" + }, + "enabled": { + "type": "boolean" + }, + "focused": { + "type": "boolean" + }, + "hiddenContentAbove": { + "type": "boolean" + }, + "hiddenContentBelow": { + "type": "boolean" + }, + "hittable": { + "type": "boolean" + }, + "identifier": { + "type": "string" + }, + "index": { + "type": "number" + }, + "interactionBlocked": { + "enum": [ + "covered" + ], + "type": "string" + }, + "label": { + "type": "string" + }, + "parentIndex": { + "type": "number" + }, + "pid": { + "type": "number" + }, + "presentationHints": { + "items": { + "type": "string" + }, + "type": "array" + }, + "rect": { + "properties": { + "height": { + "type": "number" + }, + "width": { + "type": "number" + }, + "x": { + "type": "number" + }, + "y": { + "type": "number" + } + }, + "required": [ + "x", + "y", + "width", + "height" + ], + "type": "object" + }, + "ref": { + "description": "Stable snapshot ref such as e12.", + "type": "string" + }, + "role": { + "type": "string" + }, + "selected": { + "type": "boolean" + }, + "subrole": { + "type": "string" + }, + "surface": { + "type": "string" + }, + "type": { + "type": "string" + }, + "value": { + "type": "string" + }, + "visibleToUser": { + "type": "boolean" + }, + "windowTitle": { + "type": "string" + } + }, + "required": [ + "index", + "ref" + ], + "type": "object" + }, + "point": { + "properties": { + "x": { + "type": "number" + }, + "y": { + "type": "number" + } + }, + "required": [ + "x", + "y" + ], + "type": "object" + }, + "refLabel": { + "type": "string" + }, + "selectorChain": { + "items": { + "type": "string" + }, + "type": "array" + }, + "target": { + "properties": { + "kind": { + "const": "ref", + "type": "string" + }, + "ref": { + "type": "string" + } + }, + "required": [ + "kind", + "ref" + ], + "type": "object" + }, + "targetHittable": { + "type": "boolean" + }, + "warning": { + "type": "string" + } + }, + "required": [ + "kind", + "target" + ], + "type": "object" + }, + { + "properties": { + "backendResult": { + "additionalProperties": true, + "description": "Raw backend result passthrough.", + "type": "object" + }, + "durationMs": { + "type": "number" + }, + "hint": { + "type": "string" + }, + "kind": { + "const": "selector", + "type": "string" + }, + "message": { + "type": "string" + }, + "node": { + "description": "Resolved snapshot node for the matched element.", + "properties": { + "appName": { + "type": "string" + }, + "bundleId": { + "type": "string" + }, + "depth": { + "type": "number" + }, + "enabled": { + "type": "boolean" + }, + "focused": { + "type": "boolean" + }, + "hiddenContentAbove": { + "type": "boolean" + }, + "hiddenContentBelow": { + "type": "boolean" + }, + "hittable": { + "type": "boolean" + }, + "identifier": { + "type": "string" + }, + "index": { + "type": "number" + }, + "interactionBlocked": { + "enum": [ + "covered" + ], + "type": "string" + }, + "label": { + "type": "string" + }, + "parentIndex": { + "type": "number" + }, + "pid": { + "type": "number" + }, + "presentationHints": { + "items": { + "type": "string" + }, + "type": "array" + }, + "rect": { + "properties": { + "height": { + "type": "number" + }, + "width": { + "type": "number" + }, + "x": { + "type": "number" + }, + "y": { + "type": "number" + } + }, + "required": [ + "x", + "y", + "width", + "height" + ], + "type": "object" + }, + "ref": { + "description": "Stable snapshot ref such as e12.", + "type": "string" + }, + "role": { + "type": "string" + }, + "selected": { + "type": "boolean" + }, + "subrole": { + "type": "string" + }, + "surface": { + "type": "string" + }, + "type": { + "type": "string" + }, + "value": { + "type": "string" + }, + "visibleToUser": { + "type": "boolean" + }, + "windowTitle": { + "type": "string" + } + }, + "required": [ + "index", + "ref" + ], + "type": "object" + }, + "point": { + "properties": { + "x": { + "type": "number" + }, + "y": { + "type": "number" + } + }, + "required": [ + "x", + "y" + ], + "type": "object" + }, + "refLabel": { + "type": "string" + }, + "selectorChain": { + "items": { + "type": "string" + }, + "type": "array" + }, + "target": { + "properties": { + "kind": { + "const": "selector", + "type": "string" + }, + "selector": { + "type": "string" + } + }, + "required": [ + "kind", + "selector" + ], + "type": "object" + }, + "targetHittable": { + "type": "boolean" + }, + "warning": { + "type": "string" + } + }, + "required": [ + "kind", + "point", + "target", + "node", + "selectorChain" + ], + "type": "object" + } + ], + "type": "object" +}
- Changed
metro3 fields changed- added
Input schema / properties / includeCostAdded value: +{ + "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "web", - "apple" -]New value: +[ + "apple", + "android", + "linux", + "web", + "ios", + "macos" +] - added
Input schema / properties / responseLevelAdded value: +{ + "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.", + "enum": [ + "digest", + "default", + "full" + ], + "type": "string" +}
- Changed
network3 fields changed- added
Input schema / properties / includeCostAdded value: +{ + "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "web", - "apple" -]New value: +[ + "apple", + "android", + "linux", + "web", + "ios", + "macos" +] - added
Input schema / properties / responseLevelAdded value: +{ + "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.", + "enum": [ + "digest", + "default", + "full" + ], + "type": "string" +}
- Changed
open3 fields changed- added
Input schema / properties / includeCostAdded value: +{ + "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "web", - "apple" -]New value: +[ + "apple", + "android", + "linux", + "web", + "ios", + "macos" +] - added
Input schema / properties / responseLevelAdded value: +{ + "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.", + "enum": [ + "digest", + "default", + "full" + ], + "type": "string" +}
- Changed
perf3 fields changed- added
Input schema / properties / includeCostAdded value: +{ + "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "web", - "apple" -]New value: +[ + "apple", + "android", + "linux", + "web", + "ios", + "macos" +] - added
Input schema / properties / responseLevelAdded value: +{ + "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.", + "enum": [ + "digest", + "default", + "full" + ], + "type": "string" +}
- Changed
press5 fields changed- added
Input schema / properties / includeCostAdded value: +{ + "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "web", - "apple" -]New value: +[ + "apple", + "android", + "linux", + "web", + "ios", + "macos" +] - added
Input schema / properties / responseLevelAdded value: +{ + "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.", + "enum": [ + "digest", + "default", + "full" + ], + "type": "string" +} - added
Input schema / properties / verifyAdded value: +{ + "description": "Capture cheap post-action evidence (AX digest, node counts, changedFromBefore) instead of a follow-up snapshot.", + "type": "boolean" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "oneOf": [ + { + "properties": { + "backendResult": { + "additionalProperties": true, + "description": "Raw backend result passthrough.", + "type": "object" + }, + "evidence": { + "properties": { + "changedFromBefore": { + "description": "Whether the post-action digest differs from the pre-action capture digest. false is evidence, not failure.", + "type": "boolean" + }, + "digest": { + "description": "Order-independent digest of the post-action node multiset.", + "type": "string" + }, + "foregroundApp": { + "description": "Foreground app bundle id or name, when the capture carries it.", + "type": "string" + }, + "interactiveNodeCount": { + "description": "Subset of nodeCount the platform reports as hittable.", + "type": "number" + }, + "nodeCount": { + "description": "Node count in the post-action interactive-only capture.", + "type": "number" + } + }, + "required": [ + "nodeCount", + "interactiveNodeCount", + "digest", + "changedFromBefore" + ], + "type": "object" + }, + "kind": { + "const": "point", + "type": "string" + }, + "message": { + "type": "string" + }, + "point": { + "properties": { + "x": { + "type": "number" + }, + "y": { + "type": "number" + } + }, + "required": [ + "x", + "y" + ], + "type": "object" + }, + "warning": { + "type": "string" + } + }, + "required": [ + "kind", + "point" + ], + "type": "object" + }, + { + "properties": { + "backendResult": { + "additionalProperties": true, + "description": "Raw backend result passthrough.", + "type": "object" + }, + "evidence": { + "properties": { + "changedFromBefore": { + "description": "Whether the post-action digest differs from the pre-action capture digest. false is evidence, not failure.", + "type": "boolean" + }, + "digest": { + "description": "Order-independent digest of the post-action node multiset.", + "type": "string" + }, + "foregroundApp": { + "description": "Foreground app bundle id or name, when the capture carries it.", + "type": "string" + }, + "interactiveNodeCount": { + "description": "Subset of nodeCount the platform reports as hittable.", + "type": "number" + }, + "nodeCount": { + "description": "Node count in the post-action interactive-only capture.", + "type": "number" + } + }, + "required": [ + "nodeCount", + "interactiveNodeCount", + "digest", + "changedFromBefore" + ], + "type": "object" + }, + "hint": { + "type": "string" + }, + "kind": { + "const": "ref", + "type": "string" + }, + "message": { + "type": "string" + }, + "node": { + "description": "Resolved snapshot node for the matched element.", + "properties": { + "appName": { + "type": "string" + }, + "bundleId": { + "type": "string" + }, + "depth": { + "type": "number" + }, + "enabled": { + "type": "boolean" + }, + "focused": { + "type": "boolean" + }, + "hiddenContentAbove": { + "type": "boolean" + }, + "hiddenContentBelow": { + "type": "boolean" + }, + "hittable": { + "type": "boolean" + }, + "identifier": { + "type": "string" + }, + "index": { + "type": "number" + }, + "interactionBlocked": { + "enum": [ + "covered" + ], + "type": "string" + }, + "label": { + "type": "string" + }, + "parentIndex": { + "type": "number" + }, + "pid": { + "type": "number" + }, + "presentationHints": { + "items": { + "type": "string" + }, + "type": "array" + }, + "rect": { + "properties": { + "height": { + "type": "number" + }, + "width": { + "type": "number" + }, + "x": { + "type": "number" + }, + "y": { + "type": "number" + } + }, + "required": [ + "x", + "y", + "width", + "height" + ], + "type": "object" + }, + "ref": { + "description": "Stable snapshot ref such as e12.", + "type": "string" + }, + "role": { + "type": "string" + }, + "selected": { + "type": "boolean" + }, + "subrole": { + "type": "string" + }, + "surface": { + "type": "string" + }, + "type": { + "type": "string" + }, + "value": { + "type": "string" + }, + "visibleToUser": { + "type": "boolean" + }, + "windowTitle": { + "type": "string" + } + }, + "required": [ + "index", + "ref" + ], + "type": "object" + }, + "point": { + "properties": { + "x": { + "type": "number" + }, + "y": { + "type": "number" + } + }, + "required": [ + "x", + "y" + ], + "type": "object" + }, + "refLabel": { + "type": "string" + }, + "selectorChain": { + "items": { + "type": "string" + }, + "type": "array" + }, + "target": { + "properties": { + "kind": { + "const": "ref", + "type": "string" + }, + "ref": { + "type": "string" + } + }, + "required": [ + "kind", + "ref" + ], + "type": "object" + }, + "targetHittable": { + "type": "boolean" + }, + "warning": { + "type": "string" + } + }, + "required": [ + "kind", + "target" + ], + "type": "object" + }, + { + "properties": { + "backendResult": { + "additionalProperties": true, + "description": "Raw backend result passthrough.", + "type": "object" + }, + "evidence": { + "properties": { + "changedFromBefore": { + "description": "Whether the post-action digest differs from the pre-action capture digest. false is evidence, not failure.", + "type": "boolean" + }, + "digest": { + "description": "Order-independent digest of the post-action node multiset.", + "type": "string" + }, + "foregroundApp": { + "description": "Foreground app bundle id or name, when the capture carries it.", + "type": "string" + }, + "interactiveNodeCount": { + "description": "Subset of nodeCount the platform reports as hittable.", + "type": "number" + }, + "nodeCount": { + "description": "Node count in the post-action interactive-only capture.", + "type": "number" + } + }, + "required": [ + "nodeCount", + "interactiveNodeCount", + "digest", + "changedFromBefore" + ], + "type": "object" + }, + "hint": { + "type": "string" + }, + "kind": { + "const": "selector", + "type": "string" + }, + "message": { + "type": "string" + }, + "node": { + "description": "Resolved snapshot node for the matched element.", + "properties": { + "appName": { + "type": "string" + }, + "bundleId": { + "type": "string" + }, + "depth": { + "type": "number" + }, + "enabled": { + "type": "boolean" + }, + "focused": { + "type": "boolean" + }, + "hiddenContentAbove": { + "type": "boolean" + }, + "hiddenContentBelow": { + "type": "boolean" + }, + "hittable": { + "type": "boolean" + }, + "identifier": { + "type": "string" + }, + "index": { + "type": "number" + }, + "interactionBlocked": { + "enum": [ + "covered" + ], + "type": "string" + }, + "label": { + "type": "string" + }, + "parentIndex": { + "type": "number" + }, + "pid": { + "type": "number" + }, + "presentationHints": { + "items": { + "type": "string" + }, + "type": "array" + }, + "rect": { + "properties": { + "height": { + "type": "number" + }, + "width": { + "type": "number" + }, + "x": { + "type": "number" + }, + "y": { + "type": "number" + } + }, + "required": [ + "x", + "y", + "width", + "height" + ], + "type": "object" + }, + "ref": { + "description": "Stable snapshot ref such as e12.", + "type": "string" + }, + "role": { + "type": "string" + }, + "selected": { + "type": "boolean" + }, + "subrole": { + "type": "string" + }, + "surface": { + "type": "string" + }, + "type": { + "type": "string" + }, + "value": { + "type": "string" + }, + "visibleToUser": { + "type": "boolean" + }, + "windowTitle": { + "type": "string" + } + }, + "required": [ + "index", + "ref" + ], + "type": "object" + }, + "point": { + "properties": { + "x": { + "type": "number" + }, + "y": { + "type": "number" + } + }, + "required": [ + "x", + "y" + ], + "type": "object" + }, + "refLabel": { + "type": "string" + }, + "selectorChain": { + "items": { + "type": "string" + }, + "type": "array" + }, + "target": { + "properties": { + "kind": { + "const": "selector", + "type": "string" + }, + "selector": { + "type": "string" + } + }, + "required": [ + "kind", + "selector" + ], + "type": "object" + }, + "targetHittable": { + "type": "boolean" + }, + "warning": { + "type": "string" + } + }, + "required": [ + "kind", + "point", + "target", + "node", + "selectorChain" + ], + "type": "object" + } + ], + "type": "object" +}
- Changed
push3 fields changed- added
Input schema / properties / includeCostAdded value: +{ + "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "web", - "apple" -]New value: +[ + "apple", + "android", + "linux", + "web", + "ios", + "macos" +] - added
Input schema / properties / responseLevelAdded value: +{ + "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.", + "enum": [ + "digest", + "default", + "full" + ], + "type": "string" +}
- Changed
react-native3 fields changed- added
Input schema / properties / includeCostAdded value: +{ + "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "web", - "apple" -]New value: +[ + "apple", + "android", + "linux", + "web", + "ios", + "macos" +] - added
Input schema / properties / responseLevelAdded value: +{ + "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.", + "enum": [ + "digest", + "default", + "full" + ], + "type": "string" +}
- Changed
record3 fields changed- added
Input schema / properties / includeCostAdded value: +{ + "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "web", - "apple" -]New value: +[ + "apple", + "android", + "linux", + "web", + "ios", + "macos" +] - added
Input schema / properties / responseLevelAdded value: +{ + "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.", + "enum": [ + "digest", + "default", + "full" + ], + "type": "string" +}
- Changed
reinstall3 fields changed- added
Input schema / properties / includeCostAdded value: +{ + "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "web", - "apple" -]New value: +[ + "apple", + "android", + "linux", + "web", + "ios", + "macos" +] - added
Input schema / properties / responseLevelAdded value: +{ + "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.", + "enum": [ + "digest", + "default", + "full" + ], + "type": "string" +}
- Changed
replay3 fields changed- added
Input schema / properties / includeCostAdded value: +{ + "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "web", - "apple" -]New value: +[ + "apple", + "android", + "linux", + "web", + "ios", + "macos" +] - added
Input schema / properties / responseLevelAdded value: +{ + "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.", + "enum": [ + "digest", + "default", + "full" + ], + "type": "string" +}
- Changed
rotate4 fields changed- added
Input schema / properties / includeCostAdded value: +{ + "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "web", - "apple" -]New value: +[ + "apple", + "android", + "linux", + "web", + "ios", + "macos" +] - added
Input schema / properties / responseLevelAdded value: +{ + "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.", + "enum": [ + "digest", + "default", + "full" + ], + "type": "string" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "action": { + "const": "rotate", + "type": "string" + }, + "message": { + "type": "string" + }, + "orientation": { + "enum": [ + "portrait", + "portrait-upside-down", + "landscape-left", + "landscape-right" + ], + "type": "string" + } + }, + "required": [ + "action", + "orientation", + "message" + ], + "type": "object" +}
- Changed
screenshot4 fields changed- added
Input schema / properties / includeCostAdded value: +{ + "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.", + "type": "boolean" +} - added
Input schema / properties / normalizeStatusBarAdded value: +{ + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "web", - "apple" -]New value: +[ + "apple", + "android", + "linux", + "web", + "ios", + "macos" +] - added
Input schema / properties / responseLevelAdded value: +{ + "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.", + "enum": [ + "digest", + "default", + "full" + ], + "type": "string" +}
- Changed
scroll3 fields changed- added
Input schema / properties / includeCostAdded value: +{ + "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "web", - "apple" -]New value: +[ + "apple", + "android", + "linux", + "web", + "ios", + "macos" +] - added
Input schema / properties / responseLevelAdded value: +{ + "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.", + "enum": [ + "digest", + "default", + "full" + ], + "type": "string" +}
- Changed
session3 fields changed- added
Input schema / properties / includeCostAdded value: +{ + "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "web", - "apple" -]New value: +[ + "apple", + "android", + "linux", + "web", + "ios", + "macos" +] - added
Input schema / properties / responseLevelAdded value: +{ + "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.", + "enum": [ + "digest", + "default", + "full" + ], + "type": "string" +}
- Changed
settings3 fields changed- added
Input schema / properties / includeCostAdded value: +{ + "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "web", - "apple" -]New value: +[ + "apple", + "android", + "linux", + "web", + "ios", + "macos" +] - added
Input schema / properties / responseLevelAdded value: +{ + "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.", + "enum": [ + "digest", + "default", + "full" + ], + "type": "string" +}
- Changed
shutdown4 fields changed- added
Input schema / properties / includeCostAdded value: +{ + "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "web", - "apple" -]New value: +[ + "apple", + "android", + "linux", + "web", + "ios", + "macos" +] - added
Input schema / properties / responseLevelAdded value: +{ + "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.", + "enum": [ + "digest", + "default", + "full" + ], + "type": "string" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "device": { + "description": "Human-readable device name.", + "type": "string" + }, + "id": { + "description": "Stable device id.", + "type": "string" + }, + "kind": { + "enum": [ + "simulator", + "emulator", + "device" + ], + "type": "string" + }, + "platform": { + "enum": [ + "apple", + "android", + "linux", + "web" + ], + "type": "string" + }, + "shutdown": { + "properties": { + "error": { + "additionalProperties": true, + "description": "Normalized error detail when shutdown failed.", + "type": "object" + }, + "exitCode": { + "type": "number" + }, + "stderr": { + "type": "string" + }, + "stdout": { + "type": "string" + }, + "success": { + "type": "boolean" + } + }, + "required": [ + "success", + "exitCode", + "stdout", + "stderr" + ], + "type": "object" + }, + "target": { + "enum": [ + "mobile", + "tv", + "desktop" + ], + "type": "string" + } + }, + "required": [ + "platform", + "target", + "device", + "id", + "kind", + "shutdown" + ], + "type": "object" +}
- Changed
snapshot3 fields changed- added
Input schema / properties / includeCostAdded value: +{ + "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "web", - "apple" -]New value: +[ + "apple", + "android", + "linux", + "web", + "ios", + "macos" +] - added
Input schema / properties / responseLevelAdded value: +{ + "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.", + "enum": [ + "digest", + "default", + "full" + ], + "type": "string" +}
- Changed
swipe3 fields changed- added
Input schema / properties / includeCostAdded value: +{ + "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "web", - "apple" -]New value: +[ + "apple", + "android", + "linux", + "web", + "ios", + "macos" +] - added
Input schema / properties / responseLevelAdded value: +{ + "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.", + "enum": [ + "digest", + "default", + "full" + ], + "type": "string" +}
- Changed
test4 fields changed- added
Input schema / properties / includeCostAdded value: +{ + "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "web", - "apple" -]New value: +[ + "apple", + "android", + "linux", + "web", + "ios", + "macos" +] - removed
Input schema / properties / reportJunitRemoved value: -{ - "type": "string" -} - added
Input schema / properties / responseLevelAdded value: +{ + "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.", + "enum": [ + "digest", + "default", + "full" + ], + "type": "string" +}
- Changed
trace3 fields changed- added
Input schema / properties / includeCostAdded value: +{ + "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "web", - "apple" -]New value: +[ + "apple", + "android", + "linux", + "web", + "ios", + "macos" +] - added
Input schema / properties / responseLevelAdded value: +{ + "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.", + "enum": [ + "digest", + "default", + "full" + ], + "type": "string" +}
- Changed
trigger-app-event3 fields changed- added
Input schema / properties / includeCostAdded value: +{ + "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "web", - "apple" -]New value: +[ + "apple", + "android", + "linux", + "web", + "ios", + "macos" +] - added
Input schema / properties / responseLevelAdded value: +{ + "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.", + "enum": [ + "digest", + "default", + "full" + ], + "type": "string" +}
- Changed
type3 fields changed- added
Input schema / properties / includeCostAdded value: +{ + "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "web", - "apple" -]New value: +[ + "apple", + "android", + "linux", + "web", + "ios", + "macos" +] - added
Input schema / properties / responseLevelAdded value: +{ + "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.", + "enum": [ + "digest", + "default", + "full" + ], + "type": "string" +}
- Changed
viewport4 fields changed- added
Input schema / properties / includeCostAdded value: +{ + "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.", + "type": "boolean" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "web", - "apple" -]New value: +[ + "apple", + "android", + "linux", + "web", + "ios", + "macos" +] - added
Input schema / properties / responseLevelAdded value: +{ + "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.", + "enum": [ + "digest", + "default", + "full" + ], + "type": "string" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "height": { + "type": "number" + }, + "message": { + "type": "string" + }, + "width": { + "type": "number" + } + }, + "required": [ + "width", + "height", + "message" + ], + "type": "object" +}
- Changed
wait6 fields changed- added
Input schema / properties / includeCostAdded value: +{ + "description": "Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.", + "type": "boolean" +} - changed
Input schema / properties / kind / enumPrevious value: -[ - "duration", - "text", - "ref", - "selector" -]New value: +[ + "duration", + "text", + "ref", + "selector", + "stable" +] - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "web", - "apple" -]New value: +[ + "apple", + "android", + "linux", + "web", + "ios", + "macos" +] - added
Input schema / properties / quietMsAdded value: +{ + "type": "integer" +} - added
Input schema / properties / responseLevelAdded value: +{ + "description": "Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.", + "enum": [ + "digest", + "default", + "full" + ], + "type": "string" +} - added
Input schema / properties / stableAdded value: +{ + "type": "boolean" +}
2 tool updates
v0.17.9- Changed
scroll1 field changed- added
Input schema / properties / durationMsAdded value: +{ + "description": "Scroll duration in milliseconds when the backend supports pacing.", + "maximum": 10000, + "minimum": 0, + "type": "integer" +}
- Added
viewport
48 tool updates
v0.17.7- Changed
alert1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "web", + "apple" +]
- Changed
app-switcher1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "web", + "apple" +]
- Changed
apps1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "web", + "apple" +]
- Changed
appstate1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "web", + "apple" +]
- Changed
back1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "web", + "apple" +]
- Changed
batch1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "web", + "apple" +]
- Changed
boot1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "web", + "apple" +]
- Changed
click1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "web", + "apple" +]
- Changed
clipboard1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "web", + "apple" +]
- Changed
close1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "web", + "apple" +]
- Changed
debug1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "web", + "apple" +]
- Changed
devices1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "web", + "apple" +]
- Changed
diff1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "web", + "apple" +]
- Changed
fill1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "web", + "apple" +]
- Changed
find1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "web", + "apple" +]
- Changed
focus1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "web", + "apple" +]
- Changed
gesture1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "web", + "apple" +]
- Changed
get1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "web", + "apple" +]
- Changed
home1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "web", + "apple" +]
- Changed
install1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "web", + "apple" +]
- Changed
install-from-source1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "web", + "apple" +]
- Changed
is1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "web", + "apple" +]
- Changed
keyboard1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "web", + "apple" +]
- Changed
logs1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "web", + "apple" +]
- Changed
longpress1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "web", + "apple" +]
- Changed
metro1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "web", + "apple" +]
- Changed
network1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "web", + "apple" +]
- Changed
open1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "web", + "apple" +]
- Changed
perf1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "web", + "apple" +]
- Changed
press1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "web", + "apple" +]
- Changed
push1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "web", + "apple" +]
- Changed
react-native1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "web", + "apple" +]
- Changed
record4 fields changed- added
Input schema / properties / maxSizeAdded value: +{ + "type": "integer" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "web", + "apple" +] - added
Input schema / properties / quality / enumAdded value: +[ + "medium", + "high" +] - changed
Input schema / properties / quality / typePrevious value: -"integer"New value: +"string"
- Changed
reinstall1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "web", + "apple" +]
- Changed
replay1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "web", + "apple" +]
- Changed
rotate1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "web", + "apple" +]
- Changed
screenshot1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "web", + "apple" +]
- Changed
scroll1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "web", + "apple" +]
- Changed
session1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "web", + "apple" +]
- Changed
settings1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "web", + "apple" +]
- Changed
shutdown1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "web", + "apple" +]
- Changed
snapshot1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "web", + "apple" +]
- Changed
swipe1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "web", + "apple" +]
- Changed
test1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "web", + "apple" +]
- Changed
trace1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "web", + "apple" +]
- Changed
trigger-app-event1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "web", + "apple" +]
- Changed
type1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "web", + "apple" +]
- Changed
wait1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "macos", - "android", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "web", + "apple" +]
48 tool updates
v0.17.6- Changed
alert5 fields changed- added
Input schema / properties / iosXctestDerivedDataPathAdded value: +{ + "description": "Derived data path for external iOS XCTest runner execution.", + "type": "string" +} - added
Input schema / properties / iosXctestEnvDirAdded value: +{ + "description": "Writable directory for iOS XCTest runner env overlays.", + "type": "string" +} - added
Input schema / properties / iosXctestrunFileAdded value: +{ + "description": "Externally built iOS XCTest runner .xctestrun artifact path.", + "type": "string" +} - added
Input schema / properties / mcpOutputFormatAdded value: +{ + "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.", + "enum": [ + "optimized", + "json" + ], + "type": "string" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "android", - "macos", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "apple" +]
- Changed
app-switcher5 fields changed- added
Input schema / properties / iosXctestDerivedDataPathAdded value: +{ + "description": "Derived data path for external iOS XCTest runner execution.", + "type": "string" +} - added
Input schema / properties / iosXctestEnvDirAdded value: +{ + "description": "Writable directory for iOS XCTest runner env overlays.", + "type": "string" +} - added
Input schema / properties / iosXctestrunFileAdded value: +{ + "description": "Externally built iOS XCTest runner .xctestrun artifact path.", + "type": "string" +} - added
Input schema / properties / mcpOutputFormatAdded value: +{ + "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.", + "enum": [ + "optimized", + "json" + ], + "type": "string" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "android", - "macos", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "apple" +]
- Changed
apps5 fields changed- added
Input schema / properties / iosXctestDerivedDataPathAdded value: +{ + "description": "Derived data path for external iOS XCTest runner execution.", + "type": "string" +} - added
Input schema / properties / iosXctestEnvDirAdded value: +{ + "description": "Writable directory for iOS XCTest runner env overlays.", + "type": "string" +} - added
Input schema / properties / iosXctestrunFileAdded value: +{ + "description": "Externally built iOS XCTest runner .xctestrun artifact path.", + "type": "string" +} - added
Input schema / properties / mcpOutputFormatAdded value: +{ + "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.", + "enum": [ + "optimized", + "json" + ], + "type": "string" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "android", - "macos", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "apple" +]
- Changed
appstate5 fields changed- added
Input schema / properties / iosXctestDerivedDataPathAdded value: +{ + "description": "Derived data path for external iOS XCTest runner execution.", + "type": "string" +} - added
Input schema / properties / iosXctestEnvDirAdded value: +{ + "description": "Writable directory for iOS XCTest runner env overlays.", + "type": "string" +} - added
Input schema / properties / iosXctestrunFileAdded value: +{ + "description": "Externally built iOS XCTest runner .xctestrun artifact path.", + "type": "string" +} - added
Input schema / properties / mcpOutputFormatAdded value: +{ + "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.", + "enum": [ + "optimized", + "json" + ], + "type": "string" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "android", - "macos", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "apple" +]
- Changed
back5 fields changed- added
Input schema / properties / iosXctestDerivedDataPathAdded value: +{ + "description": "Derived data path for external iOS XCTest runner execution.", + "type": "string" +} - added
Input schema / properties / iosXctestEnvDirAdded value: +{ + "description": "Writable directory for iOS XCTest runner env overlays.", + "type": "string" +} - added
Input schema / properties / iosXctestrunFileAdded value: +{ + "description": "Externally built iOS XCTest runner .xctestrun artifact path.", + "type": "string" +} - added
Input schema / properties / mcpOutputFormatAdded value: +{ + "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.", + "enum": [ + "optimized", + "json" + ], + "type": "string" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "android", - "macos", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "apple" +]
- Changed
batch6 fields changed- added
Input schema / properties / iosXctestDerivedDataPathAdded value: +{ + "description": "Derived data path for external iOS XCTest runner execution.", + "type": "string" +} - added
Input schema / properties / iosXctestEnvDirAdded value: +{ + "description": "Writable directory for iOS XCTest runner env overlays.", + "type": "string" +} - added
Input schema / properties / iosXctestrunFileAdded value: +{ + "description": "Externally built iOS XCTest runner .xctestrun artifact path.", + "type": "string" +} - added
Input schema / properties / mcpOutputFormatAdded value: +{ + "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.", + "enum": [ + "optimized", + "json" + ], + "type": "string" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "android", - "macos", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "apple" +] - changed
Input schema / properties / steps / items / properties / command / enumPrevious value: -[ - "devices", - "boot", - "apps", - "open", - "close", - "install", - "reinstall", - "install-from-source", - "push", - "trigger-app-event", - "snapshot", - "screenshot", - "diff", - "wait", - "alert", - "settings", - "click", - "press", - "longpress", - "swipe", - "focus", - "type", - "fill", - "scroll", - "get", - "gesture", - "is", - "find", - "perf", - "logs", - "network", - "record", - "trace", - "test", - "appstate", - "back", - "home", - "rotate", - "app-switcher", - "keyboard", - "clipboard", - "react-native" -]New value: +[ + "devices", + "boot", + "shutdown", + "apps", + "open", + "close", + "install", + "reinstall", + "install-from-source", + "push", + "trigger-app-event", + "snapshot", + "screenshot", + "diff", + "wait", + "alert", + "settings", + "click", + "press", + "longpress", + "swipe", + "focus", + "type", + "fill", + "scroll", + "get", + "gesture", + "is", + "find", + "perf", + "logs", + "network", + "record", + "trace", + "test", + "appstate", + "back", + "home", + "rotate", + "app-switcher", + "keyboard", + "clipboard", + "react-native" +]
- Changed
boot5 fields changed- added
Input schema / properties / iosXctestDerivedDataPathAdded value: +{ + "description": "Derived data path for external iOS XCTest runner execution.", + "type": "string" +} - added
Input schema / properties / iosXctestEnvDirAdded value: +{ + "description": "Writable directory for iOS XCTest runner env overlays.", + "type": "string" +} - added
Input schema / properties / iosXctestrunFileAdded value: +{ + "description": "Externally built iOS XCTest runner .xctestrun artifact path.", + "type": "string" +} - added
Input schema / properties / mcpOutputFormatAdded value: +{ + "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.", + "enum": [ + "optimized", + "json" + ], + "type": "string" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "android", - "macos", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "apple" +]
- Changed
click5 fields changed- added
Input schema / properties / iosXctestDerivedDataPathAdded value: +{ + "description": "Derived data path for external iOS XCTest runner execution.", + "type": "string" +} - added
Input schema / properties / iosXctestEnvDirAdded value: +{ + "description": "Writable directory for iOS XCTest runner env overlays.", + "type": "string" +} - added
Input schema / properties / iosXctestrunFileAdded value: +{ + "description": "Externally built iOS XCTest runner .xctestrun artifact path.", + "type": "string" +} - added
Input schema / properties / mcpOutputFormatAdded value: +{ + "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.", + "enum": [ + "optimized", + "json" + ], + "type": "string" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "android", - "macos", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "apple" +]
- Changed
clipboard5 fields changed- added
Input schema / properties / iosXctestDerivedDataPathAdded value: +{ + "description": "Derived data path for external iOS XCTest runner execution.", + "type": "string" +} - added
Input schema / properties / iosXctestEnvDirAdded value: +{ + "description": "Writable directory for iOS XCTest runner env overlays.", + "type": "string" +} - added
Input schema / properties / iosXctestrunFileAdded value: +{ + "description": "Externally built iOS XCTest runner .xctestrun artifact path.", + "type": "string" +} - added
Input schema / properties / mcpOutputFormatAdded value: +{ + "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.", + "enum": [ + "optimized", + "json" + ], + "type": "string" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "android", - "macos", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "apple" +]
- Changed
close5 fields changed- added
Input schema / properties / iosXctestDerivedDataPathAdded value: +{ + "description": "Derived data path for external iOS XCTest runner execution.", + "type": "string" +} - added
Input schema / properties / iosXctestEnvDirAdded value: +{ + "description": "Writable directory for iOS XCTest runner env overlays.", + "type": "string" +} - added
Input schema / properties / iosXctestrunFileAdded value: +{ + "description": "Externally built iOS XCTest runner .xctestrun artifact path.", + "type": "string" +} - added
Input schema / properties / mcpOutputFormatAdded value: +{ + "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.", + "enum": [ + "optimized", + "json" + ], + "type": "string" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "android", - "macos", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "apple" +]
- Added
debug - Changed
devices5 fields changed- added
Input schema / properties / iosXctestDerivedDataPathAdded value: +{ + "description": "Derived data path for external iOS XCTest runner execution.", + "type": "string" +} - added
Input schema / properties / iosXctestEnvDirAdded value: +{ + "description": "Writable directory for iOS XCTest runner env overlays.", + "type": "string" +} - added
Input schema / properties / iosXctestrunFileAdded value: +{ + "description": "Externally built iOS XCTest runner .xctestrun artifact path.", + "type": "string" +} - added
Input schema / properties / mcpOutputFormatAdded value: +{ + "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.", + "enum": [ + "optimized", + "json" + ], + "type": "string" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "android", - "macos", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "apple" +]
- Changed
diff6 fields changed- removed
Input schema / properties / compactRemoved value: -{ - "type": "boolean" -} - added
Input schema / properties / iosXctestDerivedDataPathAdded value: +{ + "description": "Derived data path for external iOS XCTest runner execution.", + "type": "string" +} - added
Input schema / properties / iosXctestEnvDirAdded value: +{ + "description": "Writable directory for iOS XCTest runner env overlays.", + "type": "string" +} - added
Input schema / properties / iosXctestrunFileAdded value: +{ + "description": "Externally built iOS XCTest runner .xctestrun artifact path.", + "type": "string" +} - added
Input schema / properties / mcpOutputFormatAdded value: +{ + "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.", + "enum": [ + "optimized", + "json" + ], + "type": "string" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "android", - "macos", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "apple" +]
- Changed
fill5 fields changed- added
Input schema / properties / iosXctestDerivedDataPathAdded value: +{ + "description": "Derived data path for external iOS XCTest runner execution.", + "type": "string" +} - added
Input schema / properties / iosXctestEnvDirAdded value: +{ + "description": "Writable directory for iOS XCTest runner env overlays.", + "type": "string" +} - added
Input schema / properties / iosXctestrunFileAdded value: +{ + "description": "Externally built iOS XCTest runner .xctestrun artifact path.", + "type": "string" +} - added
Input schema / properties / mcpOutputFormatAdded value: +{ + "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.", + "enum": [ + "optimized", + "json" + ], + "type": "string" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "android", - "macos", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "apple" +]
- Changed
find5 fields changed- added
Input schema / properties / iosXctestDerivedDataPathAdded value: +{ + "description": "Derived data path for external iOS XCTest runner execution.", + "type": "string" +} - added
Input schema / properties / iosXctestEnvDirAdded value: +{ + "description": "Writable directory for iOS XCTest runner env overlays.", + "type": "string" +} - added
Input schema / properties / iosXctestrunFileAdded value: +{ + "description": "Externally built iOS XCTest runner .xctestrun artifact path.", + "type": "string" +} - added
Input schema / properties / mcpOutputFormatAdded value: +{ + "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.", + "enum": [ + "optimized", + "json" + ], + "type": "string" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "android", - "macos", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "apple" +]
- Changed
focus5 fields changed- added
Input schema / properties / iosXctestDerivedDataPathAdded value: +{ + "description": "Derived data path for external iOS XCTest runner execution.", + "type": "string" +} - added
Input schema / properties / iosXctestEnvDirAdded value: +{ + "description": "Writable directory for iOS XCTest runner env overlays.", + "type": "string" +} - added
Input schema / properties / iosXctestrunFileAdded value: +{ + "description": "Externally built iOS XCTest runner .xctestrun artifact path.", + "type": "string" +} - added
Input schema / properties / mcpOutputFormatAdded value: +{ + "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.", + "enum": [ + "optimized", + "json" + ], + "type": "string" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "android", - "macos", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "apple" +]
- Changed
gesture5 fields changed- added
Input schema / properties / iosXctestDerivedDataPathAdded value: +{ + "description": "Derived data path for external iOS XCTest runner execution.", + "type": "string" +} - added
Input schema / properties / iosXctestEnvDirAdded value: +{ + "description": "Writable directory for iOS XCTest runner env overlays.", + "type": "string" +} - added
Input schema / properties / iosXctestrunFileAdded value: +{ + "description": "Externally built iOS XCTest runner .xctestrun artifact path.", + "type": "string" +} - added
Input schema / properties / mcpOutputFormatAdded value: +{ + "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.", + "enum": [ + "optimized", + "json" + ], + "type": "string" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "android", - "macos", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "apple" +]
- Changed
get5 fields changed- added
Input schema / properties / iosXctestDerivedDataPathAdded value: +{ + "description": "Derived data path for external iOS XCTest runner execution.", + "type": "string" +} - added
Input schema / properties / iosXctestEnvDirAdded value: +{ + "description": "Writable directory for iOS XCTest runner env overlays.", + "type": "string" +} - added
Input schema / properties / iosXctestrunFileAdded value: +{ + "description": "Externally built iOS XCTest runner .xctestrun artifact path.", + "type": "string" +} - added
Input schema / properties / mcpOutputFormatAdded value: +{ + "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.", + "enum": [ + "optimized", + "json" + ], + "type": "string" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "android", - "macos", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "apple" +]
- Changed
home5 fields changed- added
Input schema / properties / iosXctestDerivedDataPathAdded value: +{ + "description": "Derived data path for external iOS XCTest runner execution.", + "type": "string" +} - added
Input schema / properties / iosXctestEnvDirAdded value: +{ + "description": "Writable directory for iOS XCTest runner env overlays.", + "type": "string" +} - added
Input schema / properties / iosXctestrunFileAdded value: +{ + "description": "Externally built iOS XCTest runner .xctestrun artifact path.", + "type": "string" +} - added
Input schema / properties / mcpOutputFormatAdded value: +{ + "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.", + "enum": [ + "optimized", + "json" + ], + "type": "string" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "android", - "macos", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "apple" +]
- Changed
install5 fields changed- added
Input schema / properties / iosXctestDerivedDataPathAdded value: +{ + "description": "Derived data path for external iOS XCTest runner execution.", + "type": "string" +} - added
Input schema / properties / iosXctestEnvDirAdded value: +{ + "description": "Writable directory for iOS XCTest runner env overlays.", + "type": "string" +} - added
Input schema / properties / iosXctestrunFileAdded value: +{ + "description": "Externally built iOS XCTest runner .xctestrun artifact path.", + "type": "string" +} - added
Input schema / properties / mcpOutputFormatAdded value: +{ + "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.", + "enum": [ + "optimized", + "json" + ], + "type": "string" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "android", - "macos", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "apple" +]
- Changed
install-from-source5 fields changed- added
Input schema / properties / iosXctestDerivedDataPathAdded value: +{ + "description": "Derived data path for external iOS XCTest runner execution.", + "type": "string" +} - added
Input schema / properties / iosXctestEnvDirAdded value: +{ + "description": "Writable directory for iOS XCTest runner env overlays.", + "type": "string" +} - added
Input schema / properties / iosXctestrunFileAdded value: +{ + "description": "Externally built iOS XCTest runner .xctestrun artifact path.", + "type": "string" +} - added
Input schema / properties / mcpOutputFormatAdded value: +{ + "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.", + "enum": [ + "optimized", + "json" + ], + "type": "string" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "android", - "macos", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "apple" +]
- Changed
is5 fields changed- added
Input schema / properties / iosXctestDerivedDataPathAdded value: +{ + "description": "Derived data path for external iOS XCTest runner execution.", + "type": "string" +} - added
Input schema / properties / iosXctestEnvDirAdded value: +{ + "description": "Writable directory for iOS XCTest runner env overlays.", + "type": "string" +} - added
Input schema / properties / iosXctestrunFileAdded value: +{ + "description": "Externally built iOS XCTest runner .xctestrun artifact path.", + "type": "string" +} - added
Input schema / properties / mcpOutputFormatAdded value: +{ + "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.", + "enum": [ + "optimized", + "json" + ], + "type": "string" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "android", - "macos", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "apple" +]
- Changed
keyboard5 fields changed- added
Input schema / properties / iosXctestDerivedDataPathAdded value: +{ + "description": "Derived data path for external iOS XCTest runner execution.", + "type": "string" +} - added
Input schema / properties / iosXctestEnvDirAdded value: +{ + "description": "Writable directory for iOS XCTest runner env overlays.", + "type": "string" +} - added
Input schema / properties / iosXctestrunFileAdded value: +{ + "description": "Externally built iOS XCTest runner .xctestrun artifact path.", + "type": "string" +} - added
Input schema / properties / mcpOutputFormatAdded value: +{ + "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.", + "enum": [ + "optimized", + "json" + ], + "type": "string" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "android", - "macos", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "apple" +]
- Changed
logs5 fields changed- added
Input schema / properties / iosXctestDerivedDataPathAdded value: +{ + "description": "Derived data path for external iOS XCTest runner execution.", + "type": "string" +} - added
Input schema / properties / iosXctestEnvDirAdded value: +{ + "description": "Writable directory for iOS XCTest runner env overlays.", + "type": "string" +} - added
Input schema / properties / iosXctestrunFileAdded value: +{ + "description": "Externally built iOS XCTest runner .xctestrun artifact path.", + "type": "string" +} - added
Input schema / properties / mcpOutputFormatAdded value: +{ + "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.", + "enum": [ + "optimized", + "json" + ], + "type": "string" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "android", - "macos", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "apple" +]
- Changed
longpress5 fields changed- added
Input schema / properties / iosXctestDerivedDataPathAdded value: +{ + "description": "Derived data path for external iOS XCTest runner execution.", + "type": "string" +} - added
Input schema / properties / iosXctestEnvDirAdded value: +{ + "description": "Writable directory for iOS XCTest runner env overlays.", + "type": "string" +} - added
Input schema / properties / iosXctestrunFileAdded value: +{ + "description": "Externally built iOS XCTest runner .xctestrun artifact path.", + "type": "string" +} - added
Input schema / properties / mcpOutputFormatAdded value: +{ + "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.", + "enum": [ + "optimized", + "json" + ], + "type": "string" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "android", - "macos", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "apple" +]
- Changed
metro5 fields changed- added
Input schema / properties / iosXctestDerivedDataPathAdded value: +{ + "description": "Derived data path for external iOS XCTest runner execution.", + "type": "string" +} - added
Input schema / properties / iosXctestEnvDirAdded value: +{ + "description": "Writable directory for iOS XCTest runner env overlays.", + "type": "string" +} - added
Input schema / properties / iosXctestrunFileAdded value: +{ + "description": "Externally built iOS XCTest runner .xctestrun artifact path.", + "type": "string" +} - added
Input schema / properties / mcpOutputFormatAdded value: +{ + "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.", + "enum": [ + "optimized", + "json" + ], + "type": "string" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "android", - "macos", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "apple" +]
- Changed
network5 fields changed- added
Input schema / properties / iosXctestDerivedDataPathAdded value: +{ + "description": "Derived data path for external iOS XCTest runner execution.", + "type": "string" +} - added
Input schema / properties / iosXctestEnvDirAdded value: +{ + "description": "Writable directory for iOS XCTest runner env overlays.", + "type": "string" +} - added
Input schema / properties / iosXctestrunFileAdded value: +{ + "description": "Externally built iOS XCTest runner .xctestrun artifact path.", + "type": "string" +} - added
Input schema / properties / mcpOutputFormatAdded value: +{ + "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.", + "enum": [ + "optimized", + "json" + ], + "type": "string" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "android", - "macos", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "apple" +]
- Changed
open6 fields changed- added
Input schema / properties / deviceHubAdded value: +{ + "description": "Use Xcode Device Hub when surfacing Apple simulators.", + "type": "boolean" +} - added
Input schema / properties / iosXctestDerivedDataPathAdded value: +{ + "description": "Derived data path for external iOS XCTest runner execution.", + "type": "string" +} - added
Input schema / properties / iosXctestEnvDirAdded value: +{ + "description": "Writable directory for iOS XCTest runner env overlays.", + "type": "string" +} - added
Input schema / properties / iosXctestrunFileAdded value: +{ + "description": "Externally built iOS XCTest runner .xctestrun artifact path.", + "type": "string" +} - added
Input schema / properties / mcpOutputFormatAdded value: +{ + "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.", + "enum": [ + "optimized", + "json" + ], + "type": "string" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "android", - "macos", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "apple" +]
- Changed
perf12 fields changed- changed
Input schema / properties / action / enumPrevious value: -[ - "sample" -]New value: +[ + "sample", + "snapshot", + "start", + "stop", + "report" +] - changed
Input schema / properties / area / enumPrevious value: -[ - "metrics", - "frames" -]New value: +[ + "metrics", + "frames", + "memory", + "cpu", + "trace" +] - added
Input schema / properties / iosXctestDerivedDataPathAdded value: +{ + "description": "Derived data path for external iOS XCTest runner execution.", + "type": "string" +} - added
Input schema / properties / iosXctestEnvDirAdded value: +{ + "description": "Writable directory for iOS XCTest runner env overlays.", + "type": "string" +} - added
Input schema / properties / iosXctestrunFileAdded value: +{ + "description": "Externally built iOS XCTest runner .xctestrun artifact path.", + "type": "string" +} - added
Input schema / properties / kindAdded value: +{ + "enum": [ + "xctrace", + "simpleperf", + "perfetto", + "android-hprof", + "memgraph" + ], + "type": "string" +} - added
Input schema / properties / mcpOutputFormatAdded value: +{ + "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.", + "enum": [ + "optimized", + "json" + ], + "type": "string" +} - added
Input schema / properties / outAdded value: +{ + "description": "Output artifact path.", + "type": "string" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "android", - "macos", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "apple" +] - added
Input schema / properties / subjectAdded value: +{ + "enum": [ + "profile" + ], + "type": "string" +} - added
Input schema / properties / templateAdded value: +{ + "description": "xctrace template name, for example Time Profiler.", + "type": "string" +} - added
Input schema / properties / tracePathAdded value: +{ + "description": "Existing .trace path to report, defaults to the latest session trace.", + "type": "string" +}
- Changed
press5 fields changed- added
Input schema / properties / iosXctestDerivedDataPathAdded value: +{ + "description": "Derived data path for external iOS XCTest runner execution.", + "type": "string" +} - added
Input schema / properties / iosXctestEnvDirAdded value: +{ + "description": "Writable directory for iOS XCTest runner env overlays.", + "type": "string" +} - added
Input schema / properties / iosXctestrunFileAdded value: +{ + "description": "Externally built iOS XCTest runner .xctestrun artifact path.", + "type": "string" +} - added
Input schema / properties / mcpOutputFormatAdded value: +{ + "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.", + "enum": [ + "optimized", + "json" + ], + "type": "string" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "android", - "macos", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "apple" +]
- Changed
push5 fields changed- added
Input schema / properties / iosXctestDerivedDataPathAdded value: +{ + "description": "Derived data path for external iOS XCTest runner execution.", + "type": "string" +} - added
Input schema / properties / iosXctestEnvDirAdded value: +{ + "description": "Writable directory for iOS XCTest runner env overlays.", + "type": "string" +} - added
Input schema / properties / iosXctestrunFileAdded value: +{ + "description": "Externally built iOS XCTest runner .xctestrun artifact path.", + "type": "string" +} - added
Input schema / properties / mcpOutputFormatAdded value: +{ + "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.", + "enum": [ + "optimized", + "json" + ], + "type": "string" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "android", - "macos", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "apple" +]
- Changed
react-native5 fields changed- added
Input schema / properties / iosXctestDerivedDataPathAdded value: +{ + "description": "Derived data path for external iOS XCTest runner execution.", + "type": "string" +} - added
Input schema / properties / iosXctestEnvDirAdded value: +{ + "description": "Writable directory for iOS XCTest runner env overlays.", + "type": "string" +} - added
Input schema / properties / iosXctestrunFileAdded value: +{ + "description": "Externally built iOS XCTest runner .xctestrun artifact path.", + "type": "string" +} - added
Input schema / properties / mcpOutputFormatAdded value: +{ + "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.", + "enum": [ + "optimized", + "json" + ], + "type": "string" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "android", - "macos", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "apple" +]
- Changed
record5 fields changed- added
Input schema / properties / iosXctestDerivedDataPathAdded value: +{ + "description": "Derived data path for external iOS XCTest runner execution.", + "type": "string" +} - added
Input schema / properties / iosXctestEnvDirAdded value: +{ + "description": "Writable directory for iOS XCTest runner env overlays.", + "type": "string" +} - added
Input schema / properties / iosXctestrunFileAdded value: +{ + "description": "Externally built iOS XCTest runner .xctestrun artifact path.", + "type": "string" +} - added
Input schema / properties / mcpOutputFormatAdded value: +{ + "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.", + "enum": [ + "optimized", + "json" + ], + "type": "string" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "android", - "macos", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "apple" +]
- Changed
reinstall5 fields changed- added
Input schema / properties / iosXctestDerivedDataPathAdded value: +{ + "description": "Derived data path for external iOS XCTest runner execution.", + "type": "string" +} - added
Input schema / properties / iosXctestEnvDirAdded value: +{ + "description": "Writable directory for iOS XCTest runner env overlays.", + "type": "string" +} - added
Input schema / properties / iosXctestrunFileAdded value: +{ + "description": "Externally built iOS XCTest runner .xctestrun artifact path.", + "type": "string" +} - added
Input schema / properties / mcpOutputFormatAdded value: +{ + "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.", + "enum": [ + "optimized", + "json" + ], + "type": "string" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "android", - "macos", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "apple" +]
- Changed
replay5 fields changed- added
Input schema / properties / iosXctestDerivedDataPathAdded value: +{ + "description": "Derived data path for external iOS XCTest runner execution.", + "type": "string" +} - added
Input schema / properties / iosXctestEnvDirAdded value: +{ + "description": "Writable directory for iOS XCTest runner env overlays.", + "type": "string" +} - added
Input schema / properties / iosXctestrunFileAdded value: +{ + "description": "Externally built iOS XCTest runner .xctestrun artifact path.", + "type": "string" +} - added
Input schema / properties / mcpOutputFormatAdded value: +{ + "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.", + "enum": [ + "optimized", + "json" + ], + "type": "string" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "android", - "macos", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "apple" +]
- Changed
rotate5 fields changed- added
Input schema / properties / iosXctestDerivedDataPathAdded value: +{ + "description": "Derived data path for external iOS XCTest runner execution.", + "type": "string" +} - added
Input schema / properties / iosXctestEnvDirAdded value: +{ + "description": "Writable directory for iOS XCTest runner env overlays.", + "type": "string" +} - added
Input schema / properties / iosXctestrunFileAdded value: +{ + "description": "Externally built iOS XCTest runner .xctestrun artifact path.", + "type": "string" +} - added
Input schema / properties / mcpOutputFormatAdded value: +{ + "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.", + "enum": [ + "optimized", + "json" + ], + "type": "string" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "android", - "macos", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "apple" +]
- Changed
screenshot5 fields changed- added
Input schema / properties / iosXctestDerivedDataPathAdded value: +{ + "description": "Derived data path for external iOS XCTest runner execution.", + "type": "string" +} - added
Input schema / properties / iosXctestEnvDirAdded value: +{ + "description": "Writable directory for iOS XCTest runner env overlays.", + "type": "string" +} - added
Input schema / properties / iosXctestrunFileAdded value: +{ + "description": "Externally built iOS XCTest runner .xctestrun artifact path.", + "type": "string" +} - added
Input schema / properties / mcpOutputFormatAdded value: +{ + "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.", + "enum": [ + "optimized", + "json" + ], + "type": "string" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "android", - "macos", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "apple" +]
- Changed
scroll5 fields changed- added
Input schema / properties / iosXctestDerivedDataPathAdded value: +{ + "description": "Derived data path for external iOS XCTest runner execution.", + "type": "string" +} - added
Input schema / properties / iosXctestEnvDirAdded value: +{ + "description": "Writable directory for iOS XCTest runner env overlays.", + "type": "string" +} - added
Input schema / properties / iosXctestrunFileAdded value: +{ + "description": "Externally built iOS XCTest runner .xctestrun artifact path.", + "type": "string" +} - added
Input schema / properties / mcpOutputFormatAdded value: +{ + "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.", + "enum": [ + "optimized", + "json" + ], + "type": "string" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "android", - "macos", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "apple" +]
- Changed
session7 fields changed- added
Input schema / properties / action / descriptionAdded value: +"list shows active sessions; state-dir prints the resolved daemon state directory without contacting the daemon." - changed
Input schema / properties / action / enumPrevious value: -[ - "list" -]New value: +[ + "list", + "state-dir" +] - added
Input schema / properties / iosXctestDerivedDataPathAdded value: +{ + "description": "Derived data path for external iOS XCTest runner execution.", + "type": "string" +} - added
Input schema / properties / iosXctestEnvDirAdded value: +{ + "description": "Writable directory for iOS XCTest runner env overlays.", + "type": "string" +} - added
Input schema / properties / iosXctestrunFileAdded value: +{ + "description": "Externally built iOS XCTest runner .xctestrun artifact path.", + "type": "string" +} - added
Input schema / properties / mcpOutputFormatAdded value: +{ + "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.", + "enum": [ + "optimized", + "json" + ], + "type": "string" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "android", - "macos", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "apple" +]
- Changed
settings5 fields changed- added
Input schema / properties / iosXctestDerivedDataPathAdded value: +{ + "description": "Derived data path for external iOS XCTest runner execution.", + "type": "string" +} - added
Input schema / properties / iosXctestEnvDirAdded value: +{ + "description": "Writable directory for iOS XCTest runner env overlays.", + "type": "string" +} - added
Input schema / properties / iosXctestrunFileAdded value: +{ + "description": "Externally built iOS XCTest runner .xctestrun artifact path.", + "type": "string" +} - added
Input schema / properties / mcpOutputFormatAdded value: +{ + "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.", + "enum": [ + "optimized", + "json" + ], + "type": "string" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "android", - "macos", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "apple" +]
- Added
shutdown - Changed
snapshot6 fields changed- removed
Input schema / properties / compactRemoved value: -{ - "type": "boolean" -} - added
Input schema / properties / iosXctestDerivedDataPathAdded value: +{ + "description": "Derived data path for external iOS XCTest runner execution.", + "type": "string" +} - added
Input schema / properties / iosXctestEnvDirAdded value: +{ + "description": "Writable directory for iOS XCTest runner env overlays.", + "type": "string" +} - added
Input schema / properties / iosXctestrunFileAdded value: +{ + "description": "Externally built iOS XCTest runner .xctestrun artifact path.", + "type": "string" +} - added
Input schema / properties / mcpOutputFormatAdded value: +{ + "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.", + "enum": [ + "optimized", + "json" + ], + "type": "string" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "android", - "macos", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "apple" +]
- Changed
swipe5 fields changed- added
Input schema / properties / iosXctestDerivedDataPathAdded value: +{ + "description": "Derived data path for external iOS XCTest runner execution.", + "type": "string" +} - added
Input schema / properties / iosXctestEnvDirAdded value: +{ + "description": "Writable directory for iOS XCTest runner env overlays.", + "type": "string" +} - added
Input schema / properties / iosXctestrunFileAdded value: +{ + "description": "Externally built iOS XCTest runner .xctestrun artifact path.", + "type": "string" +} - added
Input schema / properties / mcpOutputFormatAdded value: +{ + "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.", + "enum": [ + "optimized", + "json" + ], + "type": "string" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "android", - "macos", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "apple" +]
- Changed
test5 fields changed- added
Input schema / properties / iosXctestDerivedDataPathAdded value: +{ + "description": "Derived data path for external iOS XCTest runner execution.", + "type": "string" +} - added
Input schema / properties / iosXctestEnvDirAdded value: +{ + "description": "Writable directory for iOS XCTest runner env overlays.", + "type": "string" +} - added
Input schema / properties / iosXctestrunFileAdded value: +{ + "description": "Externally built iOS XCTest runner .xctestrun artifact path.", + "type": "string" +} - added
Input schema / properties / mcpOutputFormatAdded value: +{ + "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.", + "enum": [ + "optimized", + "json" + ], + "type": "string" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "android", - "macos", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "apple" +]
- Changed
trace5 fields changed- added
Input schema / properties / iosXctestDerivedDataPathAdded value: +{ + "description": "Derived data path for external iOS XCTest runner execution.", + "type": "string" +} - added
Input schema / properties / iosXctestEnvDirAdded value: +{ + "description": "Writable directory for iOS XCTest runner env overlays.", + "type": "string" +} - added
Input schema / properties / iosXctestrunFileAdded value: +{ + "description": "Externally built iOS XCTest runner .xctestrun artifact path.", + "type": "string" +} - added
Input schema / properties / mcpOutputFormatAdded value: +{ + "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.", + "enum": [ + "optimized", + "json" + ], + "type": "string" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "android", - "macos", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "apple" +]
- Changed
trigger-app-event5 fields changed- added
Input schema / properties / iosXctestDerivedDataPathAdded value: +{ + "description": "Derived data path for external iOS XCTest runner execution.", + "type": "string" +} - added
Input schema / properties / iosXctestEnvDirAdded value: +{ + "description": "Writable directory for iOS XCTest runner env overlays.", + "type": "string" +} - added
Input schema / properties / iosXctestrunFileAdded value: +{ + "description": "Externally built iOS XCTest runner .xctestrun artifact path.", + "type": "string" +} - added
Input schema / properties / mcpOutputFormatAdded value: +{ + "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.", + "enum": [ + "optimized", + "json" + ], + "type": "string" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "android", - "macos", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "apple" +]
- Changed
type5 fields changed- added
Input schema / properties / iosXctestDerivedDataPathAdded value: +{ + "description": "Derived data path for external iOS XCTest runner execution.", + "type": "string" +} - added
Input schema / properties / iosXctestEnvDirAdded value: +{ + "description": "Writable directory for iOS XCTest runner env overlays.", + "type": "string" +} - added
Input schema / properties / iosXctestrunFileAdded value: +{ + "description": "Externally built iOS XCTest runner .xctestrun artifact path.", + "type": "string" +} - added
Input schema / properties / mcpOutputFormatAdded value: +{ + "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.", + "enum": [ + "optimized", + "json" + ], + "type": "string" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "android", - "macos", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "apple" +]
- Changed
wait5 fields changed- added
Input schema / properties / iosXctestDerivedDataPathAdded value: +{ + "description": "Derived data path for external iOS XCTest runner execution.", + "type": "string" +} - added
Input schema / properties / iosXctestEnvDirAdded value: +{ + "description": "Writable directory for iOS XCTest runner env overlays.", + "type": "string" +} - added
Input schema / properties / iosXctestrunFileAdded value: +{ + "description": "Externally built iOS XCTest runner .xctestrun artifact path.", + "type": "string" +} - added
Input schema / properties / mcpOutputFormatAdded value: +{ + "description": "MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.", + "enum": [ + "optimized", + "json" + ], + "type": "string" +} - changed
Input schema / properties / platform / enumPrevious value: -[ - "ios", - "android", - "macos", - "linux", - "apple" -]New value: +[ + "ios", + "macos", + "android", + "linux", + "apple" +]
2 tool updates
v0.17.1- Changed
perf2 fields changed- added
Input schema / properties / actionAdded value: +{ + "enum": [ + "sample" + ], + "type": "string" +} - added
Input schema / properties / areaAdded value: +{ + "enum": [ + "metrics", + "frames" + ], + "type": "string" +}
- Changed
test3 fields changed- added
Input schema / properties / recordVideoAdded value: +{ + "type": "boolean" +} - added
Input schema / properties / shardAllAdded value: +{ + "type": "integer" +} - added
Input schema / properties / shardSplitAdded value: +{ + "type": "integer" +}
46 tool updates
v0.16.9- First observed
alert - First observed
app-switcher - First observed
apps - First observed
appstate - First observed
back - First observed
batch - First observed
boot - First observed
click - First observed
clipboard - First observed
close - First observed
devices - First observed
diff - First observed
fill - First observed
find - First observed
focus - First observed
gesture - First observed
get - First observed
home - First observed
install - First observed
install-from-source - First observed
is - First observed
keyboard - First observed
logs - First observed
longpress - First observed
metro - First observed
network - First observed
open - First observed
perf - First observed
press - First observed
push - First observed
react-native - First observed
record - First observed
reinstall - First observed
replay - First observed
rotate - First observed
screenshot - First observed
scroll - First observed
session - First observed
settings - First observed
snapshot - First observed
swipe - First observed
test - First observed
trace - First observed
trigger-app-event - First observed
type - First observed
wait
TDQS
Scored across 57 tools
Several tools have blurred boundaries: click and press both activate a UI target, find combines search with action in a vaguer way than snapshot/get, and diff overlaps with snapshot's built-in diff option. Descriptions help for many pairs, but the interaction and diagnostics namespaces contain enough overlap that an agent can easily select the wrong tool.
The names share a uniform lowercase, hyphenated style, which is readable and cohesive. However, they mix bare nouns like screenshot, apps, and logs with bare verbs like open, close, and wait, plus phrasal names like install-from-source and trigger-app-event, so there is no consistent verb_object pattern.
With 57 tools, this server is far beyond a well-scoped MCP surface, and the rubric treats 50+ as an extreme mismatch. The toolset would be more navigable split into separate namespaces or servers for device lifecycle, UI interaction, diagnostics, and development-server workflows.
The surface is remarkably comprehensive for device automation: boot/install/launch/close/shutdown, rich UI interactions, snapshots, navigation, alerts, push, settings, keyboard, web viewport, performance, network, logs, and replay/test orchestration. The main gaps are lifecycle operations like app uninstall or clear-data, but agents can usually work around these without dead ends.
Maintenance
Related MCP Connectors
Search, fetch, lint, and install Agent Skills (SKILL.md) from the SkillMD registry.
Discover, search, invoke, and rate A2A (Agent-to-Agent) protocol agents.
Discover Wiplash and manage owned agents with human OAuth.
Discover Agents and MCP capabilities with versions, permissions, and real-work trust context.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceActs as a unified dispatch hub for local coding agent CLIs, supporting capability-based routing, schema validation, and retries via MCP tools.MIT
- AlicenseNot gradedqualityBmaintenanceDiscovers and manages portable agent capabilities (skills and MCP servers) from configurable collections, providing search, inspection, and local installation via CLI and MCP tools.1MIT
- FlicenseAqualityBmaintenanceActs as a personal AI development environment manager, enabling workspace bootstrapping, headless skill and bundle installation, global caching, and health diagnostics.74-
- FlicenseAqualityCmaintenanceExposes Justworx devices to AI agents as MCP tools and resources, backed by the public Developer API. Supports local stdio and hosted remote OAuth operation for controlling device IO, rules, and viewing live state.6-