mirror of
https://github.com/callstack/agent-device.git
synced 2026-09-14 20:06:34 +08:00
1 line
43 KiB
JavaScript
1 line
43 KiB
JavaScript
(()=>{"use strict";var e,t,n,a,i,o,s,r={1133(e,t,n){let a={pages:[{title:"",routePath:"/404",lang:"en",toc:[],frontmatter:{pageType:"custom"},version:"",_relativePath:"404.mdx"},{title:"AI Agent Setup",routePath:"/docs/agent-setup",lang:"en",toc:[{id:"prerequisite-install-the-cli",text:"Prerequisite: install the CLI",depth:2,charIndex:836},{id:"install-the-skills",text:"Install the skills",depth:2,charIndex:1674},{id:"recommended-agent-rule",text:"Recommended agent rule",depth:2,charIndex:2234},{id:"mcp-server",text:"MCP server",depth:2,charIndex:4297},{id:"cursor",text:"Cursor",depth:2,charIndex:6447},{id:"cursor-path-a-cli-only",text:"Cursor path A: CLI only",depth:3,charIndex:6698},{id:"cursor-path-b-mcp-tools",text:"Cursor path B: MCP tools",depth:3,charIndex:8282},{id:"codex",text:"Codex",depth:2,charIndex:9011},{id:"claude-code",text:"Claude Code",depth:2,charIndex:9776},{id:"claude-path-a-cli-only",text:"Claude path A: CLI only",depth:3,charIndex:9968},{id:"claude-path-b-mcp-tools",text:"Claude path B: MCP tools",depth:3,charIndex:11435},{id:"windsurf-cline-goose-and-other-mcp-clients",text:"Windsurf, Cline, Goose, and other MCP clients",depth:2,charIndex:12407},{id:"why-this-setup-works",text:"Why this setup works",depth:2,charIndex:12900},{id:"agent-readable-docs",text:"Agent-readable docs",depth:2,charIndex:13513}],frontmatter:{title:"AI Agent Setup",description:"Configure Cursor, Codex, Claude Code, Windsurf, Cline, Goose, iOS Simulator and Android Emulator skills, and MCP for agent-device app verification."},version:"",_relativePath:"docs/agent-setup.md",description:"Configure Cursor, Codex, Claude Code, Windsurf, Cline, Goose, iOS Simulator and Android Emulator skills, and MCP for agent-device app verification."},{title:"AI SDK",routePath:"/docs/ai-sdk",lang:"en",toc:[{id:"options",text:"Options",depth:2,charIndex:1344}],frontmatter:{title:"AI SDK"},version:"",_relativePath:"docs/ai-sdk.md",description:"Use agent-device/ai-sdk to give an AI SDK agent a typed set of tools for navigating and inspecting an app. The tools run in-process, share one named session, and default to the focused perceive-and-act surface most agents need. Make an iOS simulator or device available to agent-device, then configure an AI SDK model. String model IDs use AI Gateway by default: Alternatively, pass a model from your configured AI SDK provider. See the AI SDK guide to choosing a provider. Set AI_MODEL to a model available through your configured AI SDK provider. The agent sees the available device tools and chooses the calls needed to complete the prompt. The returned client targets the same session; keep cleanup in finally so the device is released even if generation fails."},{title:"AWS Device Farm",routePath:"/docs/aws-device-farm",lang:"en",toc:[{id:"credentials-and-connection",text:"Credentials and connection",depth:2,charIndex:191},{id:"cli-workflow",text:"CLI workflow",depth:2,charIndex:2353},{id:"nodejs-client",text:"Node.js client",depth:2,charIndex:3451},{id:"artifacts-and-troubleshooting",text:"Artifacts and troubleshooting",depth:2,charIndex:3966}],frontmatter:{title:"AWS Device Farm",description:"Drive AWS Device Farm remote-access sessions with agent-device."},version:"",_relativePath:"docs/aws-device-farm.md",description:"Drive AWS Device Farm remote-access sessions with agent-device."},{title:"Batching",routePath:"/docs/batching",lang:"en",toc:[{id:"cli-examples",text:"CLI examples",depth:2,charIndex:190},{id:"step-payload-format",text:"Step payload format",depth:2,charIndex:532},{id:"response-shape",text:"Response shape",depth:2,charIndex:1488},{id:"agent-best-practices",text:"Agent best practices",depth:2,charIndex:2431},{id:"canonical-recipes",text:"Canonical recipes",depth:2,charIndex:2822},{id:"stale-accessibility-tree-risk",text:"Stale accessibility tree risk",depth:2,charIndex:4464}],frontmatter:{title:"Batching"},version:"",_relativePath:"docs/batching.md",description:"Use batch to run multiple commands in a single daemon request. This is useful for agent workflows that already know the next sequence of actions and want to reduce orchestration overhead."},{title:"BrowserStack",routePath:"/docs/browserstack",lang:"en",toc:[{id:"credentials-and-connection",text:"Credentials and connection",depth:2,charIndex:78},{id:"cli-workflow",text:"CLI workflow",depth:2,charIndex:2504},{id:"nodejs-client",text:"Node.js client",depth:2,charIndex:3177},{id:"artifacts-and-troubleshooting",text:"Artifacts and troubleshooting",depth:2,charIndex:4133}],frontmatter:{title:"BrowserStack",description:"Drive BrowserStack App Automate sessions with agent-device."},version:"",_relativePath:"docs/browserstack.md",description:"Drive BrowserStack App Automate sessions with agent-device."},{title:"Node.js API",routePath:"/docs/client-api",lang:"en",toc:[{id:"runnable-examples",text:"Runnable examples",depth:2,charIndex:195},{id:"api-reference",text:"API reference",depth:2,charIndex:924},{id:"basic-usage",text:"Basic usage",depth:2,charIndex:3817},{id:"device-cloud-sessions",text:"Device cloud sessions",depth:2,charIndex:5620},{id:"web-sessions",text:"Web sessions",depth:2,charIndex:7012},{id:"android-adb-providers",text:"Android ADB providers",depth:2,charIndex:8357},{id:"command-methods",text:"Command methods",depth:2,charIndex:9575},{id:"batch-orchestration-for-custom-transports",text:"Batch orchestration for custom transports",depth:2,charIndex:16423},{id:"android-installfromsource",text:"Android `installFromSource()`",depth:2,charIndex:16832},{id:"url-source-rules",text:"URL source rules",depth:2,charIndex:17732},{id:"remote-metro-helpers",text:"Remote Metro helpers",depth:2,charIndex:18957},{id:"selector-helpers",text:"Selector helpers",depth:2,charIndex:20356}],frontmatter:{title:"Node.js API"},version:"",_relativePath:"docs/client-api.md",description:"Use createAgentDeviceClient() for typed, deterministic device automation from Node.js instead of shelling out to the CLI. Building an agent? Start with the dedicated AI SDK or Eve integration."},{title:"Commands",routePath:"/docs/commands",lang:"en",toc:[{id:"navigation",text:"Navigation",depth:2,charIndex:1071},{id:"human-takeover",text:"Human Takeover",depth:2,charIndex:10809},{id:"web-automation",text:"Web Automation",depth:2,charIndex:12283},{id:"device-isolation-scopes",text:"Device isolation scopes",depth:2,charIndex:15594},{id:"device-discovery",text:"Device discovery",depth:2,charIndex:16575},{id:"harmonyos-command-boundary",text:"HarmonyOS command boundary",depth:3,charIndex:17692},{id:"diagnostics",text:"Diagnostics",depth:2,charIndex:19190},{id:"prepare-apple-runner",text:"Prepare Apple runner",depth:2,charIndex:19956},{id:"tv-targets",text:"TV targets",depth:2,charIndex:21708},{id:"desktop-targets",text:"Desktop targets",depth:2,charIndex:24701},{id:"snapshot-and-inspect",text:"Snapshot and inspect",depth:2,charIndex:27839},{id:"wait-and-alerts",text:"Wait and alerts",depth:2,charIndex:32323},{id:"interactions",text:"Interactions",depth:2,charIndex:37653},{id:"find-semantic",text:"Find (semantic)",depth:2,charIndex:47238},{id:"assertions",text:"Assertions",depth:2,charIndex:47784},{id:"replay",text:"Replay",depth:2,charIndex:49439},{id:"batch",text:"Batch",depth:2,charIndex:52443},{id:"app-install-in-place",text:"App install (in-place)",depth:2,charIndex:53346},{id:"app-reinstall-fresh-state",text:"App reinstall (fresh state)",depth:2,charIndex:54376},{id:"app-install-from-source-url",text:"App install from source URL",depth:2,charIndex:55211},{id:"push-notification-simulation",text:"Push notification simulation",depth:2,charIndex:57329},{id:"app-event-triggers-app-hook",text:"App event triggers (app hook)",depth:2,charIndex:58198},{id:"settings-helpers",text:"Settings helpers",depth:2,charIndex:59153},{id:"app-state-and-app-lists",text:"App state and app lists",depth:2,charIndex:64801},{id:"clipboard",text:"Clipboard",depth:2,charIndex:65280},{id:"keyboard",text:"Keyboard",depth:2,charIndex:65907},{id:"performance-diagnostics",text:"Performance diagnostics",depth:2,charIndex:66620},{id:"react-native-component-internals",text:"React Native component internals",depth:2,charIndex:73656},{id:"multiple-react-native-worktrees",text:"Multiple React Native worktrees",depth:2,charIndex:78207},{id:"metro-reload",text:"Metro reload",depth:2,charIndex:79837},{id:"media-and-logs",text:"Media and logs",depth:2,charIndex:81934},{id:"tracing",text:"Tracing",depth:2,charIndex:98823},{id:"remote-metro-workflow",text:"Remote Metro workflow",depth:2,charIndex:99213},{id:"cloud-profile-response-migration",text:"Cloud profile response migration",depth:3,charIndex:104800},{id:"session-inspection",text:"Session inspection",depth:2,charIndex:105166},{id:"cloud-provider-artifacts",text:"Cloud provider artifacts",depth:2,charIndex:105504},{id:"ios-physical-device-prerequisites",text:"iOS physical-device prerequisites",depth:2,charIndex:106963},{id:"ios-springboard-widgets-and-system-ui-surfaces",text:"iOS SpringBoard, widgets, and system-UI surfaces",depth:2,charIndex:108903}],frontmatter:{title:"Commands"},version:"",_relativePath:"docs/commands.md",description:'This page summarizes the primary command groups. For persistent defaults and project-scoped CLI settings, see Configuration. For agent workflow guidance that is matched to the installed CLI, run: Skills are recommended for auto-routing when your agent runtime supports them, but they are not required. The CLI help topics are the version-matched operating contract. For MCP-aware clients that support direct tools, run: The MCP server exposes direct structured tools for installed commands. Tools use structured input contracts through AgentDeviceClient; local-only workflows stay CLI-only rather than subprocess fallbacks. It does not expose generic shell execution over MCP. MCP tools can target platform: "web" after agent-device web setup, but setup and doctor stay CLI-only.'},{title:"Configuration",routePath:"/docs/configuration",lang:"en",toc:[{id:"config-file-locations",text:"Config file locations",depth:2,charIndex:184},{id:"config-format",text:"Config format",depth:2,charIndex:1197},{id:"supported-environment-variables",text:"Supported environment variables",depth:2,charIndex:4715},{id:"command-specific-defaults",text:"Command-specific defaults",depth:2,charIndex:6326},{id:"failure-behavior",text:"Failure behavior",depth:2,charIndex:6815}],frontmatter:{title:"Configuration"},version:"",_relativePath:"docs/configuration.md",description:"Use configuration for persistent CLI defaults instead of repeating flags on every command. Repository configuration and operator-controlled configuration have different trust scopes."},{title:"Debugging & Profiling",routePath:"/docs/debugging-profiling",lang:"en",toc:[{id:"what-agent-device-covers-well",text:"What `agent-device` covers well",depth:2,charIndex:117},{id:"react-native-component-internals",text:"React Native component internals",depth:2,charIndex:551},{id:"react-native-js-memory-through-cdp",text:"React Native JS memory through CDP",depth:2,charIndex:2528},{id:"fast-path",text:"Fast path",depth:2,charIndex:4753},{id:"crash-symbolication",text:"Crash symbolication",depth:2,charIndex:5884},{id:"core-commands",text:"Core commands",depth:2,charIndex:7367},{id:"logs",text:"Logs",depth:3,charIndex:7382},{id:"network-inspection",text:"Network inspection",depth:3,charIndex:7771},{id:"audio-probes",text:"Audio probes",depth:3,charIndex:8359},{id:"performance-snapshots",text:"Performance snapshots",depth:3,charIndex:9449},{id:"where-to-go-deeper",text:"Where to go deeper",depth:2,charIndex:13365}],frontmatter:{title:"Debugging & Profiling"},version:"",_relativePath:"docs/debugging-profiling.md",description:"Use agent-device when the task moves past UI automation and you need runtime evidence from the app or device layer."},{title:"Device Clouds & Farms",routePath:"/docs/device-clouds",lang:"en",toc:[],frontmatter:{title:"Device Clouds & Farms",description:"Choose a hosted device provider for agent and CI workflows."},version:"",_relativePath:"docs/device-clouds.md",description:"Choose a hosted device provider for agent and CI workflows."},{title:"Eve",routePath:"/docs/eve",lang:"en",toc:[{id:"runtime-placement",text:"Runtime placement",depth:2,charIndex:2048}],frontmatter:{title:"Eve"},version:"",_relativePath:"docs/eve.md",description:"Eve is Vercel's filesystem-first framework for durable agents. Files under agent/tools/ become typed model tools, which makes them a natural place to adapt the agent-device Node.js client. Create an Eve project, then add agent-device: Add agent/tools/agent_device.ts: Eve discovers the file automatically; no tool registry is required. Tell the agent how to use it in agent/instructions.md: For CI or another short-lived host, the outer runner should still close the named agent-device session in its own cleanup path. Model-directed close is useful during the normal tool loop, but it is not a replacement for deterministic cleanup after errors or cancellation."},{title:"Installation",routePath:"/docs/installation",lang:"en",toc:[{id:"global-install",text:"Global install",depth:2,charIndex:88},{id:"agent-clients-and-mcp",text:"Agent clients and MCP",depth:2,charIndex:1566},{id:"without-installing",text:"Without installing",depth:2,charIndex:1889},{id:"requirements",text:"Requirements",depth:2,charIndex:2366},{id:"vega-os-tv-prerequisites",text:"Vega OS TV prerequisites",depth:2,charIndex:3102},{id:"macos-desktop-notes",text:"macOS desktop notes",depth:2,charIndex:3862},{id:"ios-physical-device-prerequisites",text:"iOS physical device prerequisites",depth:2,charIndex:4536}],frontmatter:{title:"Installation",description:"Install agent-device for AI agent app automation, mobile testing, simulator and emulator workflows, desktop app verification, and version-matched CLI help."},version:"",_relativePath:"docs/installation.md",description:"Install agent-device for AI agent app automation, mobile testing, simulator and emulator workflows, desktop app verification, and version-matched CLI help."},{title:"Introduction",routePath:"/docs/introduction",lang:"en",toc:[{id:"where-it-shines",text:"Where it shines",depth:2,charIndex:952},{id:"development-loop",text:"Development loop",depth:2,charIndex:2008},{id:"how-agents-use-it",text:"How agents use it",depth:2,charIndex:2303},{id:"where-it-fits",text:"Where it fits",depth:2,charIndex:3275},{id:"next-steps",text:"Next steps",depth:2,charIndex:3939}],frontmatter:{title:"Introduction",description:"Learn what agent-device is, where it fits in agentic mobile, TV, desktop, and web development, and how agents use it for app verification, debugging, profiling, QA, and replay."},version:"",_relativePath:"docs/introduction.md",description:"Learn what agent-device is, where it fits in agentic mobile, TV, desktop, and web development, and how agents use it for app verification, debugging, profiling, QA, and replay."},{title:"Known Limitations",routePath:"/docs/known-limitations",lang:"en",toc:[{id:"ios-allow-paste-dialog-suppressed-under-xcuitest",text:'iOS: "Allow Paste" dialog suppressed under XCUITest',depth:2,charIndex:55},{id:"android-non-ascii-text-on-real-devices-without-the-test-ime-helper",text:"Android: non-ASCII text on real devices without the test IME helper",depth:2,charIndex:766}],frontmatter:{title:"Known Limitations"},version:"",_relativePath:"docs/known-limitations.md",description:"Platform constraints that affect automation behavior."},{title:"Limrun",routePath:"/docs/limrun",lang:"en",toc:[{id:"credentials-and-connection",text:"Credentials and connection",depth:2,charIndex:162},{id:"cli-workflow",text:"CLI workflow",depth:2,charIndex:481},{id:"nodejs-runtime",text:"Node.js runtime",depth:2,charIndex:1687},{id:"artifacts-and-troubleshooting",text:"Artifacts and troubleshooting",depth:2,charIndex:2567}],frontmatter:{title:"Limrun",description:"Drive Limrun iOS simulators and Android emulators with agent-device."},version:"",_relativePath:"docs/limrun.md",description:"Drive Limrun iOS simulators and Android emulators with agent-device."},{title:"Migrating Gestures",routePath:"/docs/migrating-gestures",lang:"en",toc:[{id:"what-changed",text:"What changed",depth:2,charIndex:410},{id:"cli",text:"CLI",depth:2,charIndex:843},{id:"nodejs",text:"Node.js",depth:2,charIndex:1885},{id:"mcp",text:"MCP",depth:2,charIndex:2757},{id:"saved-ad-recordings",text:"Saved `.ad` recordings",depth:2,charIndex:3487},{id:"maestro-flows",text:"Maestro flows",depth:3,charIndex:6396},{id:"deprecation-policy",text:"Deprecation policy",depth:2,charIndex:6890},{id:"positional-ad-syntax",text:"Positional `.ad` syntax",depth:2,charIndex:8165}],frontmatter:{title:"Migrating Gestures"},version:"",_relativePath:"docs/migrating-gestures.md",description:"agent-device 0.20.0 removed the timed forms of swipe, gesture fling, and gesture swipe, and the velocity argument of gesture rotate. Nothing is silently reinterpreted: every removed form now fails with an INVALID_ARGS error that names its replacement. This page is the migration for all four public surfaces — CLI, Node.js, MCP, and saved .ad recordings — plus the policy that governs the next such removal."},{title:"Quick Start",routePath:"/docs/quick-start",lang:"en",toc:[{id:"common-commands",text:"Common commands",depth:2,charIndex:1758},{id:"fast-batching",text:"Fast batching",depth:2,charIndex:3836},{id:"semantic-discovery",text:"Semantic discovery",depth:2,charIndex:4702},{id:"replay",text:"Replay",depth:2,charIndex:4902},{id:"scrolling",text:"Scrolling",depth:2,charIndex:4980},{id:"settings-helpers",text:"Settings helpers",depth:2,charIndex:5240},{id:"json-output",text:"JSON output",depth:2,charIndex:5759}],frontmatter:{title:"Quick Start"},version:"",_relativePath:"docs/quick-start.md",description:"For client-specific setup in Cursor, Codex, Claude Code, Windsurf, Cline, Goose, and other coding agents, see AI Agent Setup. For a single text bundle that agents can ingest, use llms-full.txt. Every device automation follows this pattern: React Native dev or debug builds often show warning or error overlays that can intercept taps or hide the real UI state. Check for them near app open and after major transitions. If they are not the requested behavior, dismiss them and continue, but mention them in your summary if you saw them. Boot target if there is no ready device/simulator:"},{title:"Remote Proxy",routePath:"/docs/remote-proxy",lang:"en",toc:[{id:"host-machine",text:"Host Machine",depth:2,charIndex:396},{id:"remote-client",text:"Remote Client",depth:2,charIndex:859},{id:"human-takeover",text:"Human Takeover",depth:2,charIndex:2515},{id:"host-administration",text:"Host administration",depth:3,charIndex:3714},{id:"what-is-exposed",text:"What Is Exposed",depth:2,charIndex:5047},{id:"compatibility",text:"Compatibility",depth:2,charIndex:5730},{id:"cleanup",text:"Cleanup",depth:2,charIndex:6007}],frontmatter:{title:"Remote Proxy",description:"Run agent-device on a Mac with simulator or device access and control it from another machine through an HTTP tunnel."},version:"",_relativePath:"docs/remote-proxy.md",description:"Run agent-device on a Mac with simulator or device access and control it from another machine through an HTTP tunnel."},{title:"Replay & E2E Testing",routePath:"/docs/replay-e2e",lang:"en",toc:[{id:"core-model",text:"Core model",depth:2,charIndex:120},{id:"record-a-replay-script",text:"Record a replay script",depth:2,charIndex:293},{id:"run-replay",text:"Run replay",depth:2,charIndex:1007},{id:"run-maestro-compatibility-flows",text:"Run Maestro compatibility flows",depth:2,charIndex:1678},{id:"export-ad-scripts-to-maestro-yaml",text:"Export `.ad` scripts to Maestro YAML",depth:2,charIndex:4244},{id:"run-a-lightweight-ad-suite",text:"Run a lightweight `.ad` suite",depth:2,charIndex:6039},{id:"custom-test-reporters",text:"Custom test reporters",depth:3,charIndex:8819},{id:"parametrise-ad-scripts",text:"Parametrise `.ad` scripts",depth:2,charIndex:12389},{id:"precedence",text:"Precedence",depth:3,charIndex:12671},{id:"built-ins",text:"Built-ins",depth:3,charIndex:13e3},{id:"fallback-and-escape",text:"Fallback and escape",depth:3,charIndex:13728},{id:"recipes",text:"Recipes",depth:3,charIndex:13899},{id:"notes",text:"Notes",depth:3,charIndex:14559},{id:"replay-divergence-and-resume",text:"Replay divergence and resume",depth:2,charIndex:14833},{id:"resuming-a-failed-replay",text:"Resuming a failed replay",depth:3,charIndex:16073},{id:"--update-u-retired",text:"`--update`/`-u` (retired)",depth:2,charIndex:18250},{id:"troubleshooting",text:"Troubleshooting",depth:2,charIndex:18904}],frontmatter:{title:"Replay & E2E Testing"},version:"",_relativePath:"docs/replay-e2e.md",description:"Agents use refs for exploration and authoring. Replay scripts are deterministic runs that can be used for E2E testing."},{title:"Security & Trust",routePath:"/docs/security-trust",lang:"en",toc:[{id:"local-control",text:"Local control",depth:2,charIndex:248},{id:"daemon-trust-model",text:"Daemon trust model",depth:2,charIndex:780},{id:"sensitive-artifacts",text:"Sensitive artifacts",depth:2,charIndex:3717},{id:"permissions",text:"Permissions",depth:2,charIndex:4393},{id:"network-and-updates",text:"Network and updates",depth:2,charIndex:4906},{id:"responsible-disclosure",text:"Responsible disclosure",depth:2,charIndex:5274}],frontmatter:{title:"Security & Trust",description:"Security and trust guidance for agent-device local app automation, device permissions, screenshots, recordings, logs, network dumps, audio probes, traces, and reports."},version:"",_relativePath:"docs/security-trust.md",description:"Security and trust guidance for agent-device local app automation, device permissions, screenshots, recordings, logs, network dumps, audio probes, traces, and reports."},{title:"Selectors",routePath:"/docs/selectors",lang:"en",toc:[{id:"response-shape-click",text:"Response shape (click)",depth:2,charIndex:751}],frontmatter:{title:"Selectors"},version:"",_relativePath:"docs/selectors.md",description:'Use find to locate elements by semantic attributes instead of raw refs. Tips: Use find ... wait <timeoutMs> to wait for UI to appear.Combine with scoped snapshots using snapshot -s "<label>" for speed.[Android] If a matched node is not hittable, agent-device will click/focus the nearest hittable ancestor.Use fill when you want find-plus-targeted text replacement in one step. Use click or press plus type when you need append semantics in the focused field.'},{title:"Sessions",routePath:"/docs/sessions",lang:"en",toc:[],frontmatter:{title:"Sessions"},version:"",_relativePath:"docs/sessions.md",description:"Sessions keep device state and snapshots consistent across commands. The implicit default session is scoped to the caller's git worktree or current working directory. Independent agents in different worktrees do not attach to each other's default session. When a session is established, human output includes a Session state: <path> line and JSON output includes sessionStateDir; this is the per-session artifact directory that can be inspected or removed after the run. JSON output also includes runnerLogPath and requestLogPath when available. Session artifact directories contain per-run evidence for concurrent agents: requests/<request-id>.ndjson - daemon request diagnostics for this session.events.ndjson - session event timeline for requests and recorded actions; rotates to events.ndjson.1 past 5 MB (AGENT_DEVICE_EVENT_LOG_MAX_BYTES, whole bytes), with events.ndjson.window.json recording each retained generation's first absolute line index, line count, and first-line digest so events cursors stay absolute and are verified against the files on disk.runner.log - Apple runner and xcodebuild build/start output for this session.app.log - app/device logs when logs start or logs clear --restart is active. events.ndjson is privacy-shaped for automation timelines. It preserves command names, status, durations, bounded device/app inventory previews, lifecycle outcomes, artifact basenames, and structural action details such as scroll distance/direction, safe refs, and coordinates. User-entered text, clipboard contents, push/event payloads, selector values, free-form flags/messages/paths, and raw unknown command arguments are omitted or replaced with content-free placeholders. --no-record suppresses recorded action entries; request start/finish entries still record command, status, and timing. The top-level daemon log is for daemon lifecycle/startup issues. Use the session artifact directory first when debugging a specific run. Open an explicitly named session only when you intentionally want a shared/reusable handle: Shut down the simulator/emulator on close (Apple simulators and Android emulators, prevents resource leakage in CI/multi-tenant workloads): A never-booted iOS Simulator can take several minutes to finish its first boot. Give open (or prepare ios-runner) a startup budget that covers it; the session's device claim is held from the first open onward, so a competing workspace sees DEVICE_IN_USE throughout: Notes: open <app> within an existing session switches the active app and updates the session bundle id.open <url> in iOS sessions opens deep links.open <app> <url> in iOS sessions opens deep links.On iOS devices, http(s):// URLs open in Safari when no app is active. Custom scheme URLs require an active app in the session.On iOS, appstate is session-scoped and requires a matching active session on the target device.For remote connect --remote-config sessions, see Commands.Use --session <name> for intentional named-session sharing. Do not parallelize mutating commands against the same session; serialize stateful actions such as open, press, fill, type, scroll, back, alert, replay, batch, and close. For replay scripts and deterministic E2E guidance, see Replay & E2E."},{title:"Snapshots",routePath:"/docs/snapshots",lang:"en",toc:[{id:"efficient-snapshot-usage",text:"Efficient snapshot usage",depth:2,charIndex:2293},{id:"example-output",text:"Example output:",depth:2,charIndex:5592},{id:"ios-capture-behavior",text:"iOS capture behavior",depth:2,charIndex:5997},{id:"android-node-metadata",text:"Android node metadata",depth:2,charIndex:7947}],frontmatter:{title:"Snapshots"},version:"",_relativePath:"docs/snapshots.md",description:"Snapshots provide a structured view of the UI and generate current-screen refs. --actions constraints: iOS simulators only. Physical iOS devices, macOS, and Android targets reject the flag.It names the affordances an element merged away (iOS UIAccessibilityCustomAction, React Native accessibilityActions), so a card whose reply/options controls are not separate elements still lists them.The names are for planning and discovery, not invocation. There is no API to trigger one: reach the affordance through the element's detail screen, through the same control exposed as a labeled element elsewhere, or by coordinates from its rect.Each merged element costs one accessibility round trip, so the pass is opt-in and bounded. When it cannot read every candidate, the response says how many it read — an absent list on an unread element is not evidence that it has none.Mutually exclusive with --raw. Custom actions are only readable through the private-AX capture path, which the raw diagnostic strategy does not take, so the pair is rejected as INVALID_ARGS before any device work — on the CLI, the Node client, and MCP alike. Choose one or the other."},{title:"",routePath:"/",lang:"en",toc:[],frontmatter:{pageType:"home",hero:{name:"Agent-native app automation for mobile, TV, and desktop.",tagline:"agent-device gives coding agents structured UI access, deterministic interactions, and app-level evidence across mobile, TV, and desktop targets. Use it to verify generated code, debug broken flows, profile runtime behavior, and turn exploratory QA into replayable checks.",actions:[{theme:"brand",text:"Get Started",link:"/docs/agent-setup"},{theme:"alt",text:"Commands",link:"/docs/commands"}]},features:[{title:"One CLI, many app surfaces",details:"Control iOS, Android, tvOS, Android TV, Amazon Vega OS TV apps in the Vega Virtual Device, macOS, and Linux desktop targets through one CLI."},{title:"Accessibility-first snapshots",details:"On supported targets, accessibility trees give agents structured UI context without forcing screenshot-only reasoning."},{title:"Agent-native interactions",details:"Tap, pan, fling, pinch, rotate, scroll, focus, type, assert, and find visible UI through refs, selectors, and semantic finders."},{title:"Built-in debugging and profiling",details:"Use each target's supported backends to collect logs, inspect traffic, capture screens and recordings, and sample performance."},{title:"Session and replay",details:"Open apps, keep stateful context, and replay recorded `.ad` actions to reproduce flows without AI at runtime."},{title:"React Native internals",details:"Use agent-device react-devtools for component trees and render profiles, and agent-device cdp for React Native JS heap snapshots, diffs, and leak retainers."}]},version:"",_relativePath:"index.md"}]};n.d(t,{},{Y:a,z:{"###en":"1a44335f"}})},5302(e,t,n){n.d(t,{},{A:{github:'<svg xmlns="http://www.w3.org/2000/svg" width="100%" viewBox="0 0 24 24"><path fill="currentColor" d="M12 .297c-6.63 0-12 5.373-12 12c0 5.303 3.438 9.8 8.205 11.385c.6.113.82-.258.82-.577c0-.285-.01-1.04-.015-2.04c-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729c1.205.084 1.838 1.236 1.838 1.236c1.07 1.835 2.809 1.305 3.495.998c.108-.776.417-1.305.76-1.605c-2.665-.3-5.466-1.332-5.466-5.93c0-1.31.465-2.38 1.235-3.22c-.135-.303-.54-1.523.105-3.176c0 0 1.005-.322 3.3 1.23c.96-.267 1.98-.399 3-.405c1.02.006 2.04.138 3 .405c2.28-1.552 3.285-1.23 3.285-1.23c.645 1.653.24 2.873.12 3.176c.765.84 1.23 1.91 1.23 3.22c0 4.61-2.805 5.625-5.475 5.92c.42.36.81 1.096.81 2.22c0 1.606-.015 2.896-.015 3.286c0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"/></svg>',discord:'<svg xmlns="http://www.w3.org/2000/svg" width="100%" viewBox="0 0 24 24"><path fill="currentColor" d="M20.317 4.37a19.8 19.8 0 0 0-4.885-1.515a.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.3 18.3 0 0 0-5.487 0a13 13 0 0 0-.617-1.25a.08.08 0 0 0-.079-.037A19.7 19.7 0 0 0 3.677 4.37a.1.1 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.08.08 0 0 0 .031.057a19.9 19.9 0 0 0 5.993 3.03a.08.08 0 0 0 .084-.028a14 14 0 0 0 1.226-1.994a.076.076 0 0 0-.041-.106a13 13 0 0 1-1.872-.892a.077.077 0 0 1-.008-.128a10 10 0 0 0 .372-.292a.07.07 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.07.07 0 0 1 .078.01q.181.149.373.292a.077.077 0 0 1-.006.127a12.3 12.3 0 0 1-1.873.892a.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.08.08 0 0 0 .084.028a19.8 19.8 0 0 0 6.002-3.03a.08.08 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.06.06 0 0 0-.031-.03M8.02 15.33c-1.182 0-2.157-1.085-2.157-2.419c0-1.333.956-2.419 2.157-2.419c1.21 0 2.176 1.096 2.157 2.42c0 1.333-.956 2.418-2.157 2.418m7.975 0c-1.183 0-2.157-1.085-2.157-2.419c0-1.333.955-2.419 2.157-2.419c1.21 0 2.176 1.096 2.157 2.42c0 1.333-.946 2.418-2.157 2.418"/></svg>'}})},1642(e,t,n){n.d(t,{},{A:{languagesText:{en:"Languages"},themeText:{en:"Theme"},versionsText:{en:"Versions"},menuTitle:{en:"Menu"},outlineTitle:{en:"Contents"},scrollToTopText:{en:"Back to top"},lastUpdatedText:{en:"Last Updated"},prevPageText:{en:"Previous page"},nextPageText:{en:"Next page"},sourceCodeText:{en:"Source Code"},searchPlaceholderText:{en:"Search"},searchPanelCancelText:{en:"Cancel"},searchNoResultsText:{en:"No results found, try something different than"},searchSuggestedQueryText:{en:" "},"overview.filterNameText":{en:" "},"overview.filterPlaceholderText":{en:"Search API"},"overview.filterNoResultText":{en:"No matching API found"},openInText:{en:"Open in {{name}}"},copyMarkdownText:{en:"Copy Markdown"},copyMarkdownLinkText:{en:"Copy Markdown link"},editLinkText:{en:"Edit this page on GitHub"},codeButtonGroupCopyButtonText:{en:"Copy code"},notFoundText:{en:"PAGE NOT FOUND"},takeMeHomeText:{en:"Take me home"},promptCopyText:{en:"Copy Prompt"},promptCopiedText:{en:"Copied"},promptExpandText:{en:"Expand"},promptCollapseText:{en:"Collapse"}}})},2273(e,t,n){let a=[[n(6913).A,{}]];n.d(t,{},{A:a})},5904(e,t,n){n(2252)},7012(e,t,n){n.r(t),n.d(t,{},{onSearch:()=>{}})},7062(e,t,n){var a=n(5052),i=n(1554);let o=(0,i.YZ)(()=>n.e(837).then(n.bind(n,6244))),s=(0,i.YZ)(()=>n.e(656).then(n.bind(n,1499))),r=(0,i.YZ)(()=>n.e(924).then(n.bind(n,263))),d=(0,i.YZ)(()=>n.e(664).then(n.bind(n,6283))),c=(0,i.YZ)(()=>n.e(573).then(n.bind(n,3964))),l=(0,i.YZ)(()=>n.e(585).then(n.bind(n,6880))),h=(0,i.YZ)(()=>n.e(331).then(n.bind(n,1086))),p=(0,i.YZ)(()=>n.e(699).then(n.bind(n,9342))),u=(0,i.YZ)(()=>n.e(865).then(n.bind(n,7936))),m=(0,i.YZ)(()=>n.e(150).then(n.bind(n,9013))),g=(0,i.YZ)(()=>n.e(634).then(n.bind(n,6641))),x=(0,i.YZ)(()=>n.e(325).then(n.bind(n,4636))),f=(0,i.YZ)(()=>n.e(381).then(n.bind(n,8588))),v=(0,i.YZ)(()=>n.e(89).then(n.bind(n,4232))),b=(0,i.YZ)(()=>n.e(98).then(n.bind(n,7249))),I=(0,i.YZ)(()=>n.e(788).then(n.bind(n,9796))),y=(0,i.YZ)(()=>n.e(770).then(n.bind(n,7393))),w=(0,i.YZ)(()=>n.e(361).then(n.bind(n,6136))),k=(0,i.YZ)(()=>n.e(828).then(n.bind(n,2855))),C=(0,i.YZ)(()=>n.e(473).then(n.bind(n,2296))),P=(0,i.YZ)(()=>n.e(550).then(n.bind(n,5677))),S=(0,i.YZ)(()=>n.e(661).then(n.bind(n,1540))),A=(0,i.YZ)(()=>n.e(602).then(n.bind(n,753))),T=(0,i.YZ)(()=>n.e(536).then(n.bind(n,139))),E=(0,i.YZ)(()=>n.e(725).then(n.bind(n,5996))),O=[{path:"/404",element:a.createElement(o),filePath:"404.mdx",preload:async()=>(await o.preload(),n.e(837).then(n.bind(n,6244))),lang:"en",version:""},{path:"/docs/agent-setup",element:a.createElement(s),filePath:"docs/agent-setup.md",preload:async()=>(await s.preload(),n.e(656).then(n.bind(n,1499))),lang:"en",version:""},{path:"/docs/ai-sdk",element:a.createElement(r),filePath:"docs/ai-sdk.md",preload:async()=>(await r.preload(),n.e(924).then(n.bind(n,263))),lang:"en",version:""},{path:"/docs/aws-device-farm",element:a.createElement(d),filePath:"docs/aws-device-farm.md",preload:async()=>(await d.preload(),n.e(664).then(n.bind(n,6283))),lang:"en",version:""},{path:"/docs/batching",element:a.createElement(c),filePath:"docs/batching.md",preload:async()=>(await c.preload(),n.e(573).then(n.bind(n,3964))),lang:"en",version:""},{path:"/docs/browserstack",element:a.createElement(l),filePath:"docs/browserstack.md",preload:async()=>(await l.preload(),n.e(585).then(n.bind(n,6880))),lang:"en",version:""},{path:"/docs/client-api",element:a.createElement(h),filePath:"docs/client-api.md",preload:async()=>(await h.preload(),n.e(331).then(n.bind(n,1086))),lang:"en",version:""},{path:"/docs/commands",element:a.createElement(p),filePath:"docs/commands.md",preload:async()=>(await p.preload(),n.e(699).then(n.bind(n,9342))),lang:"en",version:""},{path:"/docs/configuration",element:a.createElement(u),filePath:"docs/configuration.md",preload:async()=>(await u.preload(),n.e(865).then(n.bind(n,7936))),lang:"en",version:""},{path:"/docs/debugging-profiling",element:a.createElement(m),filePath:"docs/debugging-profiling.md",preload:async()=>(await m.preload(),n.e(150).then(n.bind(n,9013))),lang:"en",version:""},{path:"/docs/device-clouds",element:a.createElement(g),filePath:"docs/device-clouds.md",preload:async()=>(await g.preload(),n.e(634).then(n.bind(n,6641))),lang:"en",version:""},{path:"/docs/eve",element:a.createElement(x),filePath:"docs/eve.md",preload:async()=>(await x.preload(),n.e(325).then(n.bind(n,4636))),lang:"en",version:""},{path:"/docs/installation",element:a.createElement(f),filePath:"docs/installation.md",preload:async()=>(await f.preload(),n.e(381).then(n.bind(n,8588))),lang:"en",version:""},{path:"/docs/introduction",element:a.createElement(v),filePath:"docs/introduction.md",preload:async()=>(await v.preload(),n.e(89).then(n.bind(n,4232))),lang:"en",version:""},{path:"/docs/known-limitations",element:a.createElement(b),filePath:"docs/known-limitations.md",preload:async()=>(await b.preload(),n.e(98).then(n.bind(n,7249))),lang:"en",version:""},{path:"/docs/limrun",element:a.createElement(I),filePath:"docs/limrun.md",preload:async()=>(await I.preload(),n.e(788).then(n.bind(n,9796))),lang:"en",version:""},{path:"/docs/migrating-gestures",element:a.createElement(y),filePath:"docs/migrating-gestures.md",preload:async()=>(await y.preload(),n.e(770).then(n.bind(n,7393))),lang:"en",version:""},{path:"/docs/quick-start",element:a.createElement(w),filePath:"docs/quick-start.md",preload:async()=>(await w.preload(),n.e(361).then(n.bind(n,6136))),lang:"en",version:""},{path:"/docs/remote-proxy",element:a.createElement(k),filePath:"docs/remote-proxy.md",preload:async()=>(await k.preload(),n.e(828).then(n.bind(n,2855))),lang:"en",version:""},{path:"/docs/replay-e2e",element:a.createElement(C),filePath:"docs/replay-e2e.md",preload:async()=>(await C.preload(),n.e(473).then(n.bind(n,2296))),lang:"en",version:""},{path:"/docs/security-trust",element:a.createElement(P),filePath:"docs/security-trust.md",preload:async()=>(await P.preload(),n.e(550).then(n.bind(n,5677))),lang:"en",version:""},{path:"/docs/selectors",element:a.createElement(S),filePath:"docs/selectors.md",preload:async()=>(await S.preload(),n.e(661).then(n.bind(n,1540))),lang:"en",version:""},{path:"/docs/sessions",element:a.createElement(A),filePath:"docs/sessions.md",preload:async()=>(await A.preload(),n.e(602).then(n.bind(n,753))),lang:"en",version:""},{path:"/docs/snapshots",element:a.createElement(T),filePath:"docs/snapshots.md",preload:async()=>(await T.preload(),n.e(536).then(n.bind(n,139))),lang:"en",version:""},{path:"/",element:a.createElement(E),filePath:"index.md",preload:async()=>(await E.preload(),n.e(725).then(n.bind(n,5996))),lang:"en",version:""}];n.d(t,{},{J:O})},6845(e,t,n){let a={base:"/agent-device/",title:"agent-device",description:"Mobile app automation and verification for AI coding agents through a CLI, MCP server, and typed Node.js API.",icon:"/logo.svg",route:{cleanUrls:!0},themeConfig:{enableContentAnimation:!0,enableScrollToTop:!1,footer:{message:"Copyright © 2026 Callstack"},editLink:{docRepoBaseUrl:"https://github.com/callstack/agent-device/edit/main/website"},socialLinks:[{icon:"github",mode:"link",content:"https://github.com/callstack/agent-device"},{icon:"discord",mode:"link",content:"https://discord.gg/eYapw6F3"}],locales:[],nav:{default:[{text:"Docs",link:"/docs/introduction.html",activeMatch:"^/docs/introduction"}]},sidebar:{"/public":[],"/docs":[{text:"Getting Started",items:[{text:"Introduction",link:"/docs/introduction.html"},{text:"Installation",link:"/docs/installation.html"},{text:"AI Agent Setup",link:"/docs/agent-setup.html"},{text:"Quick Start",link:"/docs/quick-start.html"}],collapsed:!1,collapsible:!1},{text:"Using agent-device",items:[{text:"Commands",link:"/docs/commands.html"},{text:"Configuration",link:"/docs/configuration.html"},{text:"Selectors",link:"/docs/selectors.html"},{text:"Sessions",link:"/docs/sessions.html"},{text:"Batching",link:"/docs/batching.html"},{text:"Snapshots",link:"/docs/snapshots.html"},{text:"Replay & E2E testing",link:"/docs/replay-e2e.html"},{text:"Debugging & Profiling",link:"/docs/debugging-profiling.html"}],collapsed:!1,collapsible:!1},{text:"Integrations",items:[{text:"Node.js API",link:"/docs/client-api.html"},{text:"AI SDK",link:"/docs/ai-sdk.html"},{text:"Eve",link:"/docs/eve.html"},{text:"Remote Proxy",link:"/docs/remote-proxy.html"},{text:"Device Clouds",link:"/docs/device-clouds.html"},{text:"BrowserStack",link:"/docs/browserstack.html"},{text:"AWS Device Farm",link:"/docs/aws-device-farm.html"},{text:"Limrun",link:"/docs/limrun.html"}],collapsed:!1,collapsible:!1},{text:"Reference",items:[{text:"Security & Trust",link:"/docs/security-trust.html"},{text:"Known Limitations",link:"/docs/known-limitations.html"},{text:"Migrating Gestures",link:"/docs/migrating-gestures.html"}],collapsed:!1,collapsible:!1}]}},lang:"en",locales:[],logo:{light:"/logo-light.svg",dark:"/logo-dark.svg"},logoText:"",logoHref:"",multiVersion:{default:"",versions:[]},search:{versioned:!0,codeBlocks:!0},markdown:{showLineNumbers:!1,defaultWrapCode:!1,shiki:{}}};n.d(t,{},{A:a})}},d={};function c(e){var t=d[e];if(void 0!==t)return t.exports;var n=d[e]={exports:{}};return r[e].call(n.exports,n,n.exports,c),n.exports}c.m=r,c.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return c.d(t,{a:t}),t},t=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,c.t=function(n,a){if(1&a&&(n=this(n)),8&a||"object"==typeof n&&n&&(4&a&&n.__esModule||16&a&&"function"==typeof n.then))return n;var i=Object.create(null);c.r(i);var o={};e=e||[null,t({}),t([]),t(t)];for(var s=2&a&&n;("object"==typeof s||"function"==typeof s)&&!~e.indexOf(s);s=t(s))Object.getOwnPropertyNames(s).forEach(e=>{o[e]=()=>n[e]});return o.default=()=>n,c.d(i,o),i},c.d=(e,t,n)=>{var a=(t,n)=>{for(var a in t)c.o(t,a)&&!c.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,[n]:t[a]})};a(t,"get"),a(n,"value")},c.f={},c.e=e=>Promise.all(Object.keys(c.f).reduce((t,n)=>(c.f[n](e,t),t),[])),c.u=e=>"static/js/async/"+e+"."+({150:"b168ace351",193:"f95658c809",325:"0b6ccea848",331:"07da039196",361:"aca30fb36e",381:"46bacaca08",473:"9923519a80",536:"e98ee88fb2",550:"9037d1023c",573:"74ce3e6bad",585:"57b66e519a",602:"7227cc1afc",634:"0767b6920a",656:"fe5f384edf",661:"bd36debad5",664:"a48fb2f76b",699:"5c5f5789ae",725:"dec927b4b0",770:"0ebc26736f",788:"2461a11db8",828:"acf286b8a4",837:"fc57098390",865:"5f595c6704",89:"012de4481c",924:"dcba62e949",98:"0557c4d951"})[e]+".js",c.miniCssF=e=>""+e+".css",c.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n={},c.l=function(e,t,a,i){if(n[e])return void n[e].push(t);if(void 0!==a)for(var o,s,r=document.getElementsByTagName("script"),d=0;d<r.length;d++){var l=r[d];if(l.getAttribute("src")==e||l.getAttribute("data-rspack")=="agent-device-docs:"+a){o=l;break}}o||(s=!0,(o=document.createElement("script")).timeout=120,c.nc&&o.setAttribute("nonce",c.nc),o.setAttribute("data-rspack","agent-device-docs:"+a),o.src=e),n[e]=[t];var h=function(t,a){o.onerror=o.onload=null,clearTimeout(p);var i=n[e];if(delete n[e],o.parentNode&&o.parentNode.removeChild(o),i&&i.forEach(function(e){return e(a)}),t)return t(a)},p=setTimeout(h.bind(null,void 0,{type:"timeout",target:o}),12e4);o.onerror=h.bind(null,o.onerror),o.onload=h.bind(null,o.onload),s&&document.head.appendChild(o)},c.r=e=>{"u">typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},a=[],c.O=(e,t,n,i)=>{if(t){i=i||0;for(var o=a.length;o>0&&a[o-1][2]>i;o--)a[o]=a[o-1];a[o]=[t,n,i];return}for(var s=1/0,o=0;o<a.length;o++){for(var[t,n,i]=a[o],r=!0,d=0;d<t.length;d++)(!1&i||s>=i)&&Object.keys(c.O).every(e=>c.O[e](t[d]))?t.splice(d--,1):(r=!1,i<s&&(s=i));if(r){a.splice(o--,1);var l=n();void 0!==l&&(e=l)}}return e},c.p="/agent-device/",i={410:0},c.f.j=function(e,t){var n=c.o(i,e)?i[e]:void 0;if(0!==n)if(n)t.push(n[2]);else{var a=new Promise((t,a)=>n=i[e]=[t,a]);t.push(n[2]=a);var o=c.p+c.u(e),s=Error();c.l(o,function(t){if(c.o(i,e)&&(0!==(n=i[e])&&(i[e]=void 0),n)){var a=t&&("load"===t.type?"missing":t.type),o=t&&t.target&&t.target.src;s.message="Loading chunk "+e+" failed.\n("+a+": "+o+")",s.name="ChunkLoadError",s.type=a,s.request=o,n[1](s)}},"chunk-"+e,e)}},c.O.j=e=>0===i[e],o=(e,t)=>{var n,a,[o,s,r]=t,d=0;if(o.some(e=>0!==i[e])){for(n in s)c.o(s,n)&&(c.m[n]=s[n]);if(r)var l=r(c)}for(e&&e(t);d<o.length;d++)a=o[d],c.o(i,a)&&i[a]&&i[a][0](),i[a]=0;return c.O(l)},(s=self.rspackChunkagent_device_docs=self.rspackChunkagent_device_docs||[]).forEach(o.bind(null,0)),s.push=o.bind(null,s.push.bind(s)),c.O(void 0,["14","783","535","476"],()=>c(1039)),c.O(void 0,["14","783","535","476"],()=>c(5904)),c.O(void 0,["14","783","535","476"],()=>c(3456));var l=c.O(void 0,["14","783","535","476"],()=>c(1820));l=c.O(l)})(); |