[INFO] fetching crate egui_mcp 0.1.0...
[INFO] testing egui_mcp-0.1.0 against 1.97.0-beta.6 for beta-1.98-1
[INFO] extracting crate egui_mcp 0.1.0 into /workspace/builds/worker-4-tc1/source
[INFO] started tweaking crates.io crate egui_mcp 0.1.0
[INFO] finished tweaking crates.io crate egui_mcp 0.1.0
[INFO] tweaked toml for crates.io crate egui_mcp 0.1.0 written to /workspace/builds/worker-4-tc1/source/Cargo.toml
[INFO] validating manifest of crates.io crate egui_mcp 0.1.0 on toolchain 1.97.0-beta.6
[INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+1.97.0-beta.6" "metadata" "--manifest-path" "Cargo.toml" "--no-deps", kill_on_drop: false }`
[INFO] crate crates.io crate egui_mcp 0.1.0 already has a lockfile, it will not be regenerated
[INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+1.97.0-beta.6" "fetch" "--manifest-path" "Cargo.toml", kill_on_drop: false }`
[INFO] [stderr]     Blocking waiting for file lock on package cache
[INFO] [stderr]     Updating crates.io index
[INFO] [stderr]  Downloading crates ...
[INFO] [stderr]   Downloaded tracing-log v0.2.0
[INFO] [stderr]   Downloaded nu-ansi-term v0.50.3
[INFO] [stderr]   Downloaded valuable v0.1.1
[INFO] [stderr]   Downloaded ref-cast-impl v1.0.25
[INFO] [stderr]   Downloaded wasm-bindgen-shared v0.2.125
[INFO] [stderr]   Downloaded futures-sink v0.3.32
[INFO] [stderr]   Downloaded ref-cast v1.0.25
[INFO] [stderr]   Downloaded futures-io v0.3.32
[INFO] [stderr]   Downloaded dyn-clone v1.0.20
[INFO] [stderr]   Downloaded profiling v1.0.18
[INFO] [stderr]   Downloaded wasm-bindgen-macro v0.2.125
[INFO] [stderr]   Downloaded schemars_derive v1.2.1
[INFO] [stderr]   Downloaded rmcp-macros v1.7.0
[INFO] [stderr]   Downloaded pastey v0.2.3
[INFO] [stderr]   Downloaded futures-executor v0.3.32
[INFO] [stderr]   Downloaded peniko v0.6.1
[INFO] [stderr]   Downloaded serde_derive_internals v0.29.1
[INFO] [stderr]   Downloaded egui_inspection v0.35.0
[INFO] [stderr]   Downloaded polycool v0.4.0
[INFO] [stderr]   Downloaded guillotiere v0.7.0
[INFO] [stderr]   Downloaded ecolor v0.35.0
[INFO] [stderr]   Downloaded bytes v1.12.0
[INFO] [stderr]   Downloaded accesskit_consumer v0.37.0
[INFO] [stderr]   Downloaded futures-channel v0.3.32
[INFO] [stderr]   Downloaded arrayvec v0.7.7
[INFO] [stderr]   Downloaded emath v0.35.0
[INFO] [stderr]   Downloaded console v0.16.3
[INFO] [stderr]   Downloaded rmp-serde v1.3.1
[INFO] [stderr]   Downloaded rmp v0.8.15
[INFO] [stderr]   Downloaded accesskit v0.24.1
[INFO] [stderr]   Downloaded futures v0.3.32
[INFO] [stderr]   Downloaded unicode-general-category v1.1.0
[INFO] [stderr]   Downloaded glifo v0.1.1
[INFO] [stderr]   Downloaded uuid v1.23.3
[INFO] [stderr]   Downloaded tracing-subscriber v0.3.23
[INFO] [stderr]   Downloaded wasm-bindgen v0.2.125
[INFO] [stderr]   Downloaded color v0.3.3
[INFO] [stderr]   Downloaded schemars v1.2.1
[INFO] [stderr]   Downloaded wasm-bindgen-macro-support v0.2.125
[INFO] [stderr]   Downloaded similar v2.7.0
[INFO] [stderr]   Downloaded unicode-segmentation v1.13.3
[INFO] [stderr]   Downloaded vello_cpu v0.0.9
[INFO] [stderr]   Downloaded js-sys v0.3.102
[INFO] [stderr]   Downloaded insta v1.48.0
[INFO] [stderr]   Downloaded epaint v0.35.0
[INFO] [stderr]   Downloaded vello_common v0.0.9
[INFO] [stderr]   Downloaded tokio-util v0.7.18
[INFO] [stderr]   Downloaded kurbo v0.13.1
[INFO] [stderr]   Downloaded harfrust v0.7.0
[INFO] [stderr]   Downloaded fearless_simd v0.4.1
[INFO] [stderr]   Downloaded skrifa v0.42.1
[INFO] [stderr]   Downloaded rmcp v1.7.0
[INFO] [stderr]   Downloaded egui v0.35.0
[INFO] [stderr]   Downloaded read-fonts v0.39.2
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-4-tc1/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-4-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-m" "1610612736" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:3d5ced03c013a94a2f102a4510f48a6e9184255caf5fd8244f58017bde7f5210" "sleep" "infinity", kill_on_drop: false }`
[INFO] [stdout] 8339667d9949e05d44cee69c20d1d221004e7ce1158c8b3f35800e2739d1da5c
[INFO] running `Command { std: "docker" "start" "8339667d9949e05d44cee69c20d1d221004e7ce1158c8b3f35800e2739d1da5c", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "inspect" "8339667d9949e05d44cee69c20d1d221004e7ce1158c8b3f35800e2739d1da5c", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-w" "/opt/rustwide/workdir" "--user" "0:0" "8339667d9949e05d44cee69c20d1d221004e7ce1158c8b3f35800e2739d1da5c" "/opt/rustwide/cargo-home/bin/cargo" "+1.97.0-beta.6" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "inspect" "8339667d9949e05d44cee69c20d1d221004e7ce1158c8b3f35800e2739d1da5c", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=warn" "-e" "RUSTDOCFLAGS=--cap-lints=warn" "-w" "/opt/rustwide/workdir" "--user" "0:0" "8339667d9949e05d44cee69c20d1d221004e7ce1158c8b3f35800e2739d1da5c" "/opt/rustwide/cargo-home/bin/cargo" "+1.97.0-beta.6" "build" "--frozen" "--message-format=json", kill_on_drop: false }`
[INFO] [stderr]    Compiling proc-macro2 v1.0.106
[INFO] [stderr]    Compiling quote v1.0.46
[INFO] [stderr]    Compiling unicode-ident v1.0.24
[INFO] [stderr]    Compiling serde_core v1.0.228
[INFO] [stderr]    Compiling serde v1.0.228
[INFO] [stderr]    Compiling autocfg v1.5.1
[INFO] [stderr]    Compiling libc v0.2.186
[INFO] [stderr]    Compiling once_cell v1.21.4
[INFO] [stderr]    Compiling foldhash v0.2.0
[INFO] [stderr]    Compiling cfg-if v1.0.4
[INFO] [stderr]    Compiling thiserror v2.0.18
[INFO] [stderr]    Compiling pin-project-lite v0.2.17
[INFO] [stderr]    Compiling arrayvec v0.7.7
[INFO] [stderr]    Compiling zmij v1.0.21
[INFO] [stderr]    Compiling log v0.4.33
[INFO] [stderr]    Compiling futures-core v0.3.32
[INFO] [stderr]    Compiling futures-sink v0.3.32
[INFO] [stderr]    Compiling linebender_resource_handle v0.1.1
[INFO] [stderr]    Compiling zerocopy v0.8.52
[INFO] [stderr]    Compiling memchr v2.8.2
[INFO] [stderr]    Compiling parking_lot_core v0.9.12
[INFO] [stderr]    Compiling version_check v0.9.5
[INFO] [stderr]    Compiling polycool v0.4.0
[INFO] [stderr]    Compiling hashbrown v0.17.1
[INFO] [stderr]    Compiling strsim v0.11.1
[INFO] [stderr]    Compiling fearless_simd v0.4.1
[INFO] [stderr]    Compiling ident_case v1.0.1
[INFO] [stderr]    Compiling itoa v1.0.18
[INFO] [stderr]    Compiling num-traits v0.2.19
[INFO] [stderr]    Compiling unicode-general-category v1.1.0
[INFO] [stderr]    Compiling ahash v0.8.12
[INFO] [stderr]    Compiling scopeguard v1.2.0
[INFO] [stderr]    Compiling lock_api v0.4.14
[INFO] [stderr]    Compiling tracing-core v0.1.36
[INFO] [stderr]    Compiling futures-channel v0.3.32
[INFO] [stderr]    Compiling ref-cast v1.0.25
[INFO] [stderr]    Compiling futures-task v0.3.32
[INFO] [stderr]    Compiling serde_json v1.0.150
[INFO] [stderr]    Compiling futures-io v0.3.32
[INFO] [stderr]    Compiling bitflags v2.13.0
[INFO] [stderr]    Compiling slab v0.4.12
[INFO] [stderr]    Compiling unicode-segmentation v1.13.3
[INFO] [stderr]    Compiling nohash-hasher v0.2.0
[INFO] [stderr]    Compiling bytes v1.12.0
[INFO] [stderr]    Compiling regex-syntax v0.8.11
[INFO] [stderr]    Compiling profiling v1.0.18
[INFO] [stderr]    Compiling self_cell v1.2.2
[INFO] [stderr]    Compiling either v1.16.0
[INFO] [stderr]    Compiling syn v2.0.118
[INFO] [stderr]    Compiling euclid v0.22.14
[INFO] [stderr]    Compiling rmp v0.8.15
[INFO] [stderr]    Compiling dyn-clone v1.0.20
[INFO] [stderr]    Compiling rmcp v1.7.0
[INFO] [stderr]    Compiling sharded-slab v0.1.7
[INFO] [stderr]    Compiling tracing-log v0.2.0
[INFO] [stderr]    Compiling hashbrown v0.16.1
[INFO] [stderr]    Compiling itertools v0.14.0
[INFO] [stderr]    Compiling guillotiere v0.7.0
[INFO] [stderr]    Compiling thread_local v1.1.9
[INFO] [stderr]    Compiling nu-ansi-term v0.50.3
[INFO] [stderr]    Compiling pastey v0.2.3
[INFO] [stderr]    Compiling errno v0.3.14
[INFO] [stderr]    Compiling socket2 v0.6.4
[INFO] [stderr]    Compiling mio v1.2.1
[INFO] [stderr]    Compiling signal-hook-registry v1.4.8
[INFO] [stderr]    Compiling regex-automata v0.4.14
[INFO] [stderr]    Compiling uuid v1.23.3
[INFO] [stderr]    Compiling serde_bytes v0.11.19
[INFO] [stderr]    Compiling matchers v0.2.0
[INFO] [stderr]    Compiling darling_core v0.23.0
[INFO] [stderr]    Compiling serde_derive_internals v0.29.1
[INFO] [stderr]    Compiling serde_derive v1.0.228
[INFO] [stderr]    Compiling bytemuck_derive v1.10.2
[INFO] [stderr]    Compiling thiserror-impl v2.0.18
[INFO] [stderr]    Compiling enumn v0.1.14
[INFO] [stderr]    Compiling futures-macro v0.3.32
[INFO] [stderr]    Compiling tracing-attributes v0.1.31
[INFO] [stderr]    Compiling ref-cast-impl v1.0.25
[INFO] [stderr]    Compiling tokio-macros v2.7.0
[INFO] [stderr]    Compiling async-trait v0.1.89
[INFO] [stderr]    Compiling schemars_derive v1.2.1
[INFO] [stderr]    Compiling tokio v1.52.3
[INFO] [stderr]    Compiling futures-util v0.3.32
[INFO] [stderr]    Compiling tracing v0.1.44
[INFO] [stderr]    Compiling bytemuck v1.25.0
[INFO] [stderr]    Compiling color v0.3.3
[INFO] [stderr]    Compiling darling_macro v0.23.0
[INFO] [stderr]    Compiling darling v0.23.0
[INFO] [stderr]    Compiling rmcp-macros v1.7.0
[INFO] [stderr]    Compiling futures-executor v0.3.32
[INFO] [stderr]    Compiling futures v0.3.32
[INFO] [stderr]    Compiling smallvec v1.15.2
[INFO] [stderr]    Compiling font-types v0.11.3
[INFO] [stderr]    Compiling emath v0.35.0
[INFO] [stderr]    Compiling accesskit v0.24.1
[INFO] [stderr]    Compiling chrono v0.4.45
[INFO] [stderr]    Compiling rmp-serde v1.3.1
[INFO] [stderr]    Compiling kurbo v0.13.1
[INFO] [stderr]    Compiling tracing-subscriber v0.3.23
[INFO] [stderr]    Compiling parking_lot v0.12.5
[INFO] [stderr]    Compiling read-fonts v0.39.2
[INFO] [stderr]    Compiling ecolor v0.35.0
[INFO] [stderr]    Compiling peniko v0.6.1
[INFO] [stderr]    Compiling accesskit_consumer v0.37.0
[INFO] [stderr]    Compiling vello_common v0.0.9
[INFO] [stderr]    Compiling tokio-util v0.7.18
[INFO] [stderr]    Compiling schemars v1.2.1
[INFO] [stderr]    Compiling vello_cpu v0.0.9
[INFO] [stderr]    Compiling skrifa v0.42.1
[INFO] [stderr]    Compiling harfrust v0.7.0
[INFO] [stderr]    Compiling epaint v0.35.0
[INFO] [stderr]    Compiling egui v0.35.0
[INFO] [stderr]    Compiling egui_inspection v0.35.0
[INFO] [stderr]    Compiling egui_mcp v0.1.0 (/opt/rustwide/workdir)
[INFO] [stderr]     Finished `dev` profile [unoptimized + debuginfo] target(s) in 1m 37s
[INFO] running `Command { std: "docker" "inspect" "8339667d9949e05d44cee69c20d1d221004e7ce1158c8b3f35800e2739d1da5c", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=warn" "-e" "RUSTDOCFLAGS=--cap-lints=warn" "-w" "/opt/rustwide/workdir" "--user" "0:0" "8339667d9949e05d44cee69c20d1d221004e7ce1158c8b3f35800e2739d1da5c" "/opt/rustwide/cargo-home/bin/cargo" "+1.97.0-beta.6" "test" "--frozen" "--no-run" "--message-format=json", kill_on_drop: false }`
[INFO] [stderr]    Compiling bitflags v2.13.0
[INFO] [stderr]    Compiling rustix v1.1.4
[INFO] [stderr]    Compiling getrandom v0.4.3
[INFO] [stderr]    Compiling linux-raw-sys v0.12.1
[INFO] [stderr]    Compiling fastrand v2.4.1
[INFO] [stderr]    Compiling console v0.16.3
[INFO] [stderr]    Compiling similar v2.7.0
[INFO] [stderr]    Compiling harfrust v0.7.0
[INFO] [stderr]    Compiling tempfile v3.27.0
[INFO] [stderr]    Compiling insta v1.48.0
[INFO] [stderr]    Compiling epaint v0.35.0
[INFO] [stderr]    Compiling egui v0.35.0
[INFO] [stderr]    Compiling egui_inspection v0.35.0
[INFO] [stderr]    Compiling egui_mcp v0.1.0 (/opt/rustwide/workdir)
[INFO] [stderr]     Finished `test` profile [unoptimized + debuginfo] target(s) in 33.50s
[INFO] running `Command { std: "docker" "inspect" "8339667d9949e05d44cee69c20d1d221004e7ce1158c8b3f35800e2739d1da5c", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=warn" "-e" "RUSTDOCFLAGS=--cap-lints=warn" "-w" "/opt/rustwide/workdir" "--user" "0:0" "8339667d9949e05d44cee69c20d1d221004e7ce1158c8b3f35800e2739d1da5c" "/opt/rustwide/cargo-home/bin/cargo" "+1.97.0-beta.6" "test" "--frozen", kill_on_drop: false }`
[INFO] [stderr]     Finished `test` profile [unoptimized + debuginfo] target(s) in 0.25s
[INFO] [stderr]      Running unittests src/lib.rs (/opt/rustwide/target/debug/deps/egui_mcp-d76e3bafdddc2189)
[INFO] [stdout] 
[INFO] [stdout] running 1 test
[INFO] [stdout] test tools::tests::agent_surface_snapshot ... FAILED
[INFO] [stderr] error: test failed, to rerun pass `--lib`
[INFO] [stdout] 
[INFO] [stdout] failures:
[INFO] [stdout] 
[INFO] [stdout] ---- tools::tests::agent_surface_snapshot stdout ----
[INFO] [stdout] ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Snapshot Summary ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[INFO] [stdout] Snapshot file: src/snapshots/egui_mcp__tools__tests__agent_surface.snap
[INFO] [stdout] Snapshot: agent_surface
[INFO] [stdout] Source: src/tools.rs:1088
[INFO] [stdout] ────────────────────────────────────────────────────────────────────────────────
[INFO] [stdout] Expression: surface
[INFO] [stdout] ────────────────────────────────────────────────────────────────────────────────
[INFO] [stdout] +new results
[INFO] [stdout] ────────────┬───────────────────────────────────────────────────────────────────
[INFO] [stdout]           1 │+# Server instructions
[INFO] [stdout]           2 │+
[INFO] [stdout]           3 │+This mcp drives a live egui app: it reads the app's accessibility tree and synthesizes real input events. Work in an observe → act → verify loop.
[INFO] [stdout]           4 │+
[INFO] [stdout]           5 │+Getting oriented:
[INFO] [stdout]           6 │+- Call `attach` first (check `status` if unsure); the app-driving tools return "no app connected" until then.
[INFO] [stdout]           7 │+- Start most tasks with `query_tree` to discover widgets and their ids, and/or `screenshot` to see the rendered frame.
[INFO] [stdout]           8 │+
[INFO] [stdout]           9 │+Targeting widgets:
[INFO] [stdout]          10 │+- Prefer locators — an `id` from `query_tree`, a `role`, or a text match — over a raw `pos`. Locators resolve to the widget's current position and survive layout changes; reach for `pos` only when nothing matches.
[INFO] [stdout]          11 │+- For text matches prefer `content_contains`: it matches a node's `label` (accessible name) OR its `value`. This matters because many widgets (`Label`, monospace text, counters) carry their text in `value` with an empty `label`, so `label_contains` alone silently misses them. Use `label_contains`/`value_contains` only when you specifically need to match one field.
[INFO] [stdout]          12 │+- A locator in an action must match exactly one node. If it matches several, the call errors and lists the candidates — narrow the filter (add a `role`, or switch to a more specific text match) or target a specific `id`. Use `query_tree` when you want every match.
[INFO] [stdout]          13 │+
[INFO] [stdout]          14 │+Acting and verifying:
[INFO] [stdout]          15 │+- After an action that changes the UI, confirm it landed: `query_tree` for the expected state, `screenshot` to look, or `wait_for` to poll until async or animated UI settles.
[INFO] [stdout]          16 │+- Use `batch` to act and observe in one round trip (e.g. `click` then `screenshot`), avoiding an extra turn.
[INFO] [stdout]          17 │+
[INFO] [stdout]          18 │+Conventions:
[INFO] [stdout]          19 │+- Everything is in logical points, one shared coordinate frame: raw `pos`, `resize` dimensions, the `bounds` from `query_tree`/`get_node`, and a default (`pixels_per_point: 1.0`) `screenshot`. So a node's `bounds` center is exactly where to `click`, and a pixel in the screenshot is a logical point. There is no fixed screen size; use `resize` to set the viewport.
[INFO] [stdout]          20 │+
[INFO] [stdout]          21 │+# Tools
[INFO] [stdout]          22 │+
[INFO] [stdout]          23 │+## attach
[INFO] [stdout]          24 │+
[INFO] [stdout]          25 │+{
[INFO] [stdout]          26 │+  "name": "attach",
[INFO] [stdout]          27 │+  "description": "Connect to a running egui app's inspection port (an app built with eframe's `inspection` feature, launched with `EGUI_INSPECTION` set).\nDefaults to 127.0.0.1:5719.\nRetries until `timeout_secs` elapses.\nOn success the app-driving tools start working (they are always listed, but error until an app is attached).",
[INFO] [stdout]          28 │+  "inputSchema": {
[INFO] [stdout]          29 │+    "$schema": "https://json-schema.org/draft/2020-12/schema",
[INFO] [stdout]          30 │+    "properties": {
[INFO] [stdout]          31 │+      "host": {
[INFO] [stdout]          32 │+        "default": "127.0.0.1",
[INFO] [stdout]          33 │+        "description": "Host the app's inspection port is on.\nDefaults to `127.0.0.1`.",
[INFO] [stdout]          34 │+        "type": "string"
[INFO] [stdout]          35 │+      },
[INFO] [stdout]          36 │+      "port": {
[INFO] [stdout]          37 │+        "default": 5719,
[INFO] [stdout]          38 │+        "description": "Port the app is listening on.\nDefaults to `5719` (`egui_inspection`'s default).",
[INFO] [stdout]          39 │+        "format": "uint16",
[INFO] [stdout]          40 │+        "maximum": 65535,
[INFO] [stdout]          41 │+        "minimum": 0,
[INFO] [stdout]          42 │+        "type": "integer"
[INFO] [stdout]          43 │+      },
[INFO] [stdout]          44 │+      "timeout_secs": {
[INFO] [stdout]          45 │+        "default": null,
[INFO] [stdout]          46 │+        "description": "How long to keep retrying the connection, in seconds.\nDefaults to 10.",
[INFO] [stdout]          47 │+        "format": "uint64",
[INFO] [stdout]          48 │+        "minimum": 0,
[INFO] [stdout]          49 │+        "type": [
[INFO] [stdout]          50 │+          "integer",
[INFO] [stdout]          51 │+          "null"
[INFO] [stdout]          52 │+        ]
[INFO] [stdout]          53 │+      }
[INFO] [stdout]          54 │+    },
[INFO] [stdout]          55 │+    "title": "AttachArgs",
[INFO] [stdout]          56 │+    "type": "object"
[INFO] [stdout]          57 │+  }
[INFO] [stdout]          58 │+}
[INFO] [stdout]          59 │+
[INFO] [stdout]          60 │+## batch
[INFO] [stdout]          61 │+
[INFO] [stdout]          62 │+{
[INFO] [stdout]          63 │+  "name": "batch",
[INFO] [stdout]          64 │+  "description": "Execute a sequence of app-driving tool calls in one round trip (the connection tools `attach`/`disconnect`/`status` are not available here).\nStops on the first error.\nResults are emitted in execution order, interleaved: each step contributes one JSON text item followed by any image items it produced (e.g. screenshots).\n`batch` cannot be nested.\nUse this to act and observe in one call, e.g. a `click` then a `query_tree` or `screenshot`.",
[INFO] [stdout]          65 │+  "inputSchema": {
[INFO] [stdout]          66 │+    "$defs": {
[INFO] [stdout]          67 │+      "BatchAction": {
[INFO] [stdout]          68 │+        "properties": {
[INFO] [stdout]          69 │+          "args": {
[INFO] [stdout]          70 │+            "additionalProperties": true,
[INFO] [stdout]          71 │+            "default": null,
[INFO] [stdout]          72 │+            "type": "object"
[INFO] [stdout]          73 │+          },
[INFO] [stdout]          74 │+          "name": {
[INFO] [stdout]          75 │+            "type": "string"
[INFO] [stdout]          76 │+          }
[INFO] [stdout]          77 │+        },
[INFO] [stdout]          78 │+        "required": [
[INFO] [stdout]          79 │+          "name"
[INFO] [stdout]          80 │+        ],
[INFO] [stdout]          81 │+        "type": "object"
[INFO] [stdout]          82 │+      }
[INFO] [stdout]          83 │+    },
[INFO] [stdout]          84 │+    "$schema": "https://json-schema.org/draft/2020-12/schema",
[INFO] [stdout]          85 │+    "properties": {
[INFO] [stdout]          86 │+      "actions": {
[INFO] [stdout]          87 │+        "items": {
[INFO] [stdout]          88 │+          "$ref": "#/$defs/BatchAction"
[INFO] [stdout]          89 │+        },
[INFO] [stdout]          90 │+        "type": "array"
[INFO] [stdout]          91 │+      }
[INFO] [stdout]          92 │+    },
[INFO] [stdout]          93 │+    "required": [
[INFO] [stdout]          94 │+      "actions"
[INFO] [stdout]          95 │+    ],
[INFO] [stdout]          96 │+    "title": "BatchArgs",
[INFO] [stdout]          97 │+    "type": "object"
[INFO] [stdout]          98 │+  }
[INFO] [stdout]          99 │+}
[INFO] [stdout]         100 │+
[INFO] [stdout]         101 │+## click
[INFO] [stdout]         102 │+
[INFO] [stdout]         103 │+{
[INFO] [stdout]         104 │+  "name": "click",
[INFO] [stdout]         105 │+  "description": "Click the center of a node's bounding box, or a raw `pos` in logical points.\nSpecify either a locator (`id` from `query_tree`, `role`, or a text match — prefer `content_contains`, which matches `label` or `value`; `label_contains`/`value_contains` match just one field) or `pos: { x, y }`.\n`button` defaults to `primary` (accepts `primary`/`secondary`/`middle`/`extra1`/`extra2`, or aliases `left`/`right`).\n`count: 2` → double-click, `3` → triple.",
[INFO] [stdout]         106 │+  "inputSchema": {
[INFO] [stdout]         107 │+    "$defs": {
[INFO] [stdout]         108 │+      "PointerButtonArg": {
[INFO] [stdout]         109 │+        "description": "Which mouse button a `click`/`drag` uses. `left`/`right` are accepted as aliases for\n`primary`/`secondary`.",
[INFO] [stdout]         110 │+        "enum": [
[INFO] [stdout]         111 │+          "primary",
[INFO] [stdout]         112 │+          "secondary",
[INFO] [stdout]         113 │+          "middle",
[INFO] [stdout]         114 │+          "extra1",
[INFO] [stdout]         115 │+          "extra2"
[INFO] [stdout]         116 │+        ],
[INFO] [stdout]         117 │+        "type": "string"
[INFO] [stdout]         118 │+      },
[INFO] [stdout]         119 │+      "Pos2Lit": {
[INFO] [stdout]         120 │+        "properties": {
[INFO] [stdout]         121 │+          "x": {
[INFO] [stdout]         122 │+            "format": "float",
[INFO] [stdout]         123 │+            "type": "number"
[INFO] [stdout]         124 │+          },
[INFO] [stdout]         125 │+          "y": {
[INFO] [stdout]         126 │+            "format": "float",
[INFO] [stdout]         127 │+            "type": "number"
[INFO] [stdout]         128 │+          }
[INFO] [stdout]         129 │+        },
[INFO] [stdout]         130 │+        "required": [
[INFO] [stdout]         131 │+          "x",
[INFO] [stdout]         132 │+          "y"
[INFO] [stdout]         133 │+        ],
[INFO] [stdout]         134 │+        "type": "object"
[INFO] [stdout]         135 │+      },
[INFO] [stdout]         136 │+      "PressKeyModifiers": {
[INFO] [stdout]         137 │+        "properties": {
[INFO] [stdout]         138 │+          "alt": {
[INFO] [stdout]         139 │+            "default": false,
[INFO] [stdout]         140 │+            "type": "boolean"
[INFO] [stdout]         141 │+          },
[INFO] [stdout]         142 │+          "command": {
[INFO] [stdout]         143 │+            "default": false,
[INFO] [stdout]         144 │+            "description": "= Cmd on Mac / Ctrl on Win+Linux.",
[INFO] [stdout]         145 │+            "type": "boolean"
[INFO] [stdout]         146 │+          },
[INFO] [stdout]         147 │+          "ctrl": {
[INFO] [stdout]         148 │+            "default": false,
[INFO] [stdout]         149 │+            "type": "boolean"
[INFO] [stdout]         150 │+          },
[INFO] [stdout]         151 │+          "mac_cmd": {
[INFO] [stdout]         152 │+            "default": false,
[INFO] [stdout]         153 │+            "type": "boolean"
[INFO] [stdout]         154 │+          },
[INFO] [stdout]         155 │+          "shift": {
[INFO] [stdout]         156 │+            "default": false,
[INFO] [stdout]         157 │+            "type": "boolean"
[INFO] [stdout]         158 │+          }
[INFO] [stdout]         159 │+        },
[INFO] [stdout]         160 │+        "type": "object"
[INFO] [stdout]         161 │+      }
[INFO] [stdout]         162 │+    },
[INFO] [stdout]         163 │+    "$schema": "https://json-schema.org/draft/2020-12/schema",
[INFO] [stdout]         164 │+    "description": "The widget-matching constraints shared by `query_tree`'s filter and the action `Target`s.\n\nAn optional `role` plus up to one text predicate. All are case-insensitive and combined with\nlogical AND; an all-`None` `Query` matches every node.",
[INFO] [stdout]         165 │+    "properties": {
[INFO] [stdout]         166 │+      "button": {
[INFO] [stdout]         167 │+        "$ref": "#/$defs/PointerButtonArg",
[INFO] [stdout]         168 │+        "default": "primary",
[INFO] [stdout]         169 │+        "description": "`primary`/`secondary`/`middle`/`extra1`/`extra2` (or aliases `left`/`right`). Defaults to `primary`."
[INFO] [stdout]         170 │+      },
[INFO] [stdout]         171 │+      "content_contains": {
[INFO] [stdout]         172 │+        "description": "Case-insensitive substring match against *either* `label` or `value`. Prefer this when you\njust want \"the widget showing this text\" and don't care which field holds it — it's the\nmost robust choice across widget kinds.",
[INFO] [stdout]         173 │+        "type": [
[INFO] [stdout]         174 │+          "string",
[INFO] [stdout]         175 │+          "null"
[INFO] [stdout]         176 │+        ]
[INFO] [stdout]         177 │+      },
[INFO] [stdout]         178 │+      "count": {
[INFO] [stdout]         179 │+        "default": 1,
[INFO] [stdout]         180 │+        "description": "`2` → double-click; `3` → triple-click.",
[INFO] [stdout]         181 │+        "format": "uint32",
[INFO] [stdout]         182 │+        "minimum": 0,
[INFO] [stdout]         183 │+        "type": "integer"
[INFO] [stdout]         184 │+      },
[INFO] [stdout]         185 │+      "id": {
[INFO] [stdout]         186 │+        "default": null,
[INFO] [stdout]         187 │+        "description": "Node id from `query_tree`.",
[INFO] [stdout]         188 │+        "type": [
[INFO] [stdout]         189 │+          "string",
[INFO] [stdout]         190 │+          "null"
[INFO] [stdout]         191 │+        ]
[INFO] [stdout]         192 │+      },
[INFO] [stdout]         193 │+      "label_contains": {
[INFO] [stdout]         194 │+        "description": "Case-insensitive substring match against the node's `label` (its accessible name) only.\nNote that `Label`/monospace widgets carry their text in `value`, not `label` — for those,\nuse `content_contains` (or `value_contains`).",
[INFO] [stdout]         195 │+        "type": [
[INFO] [stdout]         196 │+          "string",
[INFO] [stdout]         197 │+          "null"
[INFO] [stdout]         198 │+        ]
[INFO] [stdout]         199 │+      },
[INFO] [stdout]         200 │+      "modifiers": {
[INFO] [stdout]         201 │+        "$ref": "#/$defs/PressKeyModifiers"
[INFO] [stdout]         202 │+      },
[INFO] [stdout]         203 │+      "pos": {
[INFO] [stdout]         204 │+        "anyOf": [
[INFO] [stdout]         205 │+          {
[INFO] [stdout]         206 │+            "$ref": "#/$defs/Pos2Lit"
[INFO] [stdout]         207 │+          },
[INFO] [stdout]         208 │+          {
[INFO] [stdout]         209 │+            "type": "null"
[INFO] [stdout]         210 │+          }
[INFO] [stdout]         211 │+        ],
[INFO] [stdout]         212 │+        "description": "Raw position in logical points (use instead of locator fields)."
[INFO] [stdout]         213 │+      },
[INFO] [stdout]         214 │+      "role": {
[INFO] [stdout]         215 │+        "description": "Role name, e.g. `Button`, `Label`, `TextInput` (case-insensitive).\nAn unrecognized role is rejected with an error that lists the roles present in the tree.",
[INFO] [stdout]         216 │+        "type": [
[INFO] [stdout]         217 │+          "string",
[INFO] [stdout]         218 │+          "null"
[INFO] [stdout]         219 │+        ]
[INFO] [stdout]         220 │+      },
[INFO] [stdout]         221 │+      "value_contains": {
[INFO] [stdout]         222 │+        "description": "Case-insensitive substring match against the node's `value` only (e.g. a text field's\ncontents, or a `Label`'s text).",
[INFO] [stdout]         223 │+        "type": [
[INFO] [stdout]         224 │+          "string",
[INFO] [stdout]         225 │+          "null"
[INFO] [stdout]         226 │+        ]
[INFO] [stdout]         227 │+      }
[INFO] [stdout]         228 │+    },
[INFO] [stdout]         229 │+    "title": "ClickArgs",
[INFO] [stdout]         230 │+    "type": "object"
[INFO] [stdout]         231 │+  }
[INFO] [stdout]         232 │+}
[INFO] [stdout]         233 │+
[INFO] [stdout]         234 │+## disconnect
[INFO] [stdout]         235 │+
[INFO] [stdout]         236 │+{
[INFO] [stdout]         237 │+  "name": "disconnect",
[INFO] [stdout]         238 │+  "description": "Disconnect from the attached app.\nApp-driving tools remain available but return an error until `attach` is called again.",
[INFO] [stdout]         239 │+  "inputSchema": {
[INFO] [stdout]         240 │+    "$schema": "https://json-schema.org/draft/2020-12/schema",
[INFO] [stdout]         241 │+    "title": "EmptyArgs",
[INFO] [stdout]         242 │+    "type": "object"
[INFO] [stdout]         243 │+  }
[INFO] [stdout]         244 │+}
[INFO] [stdout]         245 │+
[INFO] [stdout]         246 │+## drag
[INFO] [stdout]         247 │+
[INFO] [stdout]         248 │+{
[INFO] [stdout]         249 │+  "name": "drag",
[INFO] [stdout]         250 │+  "description": "Primary-button drag from `start` to `end`.\nEach target accepts the same fields as `click`: locator (`id`/`content_contains`/`role`/`label_contains`/`value_contains`) or `pos: {x, y}`.\n`steps` controls how many intermediate pointer-move events are emitted between press and release.",
[INFO] [stdout]         251 │+  "inputSchema": {
[INFO] [stdout]         252 │+    "$defs": {
[INFO] [stdout]         253 │+      "Pos2Lit": {
[INFO] [stdout]         254 │+        "properties": {
[INFO] [stdout]         255 │+          "x": {
[INFO] [stdout]         256 │+            "format": "float",
[INFO] [stdout]         257 │+            "type": "number"
[INFO] [stdout]         258 │+          },
[INFO] [stdout]         259 │+          "y": {
[INFO] [stdout]         260 │+            "format": "float",
[INFO] [stdout]         261 │+            "type": "number"
[INFO] [stdout]         262 │+          }
[INFO] [stdout]         263 │+        },
[INFO] [stdout]         264 │+        "required": [
[INFO] [stdout]         265 │+          "x",
[INFO] [stdout]         266 │+          "y"
[INFO] [stdout]         267 │+        ],
[INFO] [stdout]         268 │+        "type": "object"
[INFO] [stdout]         269 │+      },
[INFO] [stdout]         270 │+      "PressKeyModifiers": {
[INFO] [stdout]         271 │+        "properties": {
[INFO] [stdout]         272 │+          "alt": {
[INFO] [stdout]         273 │+            "default": false,
[INFO] [stdout]         274 │+            "type": "boolean"
[INFO] [stdout]         275 │+          },
[INFO] [stdout]         276 │+          "command": {
[INFO] [stdout]         277 │+            "default": false,
[INFO] [stdout]         278 │+            "description": "= Cmd on Mac / Ctrl on Win+Linux.",
[INFO] [stdout]         279 │+            "type": "boolean"
[INFO] [stdout]         280 │+          },
[INFO] [stdout]         281 │+          "ctrl": {
[INFO] [stdout]         282 │+            "default": false,
[INFO] [stdout]         283 │+            "type": "boolean"
[INFO] [stdout]         284 │+          },
[INFO] [stdout]         285 │+          "mac_cmd": {
[INFO] [stdout]         286 │+            "default": false,
[INFO] [stdout]         287 │+            "type": "boolean"
[INFO] [stdout]         288 │+          },
[INFO] [stdout]         289 │+          "shift": {
[INFO] [stdout]         290 │+            "default": false,
[INFO] [stdout]         291 │+            "type": "boolean"
[INFO] [stdout]         292 │+          }
[INFO] [stdout]         293 │+        },
[INFO] [stdout]         294 │+        "type": "object"
[INFO] [stdout]         295 │+      },
[INFO] [stdout]         296 │+      "Target": {
[INFO] [stdout]         297 │+        "description": "The widget-matching constraints shared by `query_tree`'s filter and the action `Target`s.\n\nAn optional `role` plus up to one text predicate. All are case-insensitive and combined with\nlogical AND; an all-`None` `Query` matches every node.",
[INFO] [stdout]         298 │+        "properties": {
[INFO] [stdout]         299 │+          "content_contains": {
[INFO] [stdout]         300 │+            "description": "Case-insensitive substring match against *either* `label` or `value`. Prefer this when you\njust want \"the widget showing this text\" and don't care which field holds it — it's the\nmost robust choice across widget kinds.",
[INFO] [stdout]         301 │+            "type": [
[INFO] [stdout]         302 │+              "string",
[INFO] [stdout]         303 │+              "null"
[INFO] [stdout]         304 │+            ]
[INFO] [stdout]         305 │+          },
[INFO] [stdout]         306 │+          "id": {
[INFO] [stdout]         307 │+            "default": null,
[INFO] [stdout]         308 │+            "description": "Node id from `query_tree`.",
[INFO] [stdout]         309 │+            "type": [
[INFO] [stdout]         310 │+              "string",
[INFO] [stdout]         311 │+              "null"
[INFO] [stdout]         312 │+            ]
[INFO] [stdout]         313 │+          },
[INFO] [stdout]         314 │+          "label_contains": {
[INFO] [stdout]         315 │+            "description": "Case-insensitive substring match against the node's `label` (its accessible name) only.\nNote that `Label`/monospace widgets carry their text in `value`, not `label` — for those,\nuse `content_contains` (or `value_contains`).",
[INFO] [stdout]         316 │+            "type": [
[INFO] [stdout]         317 │+              "string",
[INFO] [stdout]         318 │+              "null"
[INFO] [stdout]         319 │+            ]
[INFO] [stdout]         320 │+          },
[INFO] [stdout]         321 │+          "pos": {
[INFO] [stdout]         322 │+            "anyOf": [
[INFO] [stdout]         323 │+              {
[INFO] [stdout]         324 │+                "$ref": "#/$defs/Pos2Lit"
[INFO] [stdout]         325 │+              },
[INFO] [stdout]         326 │+              {
[INFO] [stdout]         327 │+                "type": "null"
[INFO] [stdout]         328 │+              }
[INFO] [stdout]         329 │+            ],
[INFO] [stdout]         330 │+            "description": "Raw position in logical points (use instead of locator fields)."
[INFO] [stdout]         331 │+          },
[INFO] [stdout]         332 │+          "role": {
[INFO] [stdout]         333 │+            "description": "Role name, e.g. `Button`, `Label`, `TextInput` (case-insensitive).\nAn unrecognized role is rejected with an error that lists the roles present in the tree.",
[INFO] [stdout]         334 │+            "type": [
[INFO] [stdout]         335 │+              "string",
[INFO] [stdout]         336 │+              "null"
[INFO] [stdout]         337 │+            ]
[INFO] [stdout]         338 │+          },
[INFO] [stdout]         339 │+          "value_contains": {
[INFO] [stdout]         340 │+            "description": "Case-insensitive substring match against the node's `value` only (e.g. a text field's\ncontents, or a `Label`'s text).",
[INFO] [stdout]         341 │+            "type": [
[INFO] [stdout]         342 │+              "string",
[INFO] [stdout]         343 │+              "null"
[INFO] [stdout]         344 │+            ]
[INFO] [stdout]         345 │+          }
[INFO] [stdout]         346 │+        },
[INFO] [stdout]         347 │+        "type": "object"
[INFO] [stdout]         348 │+      }
[INFO] [stdout]         349 │+    },
[INFO] [stdout]         350 │+    "$schema": "https://json-schema.org/draft/2020-12/schema",
[INFO] [stdout]         351 │+    "properties": {
[INFO] [stdout]         352 │+      "end": {
[INFO] [stdout]         353 │+        "$ref": "#/$defs/Target"
[INFO] [stdout]         354 │+      },
[INFO] [stdout]         355 │+      "modifiers": {
[INFO] [stdout]         356 │+        "$ref": "#/$defs/PressKeyModifiers"
[INFO] [stdout]         357 │+      },
[INFO] [stdout]         358 │+      "start": {
[INFO] [stdout]         359 │+        "$ref": "#/$defs/Target"
[INFO] [stdout]         360 │+      },
[INFO] [stdout]         361 │+      "steps": {
[INFO] [stdout]         362 │+        "default": 8,
[INFO] [stdout]         363 │+        "format": "uint32",
[INFO] [stdout]         364 │+        "minimum": 0,
[INFO] [stdout]         365 │+        "type": "integer"
[INFO] [stdout]         366 │+      }
[INFO] [stdout]         367 │+    },
[INFO] [stdout]         368 │+    "required": [
[INFO] [stdout]         369 │+      "start",
[INFO] [stdout]         370 │+      "end"
[INFO] [stdout]         371 │+    ],
[INFO] [stdout]         372 │+    "title": "DragArgs",
[INFO] [stdout]         373 │+    "type": "object"
[INFO] [stdout]         374 │+  }
[INFO] [stdout]         375 │+}
[INFO] [stdout]         376 │+
[INFO] [stdout]         377 │+## get_node
[INFO] [stdout]         378 │+
[INFO] [stdout]         379 │+{
[INFO] [stdout]         380 │+  "name": "get_node",
[INFO] [stdout]         381 │+  "description": "Return a single node by id (from `query_tree`).",
[INFO] [stdout]         382 │+  "inputSchema": {
[INFO] [stdout]         383 │+    "$schema": "https://json-schema.org/draft/2020-12/schema",
[INFO] [stdout]         384 │+    "properties": {
[INFO] [stdout]         385 │+      "id": {
[INFO] [stdout]         386 │+        "type": "string"
[INFO] [stdout]         387 │+      }
[INFO] [stdout]         388 │+    },
[INFO] [stdout]         389 │+    "required": [
[INFO] [stdout]         390 │+      "id"
[INFO] [stdout]         391 │+    ],
[INFO] [stdout]         392 │+    "title": "GetNodeArgs",
[INFO] [stdout]         393 │+    "type": "object"
[INFO] [stdout]         394 │+  },
[INFO] [stdout]         395 │+  "outputSchema": {
[INFO] [stdout]         396 │+    "$defs": {
[INFO] [stdout]         397 │+      "NodeView": {
[INFO] [stdout]         398 │+        "properties": {
[INFO] [stdout]         399 │+          "bounds": {
[INFO] [stdout]         400 │+            "anyOf": [
[INFO] [stdout]         401 │+              {
[INFO] [stdout]         402 │+                "$ref": "#/$defs/RectF"
[INFO] [stdout]         403 │+              },
[INFO] [stdout]         404 │+              {
[INFO] [stdout]         405 │+                "type": "null"
[INFO] [stdout]         406 │+              }
[INFO] [stdout]         407 │+            ]
[INFO] [stdout]         408 │+          },
[INFO] [stdout]         409 │+          "disabled": {
[INFO] [stdout]         410 │+            "type": "boolean"
[INFO] [stdout]         411 │+          },
[INFO] [stdout]         412 │+          "focused": {
[INFO] [stdout]         413 │+            "type": "boolean"
[INFO] [stdout]         414 │+          },
[INFO] [stdout]         415 │+          "hidden": {
[INFO] [stdout]         416 │+            "type": "boolean"
[INFO] [stdout]         417 │+          },
[INFO] [stdout]         418 │+          "id": {
[INFO] [stdout]         419 │+            "description": "Node id, used with `click`, `type_text`, and `get_node`.",
[INFO] [stdout]         420 │+            "type": "string"
[INFO] [stdout]         421 │+          },
[INFO] [stdout]         422 │+          "label": {
[INFO] [stdout]         423 │+            "type": [
[INFO] [stdout]         424 │+              "string",
[INFO] [stdout]         425 │+              "null"
[INFO] [stdout]         426 │+            ]
[INFO] [stdout]         427 │+          },
[INFO] [stdout]         428 │+          "parent_id": {
[INFO] [stdout]         429 │+            "type": [
[INFO] [stdout]         430 │+              "string",
[INFO] [stdout]         431 │+              "null"
[INFO] [stdout]         432 │+            ]
[INFO] [stdout]         433 │+          },
[INFO] [stdout]         434 │+          "role": {
[INFO] [stdout]         435 │+            "type": "string"
[INFO] [stdout]         436 │+          },
[INFO] [stdout]         437 │+          "value": {
[INFO] [stdout]         438 │+            "type": [
[INFO] [stdout]         439 │+              "string",
[INFO] [stdout]         440 │+              "null"
[INFO] [stdout]         441 │+            ]
[INFO] [stdout]         442 │+          }
[INFO] [stdout]         443 │+        },
[INFO] [stdout]         444 │+        "required": [
[INFO] [stdout]         445 │+          "id",
[INFO] [stdout]         446 │+          "role",
[INFO] [stdout]         447 │+          "focused",
[INFO] [stdout]         448 │+          "disabled",
[INFO] [stdout]         449 │+          "hidden"
[INFO] [stdout]         450 │+        ],
[INFO] [stdout]         451 │+        "type": "object"
[INFO] [stdout]         452 │+      },
[INFO] [stdout]         453 │+      "RectF": {
[INFO] [stdout]         454 │+        "properties": {
[INFO] [stdout]         455 │+          "h": {
[INFO] [stdout]         456 │+            "format": "double",
[INFO] [stdout]         457 │+            "type": "number"
[INFO] [stdout]         458 │+          },
[INFO] [stdout]         459 │+          "w": {
[INFO] [stdout]         460 │+            "format": "double",
[INFO] [stdout]         461 │+            "type": "number"
[INFO] [stdout]         462 │+          },
[INFO] [stdout]         463 │+          "x": {
[INFO] [stdout]         464 │+            "format": "double",
[INFO] [stdout]         465 │+            "type": "number"
[INFO] [stdout]         466 │+          },
[INFO] [stdout]         467 │+          "y": {
[INFO] [stdout]         468 │+            "format": "double",
[INFO] [stdout]         469 │+            "type": "number"
[INFO] [stdout]         470 │+          }
[INFO] [stdout]         471 │+        },
[INFO] [stdout]         472 │+        "required": [
[INFO] [stdout]         473 │+          "x",
[INFO] [stdout]         474 │+          "y",
[INFO] [stdout]         475 │+          "w",
[INFO] [stdout]         476 │+          "h"
[INFO] [stdout]         477 │+        ],
[INFO] [stdout]         478 │+        "type": "object"
[INFO] [stdout]         479 │+      }
[INFO] [stdout]         480 │+    },
[INFO] [stdout]         481 │+    "$schema": "https://json-schema.org/draft/2020-12/schema",
[INFO] [stdout]         482 │+    "description": "`get_node` result: the resolved node, or `null` if the id didn't match.",
[INFO] [stdout]         483 │+    "properties": {
[INFO] [stdout]         484 │+      "node": {
[INFO] [stdout]         485 │+        "anyOf": [
[INFO] [stdout]         486 │+          {
[INFO] [stdout]         487 │+            "$ref": "#/$defs/NodeView"
[INFO] [stdout]         488 │+          },
[INFO] [stdout]         489 │+          {
[INFO] [stdout]         490 │+            "type": "null"
[INFO] [stdout]         491 │+          }
[INFO] [stdout]         492 │+        ]
[INFO] [stdout]         493 │+      }
[INFO] [stdout]         494 │+    },
[INFO] [stdout]         495 │+    "title": "GetNodeResult",
[INFO] [stdout]         496 │+    "type": "object"
[INFO] [stdout]         497 │+  }
[INFO] [stdout]         498 │+}
[INFO] [stdout]         499 │+
[INFO] [stdout]         500 │+## hover
[INFO] [stdout]         501 │+
[INFO] [stdout]         502 │+{
[INFO] [stdout]         503 │+  "name": "hover",
[INFO] [stdout]         504 │+  "description": "Move the pointer over a node (or raw `pos`) without clicking.\nTooltips and hover popups only appear after a short delay — follow with `wait_for` (e.g. its `min_steps`) to let them settle before reading the tree or screenshotting.",
[INFO] [stdout]         505 │+  "inputSchema": {
[INFO] [stdout]         506 │+    "$defs": {
[INFO] [stdout]         507 │+      "Pos2Lit": {
[INFO] [stdout]         508 │+        "properties": {
[INFO] [stdout]         509 │+          "x": {
[INFO] [stdout]         510 │+            "format": "float",
[INFO] [stdout]         511 │+            "type": "number"
[INFO] [stdout]         512 │+          },
[INFO] [stdout]         513 │+          "y": {
[INFO] [stdout]         514 │+            "format": "float",
[INFO] [stdout]         515 │+            "type": "number"
[INFO] [stdout]         516 │+          }
[INFO] [stdout]         517 │+        },
[INFO] [stdout]         518 │+        "required": [
[INFO] [stdout]         519 │+          "x",
[INFO] [stdout]         520 │+          "y"
[INFO] [stdout]         521 │+        ],
[INFO] [stdout]         522 │+        "type": "object"
[INFO] [stdout]         523 │+      }
[INFO] [stdout]         524 │+    },
[INFO] [stdout]         525 │+    "$schema": "https://json-schema.org/draft/2020-12/schema",
[INFO] [stdout]         526 │+    "description": "The widget-matching constraints shared by `query_tree`'s filter and the action `Target`s.\n\nAn optional `role` plus up to one text predicate. All are case-insensitive and combined with\nlogical AND; an all-`None` `Query` matches every node.",
[INFO] [stdout]         527 │+    "properties": {
[INFO] [stdout]         528 │+      "content_contains": {
[INFO] [stdout]         529 │+        "description": "Case-insensitive substring match against *either* `label` or `value`. Prefer this when you\njust want \"the widget showing this text\" and don't care which field holds it — it's the\nmost robust choice across widget kinds.",
[INFO] [stdout]         530 │+        "type": [
[INFO] [stdout]         531 │+          "string",
[INFO] [stdout]         532 │+          "null"
[INFO] [stdout]         533 │+        ]
[INFO] [stdout]         534 │+      },
[INFO] [stdout]         535 │+      "id": {
[INFO] [stdout]         536 │+        "default": null,
[INFO] [stdout]         537 │+        "description": "Node id from `query_tree`.",
[INFO] [stdout]         538 │+        "type": [
[INFO] [stdout]         539 │+          "string",
[INFO] [stdout]         540 │+          "null"
[INFO] [stdout]         541 │+        ]
[INFO] [stdout]         542 │+      },
[INFO] [stdout]         543 │+      "label_contains": {
[INFO] [stdout]         544 │+        "description": "Case-insensitive substring match against the node's `label` (its accessible name) only.\nNote that `Label`/monospace widgets carry their text in `value`, not `label` — for those,\nuse `content_contains` (or `value_contains`).",
[INFO] [stdout]         545 │+        "type": [
[INFO] [stdout]         546 │+          "string",
[INFO] [stdout]         547 │+          "null"
[INFO] [stdout]         548 │+        ]
[INFO] [stdout]         549 │+      },
[INFO] [stdout]         550 │+      "pos": {
[INFO] [stdout]         551 │+        "anyOf": [
[INFO] [stdout]         552 │+          {
[INFO] [stdout]         553 │+            "$ref": "#/$defs/Pos2Lit"
[INFO] [stdout]         554 │+          },
[INFO] [stdout]         555 │+          {
[INFO] [stdout]         556 │+            "type": "null"
[INFO] [stdout]         557 │+          }
[INFO] [stdout]         558 │+        ],
[INFO] [stdout]         559 │+        "description": "Raw position in logical points (use instead of locator fields)."
[INFO] [stdout]         560 │+      },
[INFO] [stdout]         561 │+      "role": {
[INFO] [stdout]         562 │+        "description": "Role name, e.g. `Button`, `Label`, `TextInput` (case-insensitive).\nAn unrecognized role is rejected with an error that lists the roles present in the tree.",
[INFO] [stdout]         563 │+        "type": [
[INFO] [stdout]         564 │+          "string",
[INFO] [stdout]         565 │+          "null"
[INFO] [stdout]         566 │+        ]
[INFO] [stdout]         567 │+      },
[INFO] [stdout]         568 │+      "value_contains": {
[INFO] [stdout]         569 │+        "description": "Case-insensitive substring match against the node's `value` only (e.g. a text field's\ncontents, or a `Label`'s text).",
[INFO] [stdout]         570 │+        "type": [
[INFO] [stdout]         571 │+          "string",
[INFO] [stdout]         572 │+          "null"
[INFO] [stdout]         573 │+        ]
[INFO] [stdout]         574 │+      }
[INFO] [stdout]         575 │+    },
[INFO] [stdout]         576 │+    "title": "HoverArgs",
[INFO] [stdout]         577 │+    "type": "object"
[INFO] [stdout]         578 │+  }
[INFO] [stdout]         579 │+}
[INFO] [stdout]         580 │+
[INFO] [stdout]         581 │+## press_key
[INFO] [stdout]         582 │+
[INFO] [stdout]         583 │+{
[INFO] [stdout]         584 │+  "name": "press_key",
[INFO] [stdout]         585 │+  "description": "Send a key press (down + up) to the focused widget.\n`key` is an egui key name such as `Backspace`, `Delete`, `Enter`, `Tab`, `A`–`Z`, `ArrowLeft`, `ArrowRight`, `Home`, `End`, `Escape`.",
[INFO] [stdout]         586 │+  "inputSchema": {
[INFO] [stdout]         587 │+    "$defs": {
[INFO] [stdout]         588 │+      "PressKeyModifiers": {
[INFO] [stdout]         589 │+        "properties": {
[INFO] [stdout]         590 │+          "alt": {
[INFO] [stdout]         591 │+            "default": false,
[INFO] [stdout]         592 │+            "type": "boolean"
[INFO] [stdout]         593 │+          },
[INFO] [stdout]         594 │+          "command": {
[INFO] [stdout]         595 │+            "default": false,
[INFO] [stdout]         596 │+            "description": "= Cmd on Mac / Ctrl on Win+Linux.",
[INFO] [stdout]         597 │+            "type": "boolean"
[INFO] [stdout]         598 │+          },
[INFO] [stdout]         599 │+          "ctrl": {
[INFO] [stdout]         600 │+            "default": false,
[INFO] [stdout]         601 │+            "type": "boolean"
[INFO] [stdout]         602 │+          },
[INFO] [stdout]         603 │+          "mac_cmd": {
[INFO] [stdout]         604 │+            "default": false,
[INFO] [stdout]         605 │+            "type": "boolean"
[INFO] [stdout]         606 │+          },
[INFO] [stdout]         607 │+          "shift": {
[INFO] [stdout]         608 │+            "default": false,
[INFO] [stdout]         609 │+            "type": "boolean"
[INFO] [stdout]         610 │+          }
[INFO] [stdout]         611 │+        },
[INFO] [stdout]         612 │+        "type": "object"
[INFO] [stdout]         613 │+      }
[INFO] [stdout]         614 │+    },
[INFO] [stdout]         615 │+    "$schema": "https://json-schema.org/draft/2020-12/schema",
[INFO] [stdout]         616 │+    "properties": {
[INFO] [stdout]         617 │+      "key": {
[INFO] [stdout]         618 │+        "type": "string"
[INFO] [stdout]         619 │+      },
[INFO] [stdout]         620 │+      "modifiers": {
[INFO] [stdout]         621 │+        "$ref": "#/$defs/PressKeyModifiers"
[INFO] [stdout]         622 │+      }
[INFO] [stdout]         623 │+    },
[INFO] [stdout]         624 │+    "required": [
[INFO] [stdout]         625 │+      "key"
[INFO] [stdout]         626 │+    ],
[INFO] [stdout]         627 │+    "title": "PressKeyArgs",
[INFO] [stdout]         628 │+    "type": "object"
[INFO] [stdout]         629 │+  }
[INFO] [stdout]         630 │+}
[INFO] [stdout]         631 │+
[INFO] [stdout]         632 │+## query_tree
[INFO] [stdout]         633 │+
[INFO] [stdout]         634 │+{
[INFO] [stdout]         635 │+  "name": "query_tree",
[INFO] [stdout]         636 │+  "description": "Walk the widget tree and return nodes matching the filter.\n`role`, if given, is a role name (e.g. `Button`, `Label`), matched case-insensitively; an unknown role errors with the roles present in the tree.\nUse the returned `id` with `click`, `type_text`, or `get_node`.",
[INFO] [stdout]         637 │+  "inputSchema": {
[INFO] [stdout]         638 │+    "$schema": "https://json-schema.org/draft/2020-12/schema",
[INFO] [stdout]         639 │+    "description": "The widget-matching constraints shared by `query_tree`'s filter and the action `Target`s.\n\nAn optional `role` plus up to one text predicate. All are case-insensitive and combined with\nlogical AND; an all-`None` `Query` matches every node.",
[INFO] [stdout]         640 │+    "properties": {
[INFO] [stdout]         641 │+      "content_contains": {
[INFO] [stdout]         642 │+        "description": "Case-insensitive substring match against *either* `label` or `value`. Prefer this when you\njust want \"the widget showing this text\" and don't care which field holds it — it's the\nmost robust choice across widget kinds.",
[INFO] [stdout]         643 │+        "type": [
[INFO] [stdout]         644 │+          "string",
[INFO] [stdout]         645 │+          "null"
[INFO] [stdout]         646 │+        ]
[INFO] [stdout]         647 │+      },
[INFO] [stdout]         648 │+      "label_contains": {
[INFO] [stdout]         649 │+        "description": "Case-insensitive substring match against the node's `label` (its accessible name) only.\nNote that `Label`/monospace widgets carry their text in `value`, not `label` — for those,\nuse `content_contains` (or `value_contains`).",
[INFO] [stdout]         650 │+        "type": [
[INFO] [stdout]         651 │+          "string",
[INFO] [stdout]         652 │+          "null"
[INFO] [stdout]         653 │+        ]
[INFO] [stdout]         654 │+      },
[INFO] [stdout]         655 │+      "limit": {
[INFO] [stdout]         656 │+        "default": 200,
[INFO] [stdout]         657 │+        "format": "uint",
[INFO] [stdout]         658 │+        "minimum": 0,
[INFO] [stdout]         659 │+        "type": "integer"
[INFO] [stdout]         660 │+      },
[INFO] [stdout]         661 │+      "role": {
[INFO] [stdout]         662 │+        "description": "Role name, e.g. `Button`, `Label`, `TextInput` (case-insensitive).\nAn unrecognized role is rejected with an error that lists the roles present in the tree.",
[INFO] [stdout]         663 │+        "type": [
[INFO] [stdout]         664 │+          "string",
[INFO] [stdout]         665 │+          "null"
[INFO] [stdout]         666 │+        ]
[INFO] [stdout]         667 │+      },
[INFO] [stdout]         668 │+      "value_contains": {
[INFO] [stdout]         669 │+        "description": "Case-insensitive substring match against the node's `value` only (e.g. a text field's\ncontents, or a `Label`'s text).",
[INFO] [stdout]         670 │+        "type": [
[INFO] [stdout]         671 │+          "string",
[INFO] [stdout]         672 │+          "null"
[INFO] [stdout]         673 │+        ]
[INFO] [stdout]         674 │+      },
[INFO] [stdout]         675 │+      "visible_only": {
[INFO] [stdout]         676 │+        "default": true,
[INFO] [stdout]         677 │+        "type": "boolean"
[INFO] [stdout]         678 │+      }
[INFO] [stdout]         679 │+    },
[INFO] [stdout]         680 │+    "title": "QueryFilter",
[INFO] [stdout]         681 │+    "type": "object"
[INFO] [stdout]         682 │+  },
[INFO] [stdout]         683 │+  "outputSchema": {
[INFO] [stdout]         684 │+    "$defs": {
[INFO] [stdout]         685 │+      "NodeView": {
[INFO] [stdout]         686 │+        "properties": {
[INFO] [stdout]         687 │+          "bounds": {
[INFO] [stdout]         688 │+            "anyOf": [
[INFO] [stdout]         689 │+              {
[INFO] [stdout]         690 │+                "$ref": "#/$defs/RectF"
[INFO] [stdout]         691 │+              },
[INFO] [stdout]         692 │+              {
[INFO] [stdout]         693 │+                "type": "null"
[INFO] [stdout]         694 │+              }
[INFO] [stdout]         695 │+            ]
[INFO] [stdout]         696 │+          },
[INFO] [stdout]         697 │+          "disabled": {
[INFO] [stdout]         698 │+            "type": "boolean"
[INFO] [stdout]         699 │+          },
[INFO] [stdout]         700 │+          "focused": {
[INFO] [stdout]         701 │+            "type": "boolean"
[INFO] [stdout]         702 │+          },
[INFO] [stdout]         703 │+          "hidden": {
[INFO] [stdout]         704 │+            "type": "boolean"
[INFO] [stdout]         705 │+          },
[INFO] [stdout]         706 │+          "id": {
[INFO] [stdout]         707 │+            "description": "Node id, used with `click`, `type_text`, and `get_node`.",
[INFO] [stdout]         708 │+            "type": "string"
[INFO] [stdout]         709 │+          },
[INFO] [stdout]         710 │+          "label": {
[INFO] [stdout]         711 │+            "type": [
[INFO] [stdout]         712 │+              "string",
[INFO] [stdout]         713 │+              "null"
[INFO] [stdout]         714 │+            ]
[INFO] [stdout]         715 │+          },
[INFO] [stdout]         716 │+          "parent_id": {
[INFO] [stdout]         717 │+            "type": [
[INFO] [stdout]         718 │+              "string",
[INFO] [stdout]         719 │+              "null"
[INFO] [stdout]         720 │+            ]
[INFO] [stdout]         721 │+          },
[INFO] [stdout]         722 │+          "role": {
[INFO] [stdout]         723 │+            "type": "string"
[INFO] [stdout]         724 │+          },
[INFO] [stdout]         725 │+          "value": {
[INFO] [stdout]         726 │+            "type": [
[INFO] [stdout]         727 │+              "string",
[INFO] [stdout]         728 │+              "null"
[INFO] [stdout]         729 │+            ]
[INFO] [stdout]         730 │+          }
[INFO] [stdout]         731 │+        },
[INFO] [stdout]         732 │+        "required": [
[INFO] [stdout]         733 │+          "id",
[INFO] [stdout]         734 │+          "role",
[INFO] [stdout]         735 │+          "focused",
[INFO] [stdout]         736 │+          "disabled",
[INFO] [stdout]         737 │+          "hidden"
[INFO] [stdout]         738 │+        ],
[INFO] [stdout]         739 │+        "type": "object"
[INFO] [stdout]         740 │+      },
[INFO] [stdout]         741 │+      "RectF": {
[INFO] [stdout]         742 │+        "properties": {
[INFO] [stdout]         743 │+          "h": {
[INFO] [stdout]         744 │+            "format": "double",
[INFO] [stdout]         745 │+            "type": "number"
[INFO] [stdout]         746 │+          },
[INFO] [stdout]         747 │+          "w": {
[INFO] [stdout]         748 │+            "format": "double",
[INFO] [stdout]         749 │+            "type": "number"
[INFO] [stdout]         750 │+          },
[INFO] [stdout]         751 │+          "x": {
[INFO] [stdout]         752 │+            "format": "double",
[INFO] [stdout]         753 │+            "type": "number"
[INFO] [stdout]         754 │+          },
[INFO] [stdout]         755 │+          "y": {
[INFO] [stdout]         756 │+            "format": "double",
[INFO] [stdout]         757 │+            "type": "number"
[INFO] [stdout]         758 │+          }
[INFO] [stdout]         759 │+        },
[INFO] [stdout]         760 │+        "required": [
[INFO] [stdout]         761 │+          "x",
[INFO] [stdout]         762 │+          "y",
[INFO] [stdout]         763 │+          "w",
[INFO] [stdout]         764 │+          "h"
[INFO] [stdout]         765 │+        ],
[INFO] [stdout]         766 │+        "type": "object"
[INFO] [stdout]         767 │+      }
[INFO] [stdout]         768 │+    },
[INFO] [stdout]         769 │+    "$schema": "https://json-schema.org/draft/2020-12/schema",
[INFO] [stdout]         770 │+    "description": "`query_tree` result: the matching nodes.",
[INFO] [stdout]         771 │+    "properties": {
[INFO] [stdout]         772 │+      "nodes": {
[INFO] [stdout]         773 │+        "items": {
[INFO] [stdout]         774 │+          "$ref": "#/$defs/NodeView"
[INFO] [stdout]         775 │+        },
[INFO] [stdout]         776 │+        "type": "array"
[INFO] [stdout]         777 │+      }
[INFO] [stdout]         778 │+    },
[INFO] [stdout]         779 │+    "required": [
[INFO] [stdout]         780 │+      "nodes"
[INFO] [stdout]         781 │+    ],
[INFO] [stdout]         782 │+    "title": "QueryTreeResult",
[INFO] [stdout]         783 │+    "type": "object"
[INFO] [stdout]         784 │+  }
[INFO] [stdout]         785 │+}
[INFO] [stdout]         786 │+
[INFO] [stdout]         787 │+## resize
[INFO] [stdout]         788 │+
[INFO] [stdout]         789 │+{
[INFO] [stdout]         790 │+  "name": "resize",
[INFO] [stdout]         791 │+  "description": "Resize the app's viewport to the given logical-point dimensions.",
[INFO] [stdout]         792 │+  "inputSchema": {
[INFO] [stdout]         793 │+    "$schema": "https://json-schema.org/draft/2020-12/schema",
[INFO] [stdout]         794 │+    "properties": {
[INFO] [stdout]         795 │+      "height": {
[INFO] [stdout]         796 │+        "format": "uint32",
[INFO] [stdout]         797 │+        "minimum": 0,
[INFO] [stdout]         798 │+        "type": "integer"
[INFO] [stdout]         799 │+      },
[INFO] [stdout]         800 │+      "width": {
[INFO] [stdout]         801 │+        "format": "uint32",
[INFO] [stdout]         802 │+        "minimum": 0,
[INFO] [stdout]         803 │+        "type": "integer"
[INFO] [stdout]         804 │+      }
[INFO] [stdout]         805 │+    },
[INFO] [stdout]         806 │+    "required": [
[INFO] [stdout]         807 │+      "width",
[INFO] [stdout]         808 │+      "height"
[INFO] [stdout]         809 │+    ],
[INFO] [stdout]         810 │+    "title": "ResizeArgs",
[INFO] [stdout]         811 │+    "type": "object"
[INFO] [stdout]         812 │+  }
[INFO] [stdout]         813 │+}
[INFO] [stdout]         814 │+
[INFO] [stdout]         815 │+## screenshot
[INFO] [stdout]         816 │+
[INFO] [stdout]         817 │+{
[INFO] [stdout]         818 │+  "name": "screenshot",
[INFO] [stdout]         819 │+  "description": "Capture the current frame as a PNG screenshot.\nDefaults to logical-point resolution (`pixels_per_point: 1.0`) so pixels align with `click`/`query_tree` coordinates; pass a higher `pixels_per_point` for detail, or `save_path` to also write it to disk.\nRequires the app window to be visible — a fully-occluded or minimized window can't render a frame to capture (notably on macOS), so the call times out; bring the window to the foreground first.",
[INFO] [stdout]         820 │+  "inputSchema": {
[INFO] [stdout]         821 │+    "$schema": "https://json-schema.org/draft/2020-12/schema",
[INFO] [stdout]         822 │+    "properties": {
[INFO] [stdout]         823 │+      "pixels_per_point": {
[INFO] [stdout]         824 │+        "default": 1.0,
[INFO] [stdout]         825 │+        "description": "Output resolution in pixels per logical point.\nDefaults to `1.0`, which makes screenshot pixels line up 1:1 with the logical coordinates used by `click`/`query_tree`.\nHigher values give a sharper image, capped at the display's native scale (no upscaling).",
[INFO] [stdout]         826 │+        "format": "float",
[INFO] [stdout]         827 │+        "type": "number"
[INFO] [stdout]         828 │+      },
[INFO] [stdout]         829 │+      "save_path": {
[INFO] [stdout]         830 │+        "default": null,
[INFO] [stdout]         831 │+        "description": "If set, also write the PNG to this path on the machine running the MCP server (in addition to returning it inline).",
[INFO] [stdout]         832 │+        "type": [
[INFO] [stdout]         833 │+          "string",
[INFO] [stdout]         834 │+          "null"
[INFO] [stdout]         835 │+        ]
[INFO] [stdout]         836 │+      }
[INFO] [stdout]         837 │+    },
[INFO] [stdout]         838 │+    "title": "ScreenshotArgs",
[INFO] [stdout]         839 │+    "type": "object"
[INFO] [stdout]         840 │+  }
[INFO] [stdout]         841 │+}
[INFO] [stdout]         842 │+
[INFO] [stdout]         843 │+## scroll
[INFO] [stdout]         844 │+
[INFO] [stdout]         845 │+{
[INFO] [stdout]         846 │+  "name": "scroll",
[INFO] [stdout]         847 │+  "description": "Send a mouse wheel scroll over a node (or raw `pos`).\n`delta` is in logical points: positive Y scrolls down (reveals content below); positive X scrolls right.",
[INFO] [stdout]         848 │+  "inputSchema": {
[INFO] [stdout]         849 │+    "$defs": {
[INFO] [stdout]         850 │+      "Pos2Lit": {
[INFO] [stdout]         851 │+        "properties": {
[INFO] [stdout]         852 │+          "x": {
[INFO] [stdout]         853 │+            "format": "float",
[INFO] [stdout]         854 │+            "type": "number"
[INFO] [stdout]         855 │+          },
[INFO] [stdout]         856 │+          "y": {
[INFO] [stdout]         857 │+            "format": "float",
[INFO] [stdout]         858 │+            "type": "number"
[INFO] [stdout]         859 │+          }
[INFO] [stdout]         860 │+        },
[INFO] [stdout]         861 │+        "required": [
[INFO] [stdout]         862 │+          "x",
[INFO] [stdout]         863 │+          "y"
[INFO] [stdout]         864 │+        ],
[INFO] [stdout]         865 │+        "type": "object"
[INFO] [stdout]         866 │+      },
[INFO] [stdout]         867 │+      "PressKeyModifiers": {
[INFO] [stdout]         868 │+        "properties": {
[INFO] [stdout]         869 │+          "alt": {
[INFO] [stdout]         870 │+            "default": false,
[INFO] [stdout]         871 │+            "type": "boolean"
[INFO] [stdout]         872 │+          },
[INFO] [stdout]         873 │+          "command": {
[INFO] [stdout]         874 │+            "default": false,
[INFO] [stdout]         875 │+            "description": "= Cmd on Mac / Ctrl on Win+Linux.",
[INFO] [stdout]         876 │+            "type": "boolean"
[INFO] [stdout]         877 │+          },
[INFO] [stdout]         878 │+          "ctrl": {
[INFO] [stdout]         879 │+            "default": false,
[INFO] [stdout]         880 │+            "type": "boolean"
[INFO] [stdout]         881 │+          },
[INFO] [stdout]         882 │+          "mac_cmd": {
[INFO] [stdout]         883 │+            "default": false,
[INFO] [stdout]         884 │+            "type": "boolean"
[INFO] [stdout]         885 │+          },
[INFO] [stdout]         886 │+          "shift": {
[INFO] [stdout]         887 │+            "default": false,
[INFO] [stdout]         888 │+            "type": "boolean"
[INFO] [stdout]         889 │+          }
[INFO] [stdout]         890 │+        },
[INFO] [stdout]         891 │+        "type": "object"
[INFO] [stdout]         892 │+      }
[INFO] [stdout]         893 │+    },
[INFO] [stdout]         894 │+    "$schema": "https://json-schema.org/draft/2020-12/schema",
[INFO] [stdout]         895 │+    "description": "The widget-matching constraints shared by `query_tree`'s filter and the action `Target`s.\n\nAn optional `role` plus up to one text predicate. All are case-insensitive and combined with\nlogical AND; an all-`None` `Query` matches every node.",
[INFO] [stdout]         896 │+    "properties": {
[INFO] [stdout]         897 │+      "content_contains": {
[INFO] [stdout]         898 │+        "description": "Case-insensitive substring match against *either* `label` or `value`. Prefer this when you\njust want \"the widget showing this text\" and don't care which field holds it — it's the\nmost robust choice across widget kinds.",
[INFO] [stdout]         899 │+        "type": [
[INFO] [stdout]         900 │+          "string",
[INFO] [stdout]         901 │+          "null"
[INFO] [stdout]         902 │+        ]
[INFO] [stdout]         903 │+      },
[INFO] [stdout]         904 │+      "delta": {
[INFO] [stdout]         905 │+        "$ref": "#/$defs/Pos2Lit",
[INFO] [stdout]         906 │+        "description": "Logical points.\nPositive Y scrolls down (reveals content below); positive X scrolls right."
[INFO] [stdout]         907 │+      },
[INFO] [stdout]         908 │+      "id": {
[INFO] [stdout]         909 │+        "default": null,
[INFO] [stdout]         910 │+        "description": "Node id from `query_tree`.",
[INFO] [stdout]         911 │+        "type": [
[INFO] [stdout]         912 │+          "string",
[INFO] [stdout]         913 │+          "null"
[INFO] [stdout]         914 │+        ]
[INFO] [stdout]         915 │+      },
[INFO] [stdout]         916 │+      "label_contains": {
[INFO] [stdout]         917 │+        "description": "Case-insensitive substring match against the node's `label` (its accessible name) only.\nNote that `Label`/monospace widgets carry their text in `value`, not `label` — for those,\nuse `content_contains` (or `value_contains`).",
[INFO] [stdout]         918 │+        "type": [
[INFO] [stdout]         919 │+          "string",
[INFO] [stdout]         920 │+          "null"
[INFO] [stdout]         921 │+        ]
[INFO] [stdout]         922 │+      },
[INFO] [stdout]         923 │+      "modifiers": {
[INFO] [stdout]         924 │+        "$ref": "#/$defs/PressKeyModifiers"
[INFO] [stdout]         925 │+      },
[INFO] [stdout]         926 │+      "pos": {
[INFO] [stdout]         927 │+        "anyOf": [
[INFO] [stdout]         928 │+          {
[INFO] [stdout]         929 │+            "$ref": "#/$defs/Pos2Lit"
[INFO] [stdout]         930 │+          },
[INFO] [stdout]         931 │+          {
[INFO] [stdout]         932 │+            "type": "null"
[INFO] [stdout]         933 │+          }
[INFO] [stdout]         934 │+        ],
[INFO] [stdout]         935 │+        "description": "Raw position in logical points (use instead of locator fields)."
[INFO] [stdout]         936 │+      },
[INFO] [stdout]         937 │+      "role": {
[INFO] [stdout]         938 │+        "description": "Role name, e.g. `Button`, `Label`, `TextInput` (case-insensitive).\nAn unrecognized role is rejected with an error that lists the roles present in the tree.",
[INFO] [stdout]         939 │+        "type": [
[INFO] [stdout]         940 │+          "string",
[INFO] [stdout]         941 │+          "null"
[INFO] [stdout]         942 │+        ]
[INFO] [stdout]         943 │+      },
[INFO] [stdout]         944 │+      "value_contains": {
[INFO] [stdout]         945 │+        "description": "Case-insensitive substring match against the node's `value` only (e.g. a text field's\ncontents, or a `Label`'s text).",
[INFO] [stdout]         946 │+        "type": [
[INFO] [stdout]         947 │+          "string",
[INFO] [stdout]         948 │+          "null"
[INFO] [stdout]         949 │+        ]
[INFO] [stdout]         950 │+      }
[INFO] [stdout]         951 │+    },
[INFO] [stdout]         952 │+    "required": [
[INFO] [stdout]         953 │+      "delta"
[INFO] [stdout]         954 │+    ],
[INFO] [stdout]         955 │+    "title": "ScrollArgs",
[INFO] [stdout]         956 │+    "type": "object"
[INFO] [stdout]         957 │+  }
[INFO] [stdout]         958 │+}
[INFO] [stdout]         959 │+
[INFO] [stdout]         960 │+## status
[INFO] [stdout]         961 │+
[INFO] [stdout]         962 │+{
[INFO] [stdout]         963 │+  "name": "status",
[INFO] [stdout]         964 │+  "description": "Report whether an app is connected and its peer info.",
[INFO] [stdout]         965 │+  "inputSchema": {
[INFO] [stdout]         966 │+    "$schema": "https://json-schema.org/draft/2020-12/schema",
[INFO] [stdout]         967 │+    "title": "EmptyArgs",
[INFO] [stdout]         968 │+    "type": "object"
[INFO] [stdout]         969 │+  }
[INFO] [stdout]         970 │+}
[INFO] [stdout]         971 │+
[INFO] [stdout]         972 │+## type_text
[INFO] [stdout]         973 │+
[INFO] [stdout]         974 │+{
[INFO] [stdout]         975 │+  "name": "type_text",
[INFO] [stdout]         976 │+  "description": "Type text into the currently focused widget.\nOptionally focus a node first (by `id`, `role`, or a text match — `content_contains`/`label_contains`/`value_contains`) — this uses an `AccessKit` focus request, not a click, so it won't move the cursor or clear an existing text selection.",
[INFO] [stdout]         977 │+  "inputSchema": {
[INFO] [stdout]         978 │+    "$schema": "https://json-schema.org/draft/2020-12/schema",
[INFO] [stdout]         979 │+    "description": "The widget-matching constraints shared by `query_tree`'s filter and the action `Target`s.\n\nAn optional `role` plus up to one text predicate. All are case-insensitive and combined with\nlogical AND; an all-`None` `Query` matches every node.",
[INFO] [stdout]         980 │+    "properties": {
[INFO] [stdout]         981 │+      "content_contains": {
[INFO] [stdout]         982 │+        "description": "Case-insensitive substring match against *either* `label` or `value`. Prefer this when you\njust want \"the widget showing this text\" and don't care which field holds it — it's the\nmost robust choice across widget kinds.",
[INFO] [stdout]         983 │+        "type": [
[INFO] [stdout]         984 │+          "string",
[INFO] [stdout]         985 │+          "null"
[INFO] [stdout]         986 │+        ]
[INFO] [stdout]         987 │+      },
[INFO] [stdout]         988 │+      "id": {
[INFO] [stdout]         989 │+        "default": null,
[INFO] [stdout]         990 │+        "description": "Optional focus target: node id from `query_tree` to focus before typing.\nOmit all locator fields to type into whatever is currently focused.",
[INFO] [stdout]         991 │+        "type": [
[INFO] [stdout]         992 │+          "string",
[INFO] [stdout]         993 │+          "null"
[INFO] [stdout]         994 │+        ]
[INFO] [stdout]         995 │+      },
[INFO] [stdout]         996 │+      "label_contains": {
[INFO] [stdout]         997 │+        "description": "Case-insensitive substring match against the node's `label` (its accessible name) only.\nNote that `Label`/monospace widgets carry their text in `value`, not `label` — for those,\nuse `content_contains` (or `value_contains`).",
[INFO] [stdout]         998 │+        "type": [
[INFO] [stdout]         999 │+          "string",
[INFO] [stdout]        1000 │+          "null"
[INFO] [stdout]        1001 │+        ]
[INFO] [stdout]        1002 │+      },
[INFO] [stdout]        1003 │+      "role": {
[INFO] [stdout]        1004 │+        "description": "Role name, e.g. `Button`, `Label`, `TextInput` (case-insensitive).\nAn unrecognized role is rejected with an error that lists the roles present in the tree.",
[INFO] [stdout]        1005 │+        "type": [
[INFO] [stdout]        1006 │+          "string",
[INFO] [stdout]        1007 │+          "null"
[INFO] [stdout]        1008 │+        ]
[INFO] [stdout]        1009 │+      },
[INFO] [stdout]        1010 │+      "text": {
[INFO] [stdout]        1011 │+        "type": "string"
[INFO] [stdout]        1012 │+      },
[INFO] [stdout]        1013 │+      "value_contains": {
[INFO] [stdout]        1014 │+        "description": "Case-insensitive substring match against the node's `value` only (e.g. a text field's\ncontents, or a `Label`'s text).",
[INFO] [stdout]        1015 │+        "type": [
[INFO] [stdout]        1016 │+          "string",
[INFO] [stdout]        1017 │+          "null"
[INFO] [stdout]        1018 │+        ]
[INFO] [stdout]        1019 │+      }
[INFO] [stdout]        1020 │+    },
[INFO] [stdout]        1021 │+    "required": [
[INFO] [stdout]        1022 │+      "text"
[INFO] [stdout]        1023 │+    ],
[INFO] [stdout]        1024 │+    "title": "TypeTextArgs",
[INFO] [stdout]        1025 │+    "type": "object"
[INFO] [stdout]        1026 │+  }
[INFO] [stdout]        1027 │+}
[INFO] [stdout]        1028 │+
[INFO] [stdout]        1029 │+## wait_for
[INFO] [stdout]        1030 │+
[INFO] [stdout]        1031 │+{
[INFO] [stdout]        1032 │+  "name": "wait_for",
[INFO] [stdout]        1033 │+  "description": "Poll the widget tree until its conditions hold, or until `timeout_secs` elapses.\nWaits until at least `min_matches` visible nodes match the filter (when one is given) *and* at least `min_steps` frames have rendered since the call began.\nThe text filter is `role` and/or one of `content_contains` (matches `label` or `value` — prefer this; e.g. monospace/`Label` text lives in `value`), `label_contains`, `value_contains`.\nRequires a filter (`content_contains`/`role`/`label_contains`/`value_contains`) or a non-zero `min_steps`.",
[INFO] [stdout]        1034 │+  "inputSchema": {
[INFO] [stdout]        1035 │+    "$schema": "https://json-schema.org/draft/2020-12/schema",
[INFO] [stdout]        1036 │+    "description": "The widget-matching constraints shared by `query_tree`'s filter and the action `Target`s.\n\nAn optional `role` plus up to one text predicate. All are case-insensitive and combined with\nlogical AND; an all-`None` `Query` matches every node.",
[INFO] [stdout]        1037 │+    "properties": {
[INFO] [stdout]        1038 │+      "content_contains": {
[INFO] [stdout]        1039 │+        "description": "Case-insensitive substring match against *either* `label` or `value`. Prefer this when you\njust want \"the widget showing this text\" and don't care which field holds it — it's the\nmost robust choice across widget kinds.",
[INFO] [stdout]        1040 │+        "type": [
[INFO] [stdout]        1041 │+          "string",
[INFO] [stdout]        1042 │+          "null"
[INFO] [stdout]        1043 │+        ]
[INFO] [stdout]        1044 │+      },
[INFO] [stdout]        1045 │+      "label_contains": {
[INFO] [stdout]        1046 │+        "description": "Case-insensitive substring match against the node's `label` (its accessible name) only.\nNote that `Label`/monospace widgets carry their text in `value`, not `label` — for those,\nuse `content_contains` (or `value_contains`).",
[INFO] [stdout]        1047 │+        "type": [
[INFO] [stdout]        1048 │+          "string",
[INFO] [stdout]        1049 │+          "null"
[INFO] [stdout]        1050 │+        ]
[INFO] [stdout]        1051 │+      },
[INFO] [stdout]        1052 │+      "min_matches": {
[INFO] [stdout]        1053 │+        "default": 1,
[INFO] [stdout]        1054 │+        "format": "uint32",
[INFO] [stdout]        1055 │+        "minimum": 0,
[INFO] [stdout]        1056 │+        "type": "integer"
[INFO] [stdout]        1057 │+      },
[INFO] [stdout]        1058 │+      "min_steps": {
[INFO] [stdout]        1059 │+        "default": 0,
[INFO] [stdout]        1060 │+        "description": "Also wait until at least this many frames have rendered since the call began.\nUse it to let animations, tooltips, or other time/frame-driven UI settle (e.g. after a `hover`); `0` means don't wait for frames.",
[INFO] [stdout]        1061 │+        "format": "uint64",
[INFO] [stdout]        1062 │+        "minimum": 0,
[INFO] [stdout]        1063 │+        "type": "integer"
[INFO] [stdout]        1064 │+      },
[INFO] [stdout]        1065 │+      "role": {
[INFO] [stdout]        1066 │+        "description": "Role name, e.g. `Button`, `Label`, `TextInput` (case-insensitive).\nAn unrecognized role is rejected with an error that lists the roles present in the tree.",
[INFO] [stdout]        1067 │+        "type": [
[INFO] [stdout]        1068 │+          "string",
[INFO] [stdout]        1069 │+          "null"
[INFO] [stdout]        1070 │+        ]
[INFO] [stdout]        1071 │+      },
[INFO] [stdout]        1072 │+      "timeout_secs": {
[INFO] [stdout]        1073 │+        "default": 5,
[INFO] [stdout]        1074 │+        "format": "uint64",
[INFO] [stdout]        1075 │+        "minimum": 0,
[INFO] [stdout]        1076 │+        "type": "integer"
[INFO] [stdout]        1077 │+      },
[INFO] [stdout]        1078 │+      "value_contains": {
[INFO] [stdout]        1079 │+        "description": "Case-insensitive substring match against the node's `value` only (e.g. a text field's\ncontents, or a `Label`'s text).",
[INFO] [stdout]        1080 │+        "type": [
[INFO] [stdout]        1081 │+          "string",
[INFO] [stdout]        1082 │+          "null"
[INFO] [stdout]        1083 │+        ]
[INFO] [stdout]        1084 │+      }
[INFO] [stdout]        1085 │+    },
[INFO] [stdout]        1086 │+    "title": "WaitForArgs",
[INFO] [stdout]        1087 │+    "type": "object"
[INFO] [stdout]        1088 │+  }
[INFO] [stdout]        1089 │+}
[INFO] [stdout] ────────────┴───────────────────────────────────────────────────────────────────
[INFO] [stdout] 
[INFO] [stdout] thread 'tools::tests::agent_surface_snapshot' (2584) panicked at src/tools.rs:1088:9:
[INFO] [stdout] called `Result::unwrap()` on an `Err` value: Os { code: 30, kind: ReadOnlyFilesystem, message: "Read-only file system" }
[INFO] [stdout] stack backtrace:
[INFO] [stdout]    0:     0x5973a325e648 - std[10d71ac2c42b111e]::backtrace_rs::backtrace::libunwind::trace
[INFO] [stdout]                                at /rustc/b2282dd5646a57d570fc86fbe8df0e8826665ef6/library/std/src/../../backtrace/src/backtrace/libunwind.rs:117:9
[INFO] [stdout]    1:     0x5973a325e648 - std[10d71ac2c42b111e]::backtrace_rs::backtrace::trace_unsynchronized::<std[10d71ac2c42b111e]::sys::backtrace::_print_fmt::{closure#1}>
[INFO] [stdout]                                at /rustc/b2282dd5646a57d570fc86fbe8df0e8826665ef6/library/std/src/../../backtrace/src/backtrace/mod.rs:66:14
[INFO] [stdout]    2:     0x5973a325e648 - std[10d71ac2c42b111e]::sys::backtrace::_print_fmt
[INFO] [stdout]                                at /rustc/b2282dd5646a57d570fc86fbe8df0e8826665ef6/library/std/src/sys/backtrace.rs:74:9
[INFO] [stdout]    3:     0x5973a325e648 - <<std[10d71ac2c42b111e]::sys::backtrace::BacktraceLock>::print::DisplayBacktrace as core[8fb95b77d25ab6c8]::fmt::Display>::fmt
[INFO] [stdout]                                at /rustc/b2282dd5646a57d570fc86fbe8df0e8826665ef6/library/std/src/sys/backtrace.rs:44:26
[INFO] [stdout]    4:     0x5973a327643a - <core[8fb95b77d25ab6c8]::fmt::rt::Argument>::fmt
[INFO] [stdout]                                at /rustc/b2282dd5646a57d570fc86fbe8df0e8826665ef6/library/core/src/fmt/rt.rs:152:76
[INFO] [stdout]    5:     0x5973a327643a - core[8fb95b77d25ab6c8]::fmt::write
[INFO] [stdout]    6:     0x5973a3263962 - std[10d71ac2c42b111e]::io::default_write_fmt::<alloc[a7ee25936407c584]::vec::Vec<u8>>
[INFO] [stdout]                                at /rustc/b2282dd5646a57d570fc86fbe8df0e8826665ef6/library/std/src/io/mod.rs:622:11
[INFO] [stdout]    7:     0x5973a3263962 - <alloc[a7ee25936407c584]::vec::Vec<u8> as std[10d71ac2c42b111e]::io::Write>::write_fmt
[INFO] [stdout]                                at /rustc/b2282dd5646a57d570fc86fbe8df0e8826665ef6/library/std/src/io/mod.rs:1977:13
[INFO] [stdout]    8:     0x5973a3239d86 - <std[10d71ac2c42b111e]::sys::backtrace::BacktraceLock>::print
[INFO] [stdout]                                at /rustc/b2282dd5646a57d570fc86fbe8df0e8826665ef6/library/std/src/sys/backtrace.rs:47:9
[INFO] [stdout]    9:     0x5973a3239d86 - std[10d71ac2c42b111e]::panicking::default_hook::{closure#0}
[INFO] [stdout]                                at /rustc/b2282dd5646a57d570fc86fbe8df0e8826665ef6/library/std/src/panicking.rs:292:27
[INFO] [stdout]   10:     0x5973a3255569 - std[10d71ac2c42b111e]::panicking::default_hook
[INFO] [stdout]                                at /rustc/b2282dd5646a57d570fc86fbe8df0e8826665ef6/library/std/src/panicking.rs:316:9
[INFO] [stdout]   11:     0x5973a30aee3c - <alloc[a7ee25936407c584]::boxed::Box<dyn for<'a, 'b> core[8fb95b77d25ab6c8]::ops::function::Fn<(&'a std[10d71ac2c42b111e]::panic::PanicHookInfo<'b>,), Output = ()> + core[8fb95b77d25ab6c8]::marker::Sync + core[8fb95b77d25ab6c8]::marker::Send> as core[8fb95b77d25ab6c8]::ops::function::Fn<(&std[10d71ac2c42b111e]::panic::PanicHookInfo,)>>::call
[INFO] [stdout]                                at /rustc/b2282dd5646a57d570fc86fbe8df0e8826665ef6/library/alloc/src/boxed.rs:2289:9
[INFO] [stdout]   12:     0x5973a30aee3c - test[213991da798b1c03]::test_main_inner::<test[213991da798b1c03]::test_main_static::{closure#0}>::{closure#0}
[INFO] [stdout]                                at /rustc/b2282dd5646a57d570fc86fbe8df0e8826665ef6/library/test/src/lib.rs:155:21
[INFO] [stdout]   13:     0x5973a32557e2 - <alloc[a7ee25936407c584]::boxed::Box<dyn for<'a, 'b> core[8fb95b77d25ab6c8]::ops::function::Fn<(&'a std[10d71ac2c42b111e]::panic::PanicHookInfo<'b>,), Output = ()> + core[8fb95b77d25ab6c8]::marker::Sync + core[8fb95b77d25ab6c8]::marker::Send> as core[8fb95b77d25ab6c8]::ops::function::Fn<(&std[10d71ac2c42b111e]::panic::PanicHookInfo,)>>::call
[INFO] [stdout]                                at /rustc/b2282dd5646a57d570fc86fbe8df0e8826665ef6/library/alloc/src/boxed.rs:2289:9
[INFO] [stdout]   14:     0x5973a32557e2 - std[10d71ac2c42b111e]::panicking::panic_with_hook
[INFO] [stdout]                                at /rustc/b2282dd5646a57d570fc86fbe8df0e8826665ef6/library/std/src/panicking.rs:833:13
[INFO] [stdout]   15:     0x5973a3239e42 - std[10d71ac2c42b111e]::panicking::panic_handler::{closure#0}
[INFO] [stdout]                                at /rustc/b2282dd5646a57d570fc86fbe8df0e8826665ef6/library/std/src/panicking.rs:698:13
[INFO] [stdout]   16:     0x5973a322eb99 - std[10d71ac2c42b111e]::sys::backtrace::__rust_end_short_backtrace::<std[10d71ac2c42b111e]::panicking::panic_handler::{closure#0}, !>
[INFO] [stdout]                                at /rustc/b2282dd5646a57d570fc86fbe8df0e8826665ef6/library/std/src/sys/backtrace.rs:182:18
[INFO] [stdout]   17:     0x5973a323adbd - __rustc[3be9ba60078d4c86]::rust_begin_unwind
[INFO] [stdout]                                at /rustc/b2282dd5646a57d570fc86fbe8df0e8826665ef6/library/std/src/panicking.rs:689:5
[INFO] [stdout]   18:     0x5973a3276bfc - core[8fb95b77d25ab6c8]::panicking::panic_fmt
[INFO] [stdout]                                at /rustc/b2282dd5646a57d570fc86fbe8df0e8826665ef6/library/core/src/panicking.rs:80:14
[INFO] [stdout]   19:     0x5973a3276972 - core[8fb95b77d25ab6c8]::result::unwrap_failed
[INFO] [stdout]                                at /rustc/b2282dd5646a57d570fc86fbe8df0e8826665ef6/library/core/src/result.rs:1867:5
[INFO] [stdout]   20:     0x5973a2f55d06 - <core[8fb95b77d25ab6c8]::result::Result<(), alloc[a7ee25936407c584]::boxed::Box<dyn core[8fb95b77d25ab6c8]::error::Error>>>::unwrap
[INFO] [stdout]                                at /rustc/b2282dd5646a57d570fc86fbe8df0e8826665ef6/library/core/src/result.rs:1233:23
[INFO] [stdout]   21:     0x5973a2f55d06 - egui_mcp[eb43c0020fd24fc1]::tools::tests::agent_surface_snapshot
[INFO] [stdout]                                at /opt/rustwide/workdir/src/tools.rs:1088:9
[INFO] [stdout]   22:     0x5973a2f50137 - egui_mcp[eb43c0020fd24fc1]::tools::tests::agent_surface_snapshot::{closure#0}
[INFO] [stdout]                                at /opt/rustwide/workdir/src/tools.rs:1066:32
[INFO] [stdout]   23:     0x5973a2ecfac6 - <egui_mcp[eb43c0020fd24fc1]::tools::tests::agent_surface_snapshot::{closure#0} as core[8fb95b77d25ab6c8]::ops::function::FnOnce<()>>::call_once
[INFO] [stdout]                                at /rustc/b2282dd5646a57d570fc86fbe8df0e8826665ef6/library/core/src/ops/function.rs:250:5
[INFO] [stdout]   24:     0x5973a30a1f1b - <fn() -> core[8fb95b77d25ab6c8]::result::Result<(), alloc[a7ee25936407c584]::string::String> as core[8fb95b77d25ab6c8]::ops::function::FnOnce<()>>::call_once
[INFO] [stdout]                                at /rustc/b2282dd5646a57d570fc86fbe8df0e8826665ef6/library/core/src/ops/function.rs:250:5
[INFO] [stdout]   25:     0x5973a30a1f1b - test[213991da798b1c03]::__rust_begin_short_backtrace::<core[8fb95b77d25ab6c8]::result::Result<(), alloc[a7ee25936407c584]::string::String>, fn() -> core[8fb95b77d25ab6c8]::result::Result<(), alloc[a7ee25936407c584]::string::String>>
[INFO] [stdout]                                at /rustc/b2282dd5646a57d570fc86fbe8df0e8826665ef6/library/test/src/lib.rs:724:18
[INFO] [stdout]   26:     0x5973a30af795 - test[213991da798b1c03]::run_test_in_process::{closure#0}
[INFO] [stdout]                                at /rustc/b2282dd5646a57d570fc86fbe8df0e8826665ef6/library/test/src/lib.rs:747:74
[INFO] [stdout]   27:     0x5973a30af795 - <core[8fb95b77d25ab6c8]::panic::unwind_safe::AssertUnwindSafe<test[213991da798b1c03]::run_test_in_process::{closure#0}> as core[8fb95b77d25ab6c8]::ops::function::FnOnce<()>>::call_once
[INFO] [stdout]                                at /rustc/b2282dd5646a57d570fc86fbe8df0e8826665ef6/library/core/src/panic/unwind_safe.rs:275:9
[INFO] [stdout]   28:     0x5973a30af795 - std[10d71ac2c42b111e]::panicking::catch_unwind::do_call::<core[8fb95b77d25ab6c8]::panic::unwind_safe::AssertUnwindSafe<test[213991da798b1c03]::run_test_in_process::{closure#0}>, core[8fb95b77d25ab6c8]::result::Result<(), alloc[a7ee25936407c584]::string::String>>
[INFO] [stdout]                                at /rustc/b2282dd5646a57d570fc86fbe8df0e8826665ef6/library/std/src/panicking.rs:581:40
[INFO] [stdout]   29:     0x5973a30af795 - std[10d71ac2c42b111e]::panicking::catch_unwind::<core[8fb95b77d25ab6c8]::result::Result<(), alloc[a7ee25936407c584]::string::String>, core[8fb95b77d25ab6c8]::panic::unwind_safe::AssertUnwindSafe<test[213991da798b1c03]::run_test_in_process::{closure#0}>>
[INFO] [stdout]                                at /rustc/b2282dd5646a57d570fc86fbe8df0e8826665ef6/library/std/src/panicking.rs:544:19
[INFO] [stdout]   30:     0x5973a30af795 - std[10d71ac2c42b111e]::panic::catch_unwind::<core[8fb95b77d25ab6c8]::panic::unwind_safe::AssertUnwindSafe<test[213991da798b1c03]::run_test_in_process::{closure#0}>, core[8fb95b77d25ab6c8]::result::Result<(), alloc[a7ee25936407c584]::string::String>>
[INFO] [stdout]                                at /rustc/b2282dd5646a57d570fc86fbe8df0e8826665ef6/library/std/src/panic.rs:359:14
[INFO] [stdout]   31:     0x5973a30af795 - test[213991da798b1c03]::run_test_in_process
[INFO] [stdout]                                at /rustc/b2282dd5646a57d570fc86fbe8df0e8826665ef6/library/test/src/lib.rs:747:27
[INFO] [stdout]   32:     0x5973a30af795 - test[213991da798b1c03]::run_test::{closure#0}
[INFO] [stdout]                                at /rustc/b2282dd5646a57d570fc86fbe8df0e8826665ef6/library/test/src/lib.rs:668:43
[INFO] [stdout]   33:     0x5973a30a90a4 - test[213991da798b1c03]::run_test::{closure#1}
[INFO] [stdout]                                at /rustc/b2282dd5646a57d570fc86fbe8df0e8826665ef6/library/test/src/lib.rs:698:41
[INFO] [stdout]   34:     0x5973a30a90a4 - std[10d71ac2c42b111e]::sys::backtrace::__rust_begin_short_backtrace::<test[213991da798b1c03]::run_test::{closure#1}, ()>
[INFO] [stdout]                                at /rustc/b2282dd5646a57d570fc86fbe8df0e8826665ef6/library/std/src/sys/backtrace.rs:166:18
[INFO] [stdout]   35:     0x5973a30b2812 - std[10d71ac2c42b111e]::thread::lifecycle::spawn_unchecked::<test[213991da798b1c03]::run_test::{closure#1}, ()>::{closure#1}::{closure#0}
[INFO] [stdout]                                at /rustc/b2282dd5646a57d570fc86fbe8df0e8826665ef6/library/std/src/thread/lifecycle.rs:70:13
[INFO] [stdout]   36:     0x5973a30b2812 - <core[8fb95b77d25ab6c8]::panic::unwind_safe::AssertUnwindSafe<std[10d71ac2c42b111e]::thread::lifecycle::spawn_unchecked<test[213991da798b1c03]::run_test::{closure#1}, ()>::{closure#1}::{closure#0}> as core[8fb95b77d25ab6c8]::ops::function::FnOnce<()>>::call_once
[INFO] [stdout]                                at /rustc/b2282dd5646a57d570fc86fbe8df0e8826665ef6/library/core/src/panic/unwind_safe.rs:275:9
[INFO] [stdout]   37:     0x5973a30b2812 - std[10d71ac2c42b111e]::panicking::catch_unwind::do_call::<core[8fb95b77d25ab6c8]::panic::unwind_safe::AssertUnwindSafe<std[10d71ac2c42b111e]::thread::lifecycle::spawn_unchecked<test[213991da798b1c03]::run_test::{closure#1}, ()>::{closure#1}::{closure#0}>, ()>
[INFO] [stdout]                                at /rustc/b2282dd5646a57d570fc86fbe8df0e8826665ef6/library/std/src/panicking.rs:581:40
[INFO] [stdout]   38:     0x5973a30b2812 - std[10d71ac2c42b111e]::panicking::catch_unwind::<(), core[8fb95b77d25ab6c8]::panic::unwind_safe::AssertUnwindSafe<std[10d71ac2c42b111e]::thread::lifecycle::spawn_unchecked<test[213991da798b1c03]::run_test::{closure#1}, ()>::{closure#1}::{closure#0}>>
[INFO] [stdout]                                at /rustc/b2282dd5646a57d570fc86fbe8df0e8826665ef6/library/std/src/panicking.rs:544:19
[INFO] [stdout]   39:     0x5973a30b2812 - std[10d71ac2c42b111e]::panic::catch_unwind::<core[8fb95b77d25ab6c8]::panic::unwind_safe::AssertUnwindSafe<std[10d71ac2c42b111e]::thread::lifecycle::spawn_unchecked<test[213991da798b1c03]::run_test::{closure#1}, ()>::{closure#1}::{closure#0}>, ()>
[INFO] [stdout]                                at /rustc/b2282dd5646a57d570fc86fbe8df0e8826665ef6/library/std/src/panic.rs:359:14
[INFO] [stdout]   40:     0x5973a30b2812 - std[10d71ac2c42b111e]::thread::lifecycle::spawn_unchecked::<test[213991da798b1c03]::run_test::{closure#1}, ()>::{closure#1}
[INFO] [stdout]                                at /rustc/b2282dd5646a57d570fc86fbe8df0e8826665ef6/library/std/src/thread/lifecycle.rs:68:26
[INFO] [stdout]   41:     0x5973a30b2812 - <std[10d71ac2c42b111e]::thread::lifecycle::spawn_unchecked<test[213991da798b1c03]::run_test::{closure#1}, ()>::{closure#1} as core[8fb95b77d25ab6c8]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0}
[INFO] [stdout]                                at /rustc/b2282dd5646a57d570fc86fbe8df0e8826665ef6/library/core/src/ops/function.rs:250:5
[INFO] [stdout]   42:     0x5973a325d5bf - <alloc[a7ee25936407c584]::boxed::Box<dyn core[8fb95b77d25ab6c8]::ops::function::FnOnce<(), Output = ()> + core[8fb95b77d25ab6c8]::marker::Send> as core[8fb95b77d25ab6c8]::ops::function::FnOnce<()>>::call_once
[INFO] [stdout]                                at /rustc/b2282dd5646a57d570fc86fbe8df0e8826665ef6/library/alloc/src/boxed.rs:2275:9
[INFO] [stdout]   43:     0x5973a325d5bf - <std[10d71ac2c42b111e]::sys::thread::unix::Thread>::new::thread_start
[INFO] [stdout]                                at /rustc/b2282dd5646a57d570fc86fbe8df0e8826665ef6/library/std/src/sys/thread/unix.rs:118:17
[INFO] [stdout]   44:     0x7672e2da7aa4 - <unknown>
[INFO] [stdout]   45:     0x7672e2e34a64 - clone
[INFO] [stdout]   46:                0x0 - <unknown>
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] failures:
[INFO] [stdout]     tools::tests::agent_surface_snapshot
[INFO] [stdout] 
[INFO] [stdout] test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.90s
[INFO] [stdout] 
[INFO] running `Command { std: "docker" "inspect" "8339667d9949e05d44cee69c20d1d221004e7ce1158c8b3f35800e2739d1da5c", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "8339667d9949e05d44cee69c20d1d221004e7ce1158c8b3f35800e2739d1da5c", kill_on_drop: false }`
[INFO] [stdout] 8339667d9949e05d44cee69c20d1d221004e7ce1158c8b3f35800e2739d1da5c
