@kaeawc/auto-mobile 0.0.45 → 0.0.47

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/README.md +3 -3
  2. package/README.md.backup +3 -3
  3. package/dist/schemas/test-plan.schema.json +129 -6
  4. package/dist/schemas/tool-definitions.json +1725 -285
  5. package/dist/src/db/migrations/2026_07_24_000_device_locks.ts +27 -0
  6. package/dist/src/db/migrations/2026_07_27_000_session_tool_capabilities.ts +17 -0
  7. package/dist/src/index.js +457 -444
  8. package/dist/src/index.js.map +1 -1
  9. package/package.json +9 -7
  10. package/schemas/test-plan.schema.json +129 -6
  11. package/schemas/tool-definitions.json +1725 -285
  12. package/dist/ios/screen-capture/Package.swift +0 -35
  13. package/dist/ios/screen-capture/Sources/ScreenCaptureCore/AudioPcm16Encoder.swift +0 -22
  14. package/dist/ios/screen-capture/Sources/ScreenCaptureCore/CommandLineOptions.swift +0 -152
  15. package/dist/ios/screen-capture/Sources/ScreenCaptureCore/DeviceInfo.swift +0 -25
  16. package/dist/ios/screen-capture/Sources/ScreenCaptureCore/FrameProtocol.swift +0 -113
  17. package/dist/ios/screen-capture/Sources/ScreenCaptureCore/FrameWriter.swift +0 -62
  18. package/dist/ios/screen-capture/Sources/ScreenCaptureCore/SimulatorWindowInfo.swift +0 -51
  19. package/dist/ios/screen-capture/Sources/ScreenCaptureHelper/AudioSampleBuffer.swift +0 -41
  20. package/dist/ios/screen-capture/Sources/ScreenCaptureHelper/CMIOSystem.swift +0 -26
  21. package/dist/ios/screen-capture/Sources/ScreenCaptureHelper/DeviceCaptureSession.swift +0 -117
  22. package/dist/ios/screen-capture/Sources/ScreenCaptureHelper/DeviceDiscovery.swift +0 -29
  23. package/dist/ios/screen-capture/Sources/ScreenCaptureHelper/FrameWriter+PixelBuffer.swift +0 -25
  24. package/dist/ios/screen-capture/Sources/ScreenCaptureHelper/SimulatorCaptureSession.swift +0 -159
  25. package/dist/ios/screen-capture/Sources/ScreenCaptureHelper/SimulatorWindowDiscovery.swift +0 -37
  26. package/dist/ios/screen-capture/Sources/ScreenCaptureHelper/main.swift +0 -255
  27. package/dist/ios/screen-capture/Tests/ScreenCaptureCoreTests/AudioPcm16EncoderTests.swift +0 -17
  28. package/dist/ios/screen-capture/Tests/ScreenCaptureCoreTests/CommandLineOptionsTests.swift +0 -181
  29. package/dist/ios/screen-capture/Tests/ScreenCaptureCoreTests/DeviceInfoTests.swift +0 -35
  30. package/dist/ios/screen-capture/Tests/ScreenCaptureCoreTests/FrameProtocolTests.swift +0 -123
  31. package/dist/ios/screen-capture/Tests/ScreenCaptureCoreTests/FrameWriterTests.swift +0 -62
  32. package/dist/ios/screen-capture/Tests/ScreenCaptureCoreTests/SimulatorAudioCaptureAvailabilityTests.swift +0 -27
  33. package/dist/ios/screen-capture/Tests/ScreenCaptureCoreTests/SimulatorWindowInfoTests.swift +0 -40
@@ -790,6 +790,24 @@
790
790
  "__lockNamespace": {
791
791
  "description": "Internal plan-scoped lock namespace (injected)",
792
792
  "type": "string"
793
+ },
794
+ "platform": {
795
+ "type": "string",
796
+ "enum": [
797
+ "android",
798
+ "ios"
799
+ ]
800
+ },
801
+ "sessionUuid": {
802
+ "description": "Session",
803
+ "type": "string"
804
+ },
805
+ "keepScreenAwake": {
806
+ "type": "boolean"
807
+ },
808
+ "device": {
809
+ "description": "Device label",
810
+ "type": "string"
793
811
  }
794
812
  },
795
813
  "required": [
@@ -985,25 +1003,6 @@
985
1003
  }
986
1004
  }
987
1005
  },
988
- {
989
- "name": "doctor",
990
- "description": "Run AutoMobile setup diagnostics",
991
- "inputSchema": {
992
- "$schema": "https://json-schema.org/draft/2020-12/schema",
993
- "type": "object",
994
- "properties": {
995
- "android": {
996
- "description": "Run Android-specific checks only",
997
- "type": "boolean"
998
- },
999
- "ios": {
1000
- "description": "Run iOS-specific checks only",
1001
- "type": "boolean"
1002
- }
1003
- },
1004
- "additionalProperties": false
1005
- }
1006
- },
1007
1006
  {
1008
1007
  "name": "dragAndDrop",
1009
1008
  "description": "Drag and drop element",
@@ -2615,12 +2614,13 @@
2615
2614
  "minLength": 1
2616
2615
  },
2617
2616
  "mode": {
2618
- "description": "Android text mode: a11y default; eventLast helps autocomplete; eventAll sends key events",
2617
+ "description": "Android text mode: a11y default; eventLast and eventAll start with accessibility setText; eventOnly clears and types supported ASCII with key events only",
2619
2618
  "type": "string",
2620
2619
  "enum": [
2621
2620
  "a11y",
2622
2621
  "eventLast",
2623
- "eventAll"
2622
+ "eventAll",
2623
+ "eventOnly"
2624
2624
  ]
2625
2625
  },
2626
2626
  "imeAction": {
@@ -3091,38 +3091,54 @@
3091
3091
  "waitFor": {
3092
3092
  "type": "object",
3093
3093
  "additionalProperties": false,
3094
- "description": "Wait for a predicate before returning the observation. Provide at least one of: elementId, text, textAny, className, contentDescription, or activeWindow. textAny is mutually exclusive with the element predicates.",
3094
+ "not": {
3095
+ "required": [
3096
+ "timeout",
3097
+ "timeoutMs"
3098
+ ]
3099
+ },
3095
3100
  "properties": {
3096
- "elementId": {
3101
+ "for": {
3097
3102
  "type": "string",
3098
- "description": "Element resource ID / accessibility identifier"
3103
+ "enum": [
3104
+ "appear",
3105
+ "disappear",
3106
+ "clickable",
3107
+ "textEquals",
3108
+ "countStable",
3109
+ "stable"
3110
+ ]
3111
+ },
3112
+ "pollMs": {
3113
+ "type": "number"
3114
+ },
3115
+ "stableReads": {
3116
+ "type": "number"
3117
+ },
3118
+ "elementId": {
3119
+ "type": "string"
3099
3120
  },
3100
3121
  "text": {
3101
- "type": "string",
3102
- "description": "Element text"
3122
+ "type": "string"
3103
3123
  },
3104
3124
  "textAny": {
3105
3125
  "type": "array",
3106
3126
  "items": {
3107
3127
  "type": "string"
3108
- },
3109
- "description": "Ordered text variants; first visible match wins"
3128
+ }
3110
3129
  },
3111
3130
  "className": {
3112
- "type": "string",
3113
- "description": "Element class name"
3131
+ "type": "string"
3114
3132
  },
3115
3133
  "contentDescription": {
3116
- "type": "string",
3117
- "description": "Element content description / accessibility label"
3134
+ "type": "string"
3118
3135
  },
3119
3136
  "matchType": {
3120
3137
  "type": "string",
3121
3138
  "enum": [
3122
3139
  "all",
3123
3140
  "any"
3124
- ],
3125
- "description": "Whether element predicates must all match one node, or any one may match"
3141
+ ]
3126
3142
  },
3127
3143
  "textMatch": {
3128
3144
  "type": "string",
@@ -3136,23 +3152,18 @@
3136
3152
  "activeWindow": {
3137
3153
  "type": "object",
3138
3154
  "additionalProperties": false,
3139
- "description": "Foreground app/window predicates (provide an app id or activityName)",
3140
3155
  "properties": {
3141
3156
  "appId": {
3142
- "type": "string",
3143
- "description": "Foreground app bundle ID / package name"
3157
+ "type": "string"
3144
3158
  },
3145
3159
  "packageName": {
3146
- "type": "string",
3147
- "description": "Alias for appId (Android package name)"
3160
+ "type": "string"
3148
3161
  },
3149
3162
  "bundleId": {
3150
- "type": "string",
3151
- "description": "Alias for appId (iOS bundle ID)"
3163
+ "type": "string"
3152
3164
  },
3153
3165
  "activityName": {
3154
- "type": "string",
3155
- "description": "Foreground Android activity name (Android-only)"
3166
+ "type": "string"
3156
3167
  }
3157
3168
  },
3158
3169
  "anyOf": [
@@ -3178,9 +3189,49 @@
3178
3189
  }
3179
3190
  ]
3180
3191
  },
3192
+ "absent": {
3193
+ "type": "object",
3194
+ "additionalProperties": false,
3195
+ "description": "Wait until an element matching these fields is absent (text uses contains match)",
3196
+ "properties": {
3197
+ "elementId": {
3198
+ "type": "string"
3199
+ },
3200
+ "text": {
3201
+ "type": "string"
3202
+ },
3203
+ "className": {
3204
+ "type": "string"
3205
+ },
3206
+ "contentDescription": {
3207
+ "type": "string"
3208
+ }
3209
+ },
3210
+ "anyOf": [
3211
+ {
3212
+ "required": [
3213
+ "elementId"
3214
+ ]
3215
+ },
3216
+ {
3217
+ "required": [
3218
+ "text"
3219
+ ]
3220
+ },
3221
+ {
3222
+ "required": [
3223
+ "className"
3224
+ ]
3225
+ },
3226
+ {
3227
+ "required": [
3228
+ "contentDescription"
3229
+ ]
3230
+ }
3231
+ ]
3232
+ },
3181
3233
  "container": {
3182
3234
  "type": "object",
3183
- "description": "Scope the match to a container element (by elementId or text)",
3184
3235
  "properties": {
3185
3236
  "elementId": {
3186
3237
  "type": "string"
@@ -3188,14 +3239,73 @@
3188
3239
  "text": {
3189
3240
  "type": "string"
3190
3241
  }
3191
- }
3242
+ },
3243
+ "additionalProperties": false,
3244
+ "oneOf": [
3245
+ {
3246
+ "required": [
3247
+ "elementId"
3248
+ ]
3249
+ },
3250
+ {
3251
+ "required": [
3252
+ "text"
3253
+ ]
3254
+ }
3255
+ ]
3192
3256
  },
3193
3257
  "timeout": {
3194
- "type": "number",
3195
- "description": "Wait timeout ms (default 5000)"
3258
+ "type": "number"
3259
+ },
3260
+ "timeoutMs": {
3261
+ "type": "number"
3196
3262
  }
3197
3263
  },
3198
3264
  "anyOf": [
3265
+ {
3266
+ "properties": {
3267
+ "for": {
3268
+ "const": "stable"
3269
+ }
3270
+ },
3271
+ "required": [
3272
+ "for"
3273
+ ],
3274
+ "not": {
3275
+ "required": [
3276
+ "container"
3277
+ ]
3278
+ }
3279
+ },
3280
+ {
3281
+ "properties": {
3282
+ "for": {
3283
+ "not": {
3284
+ "enum": [
3285
+ "stable",
3286
+ "textEquals"
3287
+ ]
3288
+ }
3289
+ }
3290
+ },
3291
+ "required": [
3292
+ "for",
3293
+ "elementId"
3294
+ ]
3295
+ },
3296
+ {
3297
+ "properties": {
3298
+ "for": {
3299
+ "not": {
3300
+ "const": "stable"
3301
+ }
3302
+ }
3303
+ },
3304
+ "required": [
3305
+ "for",
3306
+ "text"
3307
+ ]
3308
+ },
3199
3309
  {
3200
3310
  "required": [
3201
3311
  "textAny"
@@ -3237,8 +3347,17 @@
3237
3347
  },
3238
3348
  {
3239
3349
  "not": {
3240
- "required": [
3241
- "textAny"
3350
+ "anyOf": [
3351
+ {
3352
+ "required": [
3353
+ "textAny"
3354
+ ]
3355
+ },
3356
+ {
3357
+ "required": [
3358
+ "for"
3359
+ ]
3360
+ }
3242
3361
  ]
3243
3362
  },
3244
3363
  "anyOf": [
@@ -3266,19 +3385,121 @@
3266
3385
  "required": [
3267
3386
  "activeWindow"
3268
3387
  ]
3388
+ },
3389
+ {
3390
+ "required": [
3391
+ "absent"
3392
+ ]
3269
3393
  }
3270
3394
  ]
3271
3395
  }
3272
3396
  ]
3273
3397
  },
3398
+ "settled": {
3399
+ "description": "After waitFor matches, wait for a quiet hierarchy period (requires waitFor)",
3400
+ "type": "object",
3401
+ "properties": {
3402
+ "quietPeriodMs": {
3403
+ "type": "integer",
3404
+ "exclusiveMinimum": 0,
3405
+ "maximum": 9007199254740991,
3406
+ "description": "Quiet-period ms (no hierarchy change) required after waitFor matches"
3407
+ }
3408
+ },
3409
+ "required": [
3410
+ "quietPeriodMs"
3411
+ ],
3412
+ "additionalProperties": false
3413
+ },
3274
3414
  "raw": {
3275
3415
  "description": "Include raw view hierarchy",
3276
3416
  "type": "boolean"
3277
3417
  },
3418
+ "project": {
3419
+ "description": "Output projection. 'full' (default) returns the whole view hierarchy; 'skeleton' returns a flat, actionable-only list (id/label/bounds/affordances) in place of viewHierarchy/elements. Each skeleton id/label is directly usable as a tapOn selector; re-request with raw/project:'full' to disambiguate.",
3420
+ "type": "string",
3421
+ "enum": [
3422
+ "full",
3423
+ "skeleton"
3424
+ ]
3425
+ },
3278
3426
  "skipBackStack": {
3279
3427
  "description": "Skip back stack during waitFor polling",
3280
3428
  "type": "boolean"
3281
3429
  },
3430
+ "scope": {
3431
+ "type": "object",
3432
+ "properties": {
3433
+ "focus": {
3434
+ "anyOf": [
3435
+ {
3436
+ "type": "boolean"
3437
+ },
3438
+ {
3439
+ "type": "object",
3440
+ "properties": {
3441
+ "resourceId": {
3442
+ "description": "Anchor by exact resource-id",
3443
+ "type": "string"
3444
+ },
3445
+ "text": {
3446
+ "description": "Anchor by substring text match",
3447
+ "type": "string"
3448
+ }
3449
+ },
3450
+ "additionalProperties": false
3451
+ }
3452
+ ],
3453
+ "description": "Scope to a subtree: true = foreground app; {resourceId|text} = anchor. Needs --observe-focus-scope."
3454
+ },
3455
+ "region": {
3456
+ "description": "Crop to a normalized 0..1 box; true = inset content rect. Needs --observe-region.",
3457
+ "anyOf": [
3458
+ {
3459
+ "type": "boolean"
3460
+ },
3461
+ {
3462
+ "type": "object",
3463
+ "properties": {
3464
+ "x1": {
3465
+ "type": "number",
3466
+ "minimum": 0,
3467
+ "maximum": 1
3468
+ },
3469
+ "y1": {
3470
+ "type": "number",
3471
+ "minimum": 0,
3472
+ "maximum": 1
3473
+ },
3474
+ "x2": {
3475
+ "type": "number",
3476
+ "minimum": 0,
3477
+ "maximum": 1
3478
+ },
3479
+ "y2": {
3480
+ "type": "number",
3481
+ "minimum": 0,
3482
+ "maximum": 1
3483
+ }
3484
+ },
3485
+ "required": [
3486
+ "x1",
3487
+ "y1",
3488
+ "x2",
3489
+ "y2"
3490
+ ],
3491
+ "additionalProperties": false
3492
+ }
3493
+ ]
3494
+ },
3495
+ "overview": {
3496
+ "description": "Collapse to a container skeleton. Needs --observe-overview.",
3497
+ "type": "boolean"
3498
+ }
3499
+ },
3500
+ "additionalProperties": false,
3501
+ "description": "Experimental progressive-disclosure scoping of the returned hierarchy (issue #4344)"
3502
+ },
3282
3503
  "sessionUuid": {
3283
3504
  "description": "Session",
3284
3505
  "type": "string"
@@ -3337,7 +3558,12 @@
3337
3558
  }
3338
3559
  }
3339
3560
  },
3340
- "then": false
3561
+ "then": false,
3562
+ "dependentRequired": {
3563
+ "settled": [
3564
+ "waitFor"
3565
+ ]
3566
+ }
3341
3567
  },
3342
3568
  "outputSchema": {
3343
3569
  "$schema": "https://json-schema.org/draft/2020-12/schema",
@@ -3683,35 +3909,95 @@
3683
3909
  "left"
3684
3910
  ],
3685
3911
  "additionalProperties": false
3686
- }
3687
- },
3688
- "required": [
3689
- "available",
3690
- "source",
3691
- "units"
3692
- ],
3693
- "additionalProperties": false
3694
- },
3695
- "layoutWarnings": {
3696
- "type": "array",
3697
- "items": {
3698
- "type": "object",
3699
- "properties": {
3700
- "type": {
3701
- "type": "string",
3702
- "enum": [
3703
- "important-content-under-inset",
3704
- "interaction-in-system-gesture-region"
3705
- ]
3706
- },
3707
- "severity": {
3708
- "type": "string",
3709
- "enum": [
3710
- "warning",
3711
- "info"
3712
- ]
3713
- },
3714
- "element": {
3912
+ },
3913
+ "systemChrome": {
3914
+ "anyOf": [
3915
+ {
3916
+ "type": "object",
3917
+ "properties": {
3918
+ "visibility": {
3919
+ "type": "string",
3920
+ "enum": [
3921
+ "visible",
3922
+ "hidden",
3923
+ "partial",
3924
+ "unknown"
3925
+ ]
3926
+ },
3927
+ "statusBar": {
3928
+ "type": "string",
3929
+ "enum": [
3930
+ "visible",
3931
+ "hidden",
3932
+ "unknown"
3933
+ ]
3934
+ },
3935
+ "navigationBar": {
3936
+ "type": "string",
3937
+ "enum": [
3938
+ "visible",
3939
+ "hidden",
3940
+ "unknown"
3941
+ ]
3942
+ },
3943
+ "homeIndicatorAutoHideRequested": {
3944
+ "anyOf": [
3945
+ {
3946
+ "type": "boolean"
3947
+ },
3948
+ {
3949
+ "type": "null"
3950
+ }
3951
+ ]
3952
+ },
3953
+ "source": {
3954
+ "type": "string",
3955
+ "enum": [
3956
+ "android-window-insets",
3957
+ "ios-status-bar-manager"
3958
+ ]
3959
+ }
3960
+ },
3961
+ "required": [
3962
+ "visibility",
3963
+ "statusBar",
3964
+ "source"
3965
+ ],
3966
+ "additionalProperties": false
3967
+ },
3968
+ {
3969
+ "type": "null"
3970
+ }
3971
+ ]
3972
+ }
3973
+ },
3974
+ "required": [
3975
+ "available",
3976
+ "source",
3977
+ "units"
3978
+ ],
3979
+ "additionalProperties": false
3980
+ },
3981
+ "layoutWarnings": {
3982
+ "type": "array",
3983
+ "items": {
3984
+ "type": "object",
3985
+ "properties": {
3986
+ "type": {
3987
+ "type": "string",
3988
+ "enum": [
3989
+ "important-content-under-inset",
3990
+ "interaction-in-system-gesture-region"
3991
+ ]
3992
+ },
3993
+ "severity": {
3994
+ "type": "string",
3995
+ "enum": [
3996
+ "warning",
3997
+ "info"
3998
+ ]
3999
+ },
4000
+ "element": {
3715
4001
  "type": "object",
3716
4002
  "properties": {
3717
4003
  "viewId": {
@@ -3798,6 +4084,42 @@
3798
4084
  ]
3799
4085
  }
3800
4086
  },
4087
+ "overflowPx": {
4088
+ "type": "object",
4089
+ "properties": {
4090
+ "top": {
4091
+ "type": "number"
4092
+ },
4093
+ "right": {
4094
+ "type": "number"
4095
+ },
4096
+ "bottom": {
4097
+ "type": "number"
4098
+ },
4099
+ "left": {
4100
+ "type": "number"
4101
+ }
4102
+ },
4103
+ "additionalProperties": false
4104
+ },
4105
+ "insetPx": {
4106
+ "type": "object",
4107
+ "properties": {
4108
+ "top": {
4109
+ "type": "number"
4110
+ },
4111
+ "right": {
4112
+ "type": "number"
4113
+ },
4114
+ "bottom": {
4115
+ "type": "number"
4116
+ },
4117
+ "left": {
4118
+ "type": "number"
4119
+ }
4120
+ },
4121
+ "additionalProperties": false
4122
+ },
3801
4123
  "overlapPercent": {
3802
4124
  "type": "integer",
3803
4125
  "minimum": -9007199254740991,
@@ -3818,6 +4140,8 @@
3818
4140
  "categories",
3819
4141
  "insetTypes",
3820
4142
  "sides",
4143
+ "overflowPx",
4144
+ "insetPx",
3821
4145
  "overlapPercent",
3822
4146
  "confidence"
3823
4147
  ],
@@ -4219,6 +4543,66 @@
4219
4543
  "left"
4220
4544
  ],
4221
4545
  "additionalProperties": false
4546
+ },
4547
+ "systemChrome": {
4548
+ "anyOf": [
4549
+ {
4550
+ "type": "object",
4551
+ "properties": {
4552
+ "visibility": {
4553
+ "type": "string",
4554
+ "enum": [
4555
+ "visible",
4556
+ "hidden",
4557
+ "partial",
4558
+ "unknown"
4559
+ ]
4560
+ },
4561
+ "statusBar": {
4562
+ "type": "string",
4563
+ "enum": [
4564
+ "visible",
4565
+ "hidden",
4566
+ "unknown"
4567
+ ]
4568
+ },
4569
+ "navigationBar": {
4570
+ "type": "string",
4571
+ "enum": [
4572
+ "visible",
4573
+ "hidden",
4574
+ "unknown"
4575
+ ]
4576
+ },
4577
+ "homeIndicatorAutoHideRequested": {
4578
+ "anyOf": [
4579
+ {
4580
+ "type": "boolean"
4581
+ },
4582
+ {
4583
+ "type": "null"
4584
+ }
4585
+ ]
4586
+ },
4587
+ "source": {
4588
+ "type": "string",
4589
+ "enum": [
4590
+ "android-window-insets",
4591
+ "ios-status-bar-manager"
4592
+ ]
4593
+ }
4594
+ },
4595
+ "required": [
4596
+ "visibility",
4597
+ "statusBar",
4598
+ "source"
4599
+ ],
4600
+ "additionalProperties": false
4601
+ },
4602
+ {
4603
+ "type": "null"
4604
+ }
4605
+ ]
4222
4606
  }
4223
4607
  },
4224
4608
  "required": [
@@ -4231,6 +4615,59 @@
4231
4615
  },
4232
4616
  "additionalProperties": {}
4233
4617
  },
4618
+ "skeleton": {
4619
+ "type": "array",
4620
+ "items": {
4621
+ "type": "object",
4622
+ "properties": {
4623
+ "id": {
4624
+ "type": "string"
4625
+ },
4626
+ "label": {
4627
+ "type": "string"
4628
+ },
4629
+ "bounds": {
4630
+ "type": "array",
4631
+ "prefixItems": [
4632
+ {
4633
+ "type": "number"
4634
+ },
4635
+ {
4636
+ "type": "number"
4637
+ },
4638
+ {
4639
+ "type": "number"
4640
+ },
4641
+ {
4642
+ "type": "number"
4643
+ }
4644
+ ],
4645
+ "description": "Bounds as the compact [left, top, right, bottom] tuple — always this shape for skeleton entries, independent of the --observe-result-compact flag."
4646
+ },
4647
+ "affordances": {
4648
+ "type": "array",
4649
+ "items": {
4650
+ "type": "string",
4651
+ "enum": [
4652
+ "tap",
4653
+ "long-press",
4654
+ "input",
4655
+ "scroll",
4656
+ "toggle"
4657
+ ]
4658
+ }
4659
+ },
4660
+ "checked": {
4661
+ "type": "boolean"
4662
+ }
4663
+ },
4664
+ "required": [
4665
+ "bounds",
4666
+ "affordances"
4667
+ ],
4668
+ "additionalProperties": {}
4669
+ }
4670
+ },
4234
4671
  "activeWindow": {
4235
4672
  "type": "object",
4236
4673
  "properties": {
@@ -4285,12 +4722,18 @@
4285
4722
  "bundleId": {
4286
4723
  "type": "string"
4287
4724
  },
4725
+ "navigationRoute": {
4726
+ "type": "string"
4727
+ },
4288
4728
  "navigationTitle": {
4289
4729
  "type": "string"
4290
4730
  },
4291
4731
  "selectedTab": {
4292
4732
  "type": "string"
4293
4733
  },
4734
+ "presentation": {
4735
+ "type": "string"
4736
+ },
4294
4737
  "modalClass": {
4295
4738
  "type": "string"
4296
4739
  },
@@ -5077,125 +5520,550 @@
5077
5520
  ],
5078
5521
  "additionalProperties": {}
5079
5522
  },
5080
- "freshness": {
5523
+ "matched": {
5524
+ "type": "boolean"
5525
+ },
5526
+ "settled": {
5527
+ "type": "boolean"
5528
+ },
5529
+ "timedOut": {
5530
+ "type": "boolean"
5531
+ },
5532
+ "polls": {
5533
+ "type": "integer",
5534
+ "minimum": 0,
5535
+ "maximum": 9007199254740991
5536
+ },
5537
+ "waitMs": {
5538
+ "type": "number",
5539
+ "minimum": 0
5540
+ },
5541
+ "matchedElement": {
5081
5542
  "type": "object",
5082
5543
  "properties": {
5083
- "requestedAfter": {
5084
- "type": "integer",
5085
- "minimum": -9007199254740991,
5086
- "maximum": 9007199254740991
5544
+ "bounds": {
5545
+ "type": "object",
5546
+ "properties": {
5547
+ "left": {
5548
+ "type": "number"
5549
+ },
5550
+ "top": {
5551
+ "type": "number"
5552
+ },
5553
+ "right": {
5554
+ "type": "number"
5555
+ },
5556
+ "bottom": {
5557
+ "type": "number"
5558
+ },
5559
+ "centerX": {
5560
+ "type": "number"
5561
+ },
5562
+ "centerY": {
5563
+ "type": "number"
5564
+ }
5565
+ },
5566
+ "required": [
5567
+ "left",
5568
+ "top",
5569
+ "right",
5570
+ "bottom"
5571
+ ],
5572
+ "additionalProperties": false,
5573
+ "description": "Element bounds. Default: object {left, top, right, bottom} (+ optional centerX/centerY). Under --observe-result-compact: positional tuple [left, top, right, bottom]."
5087
5574
  },
5088
- "actualTimestamp": {
5089
- "type": "integer",
5090
- "minimum": -9007199254740991,
5091
- "maximum": 9007199254740991
5575
+ "text": {
5576
+ "type": "string"
5092
5577
  },
5093
- "isFresh": {
5094
- "type": "boolean"
5578
+ "resource-id": {
5579
+ "type": "string"
5095
5580
  },
5096
- "staleDurationMs": {
5097
- "type": "integer",
5098
- "minimum": -9007199254740991,
5099
- "maximum": 9007199254740991
5581
+ "view-id": {
5582
+ "type": "string"
5100
5583
  },
5101
- "warning": {
5584
+ "content-desc": {
5102
5585
  "type": "string"
5103
- }
5104
- },
5105
- "required": [
5106
- "isFresh"
5107
- ],
5108
- "additionalProperties": {}
5109
- },
5110
- "predictions": {
5111
- "type": "object",
5112
- "properties": {
5113
- "likelyActions": {
5114
- "type": "array",
5115
- "items": {
5586
+ },
5587
+ "occlusionState": {
5588
+ "type": "string"
5589
+ },
5590
+ "occludedBy": {
5591
+ "type": "string"
5592
+ },
5593
+ "occludedByViewId": {
5594
+ "type": "string"
5595
+ },
5596
+ "class": {
5597
+ "type": "string"
5598
+ },
5599
+ "package": {
5600
+ "type": "string"
5601
+ },
5602
+ "checkable": {
5603
+ "anyOf": [
5604
+ {
5605
+ "type": "boolean"
5606
+ },
5607
+ {
5608
+ "type": "string",
5609
+ "const": "true"
5610
+ },
5611
+ {
5612
+ "type": "string",
5613
+ "const": "false"
5614
+ }
5615
+ ]
5616
+ },
5617
+ "checked": {
5618
+ "anyOf": [
5619
+ {
5620
+ "type": "boolean"
5621
+ },
5622
+ {
5623
+ "type": "string",
5624
+ "const": "true"
5625
+ },
5626
+ {
5627
+ "type": "string",
5628
+ "const": "false"
5629
+ }
5630
+ ]
5631
+ },
5632
+ "clickable": {
5633
+ "anyOf": [
5634
+ {
5635
+ "type": "boolean"
5636
+ },
5637
+ {
5638
+ "type": "string",
5639
+ "const": "true"
5640
+ },
5641
+ {
5642
+ "type": "string",
5643
+ "const": "false"
5644
+ }
5645
+ ]
5646
+ },
5647
+ "enabled": {
5648
+ "anyOf": [
5649
+ {
5650
+ "type": "boolean"
5651
+ },
5652
+ {
5653
+ "type": "string",
5654
+ "const": "true"
5655
+ },
5656
+ {
5657
+ "type": "string",
5658
+ "const": "false"
5659
+ }
5660
+ ]
5661
+ },
5662
+ "focusable": {
5663
+ "anyOf": [
5664
+ {
5665
+ "type": "boolean"
5666
+ },
5667
+ {
5668
+ "type": "string",
5669
+ "const": "true"
5670
+ },
5671
+ {
5672
+ "type": "string",
5673
+ "const": "false"
5674
+ }
5675
+ ]
5676
+ },
5677
+ "focused": {
5678
+ "anyOf": [
5679
+ {
5680
+ "type": "boolean"
5681
+ },
5682
+ {
5683
+ "type": "string",
5684
+ "const": "true"
5685
+ },
5686
+ {
5687
+ "type": "string",
5688
+ "const": "false"
5689
+ }
5690
+ ]
5691
+ },
5692
+ "accessibility-focused": {
5693
+ "anyOf": [
5694
+ {
5695
+ "type": "boolean"
5696
+ },
5697
+ {
5698
+ "type": "string",
5699
+ "const": "true"
5700
+ },
5701
+ {
5702
+ "type": "string",
5703
+ "const": "false"
5704
+ }
5705
+ ]
5706
+ },
5707
+ "scrollable": {
5708
+ "anyOf": [
5709
+ {
5710
+ "type": "boolean"
5711
+ },
5712
+ {
5713
+ "type": "string",
5714
+ "const": "true"
5715
+ },
5716
+ {
5717
+ "type": "string",
5718
+ "const": "false"
5719
+ }
5720
+ ]
5721
+ },
5722
+ "selected": {
5723
+ "anyOf": [
5724
+ {
5725
+ "type": "boolean"
5726
+ },
5727
+ {
5728
+ "type": "string",
5729
+ "const": "true"
5730
+ },
5731
+ {
5732
+ "type": "string",
5733
+ "const": "false"
5734
+ }
5735
+ ]
5736
+ }
5737
+ },
5738
+ "required": [
5739
+ "bounds"
5740
+ ],
5741
+ "additionalProperties": {}
5742
+ },
5743
+ "candidates": {
5744
+ "type": "array",
5745
+ "items": {
5746
+ "type": "object",
5747
+ "properties": {
5748
+ "bounds": {
5116
5749
  "type": "object",
5117
5750
  "properties": {
5118
- "action": {
5119
- "type": "string"
5751
+ "left": {
5752
+ "type": "number"
5120
5753
  },
5121
- "target": {
5122
- "type": "object",
5123
- "properties": {
5124
- "text": {
5125
- "type": "string"
5126
- },
5127
- "elementId": {
5128
- "type": "string"
5129
- },
5130
- "contentDesc": {
5131
- "type": "string"
5132
- },
5133
- "container": {
5134
- "type": "object",
5135
- "properties": {
5136
- "text": {
5137
- "type": "string"
5138
- },
5139
- "elementId": {
5140
- "type": "string"
5141
- },
5142
- "contentDesc": {
5143
- "type": "string"
5144
- }
5145
- },
5146
- "additionalProperties": false
5147
- },
5148
- "lookFor": {
5149
- "type": "object",
5150
- "properties": {
5151
- "text": {
5152
- "type": "string"
5153
- },
5154
- "elementId": {
5155
- "type": "string"
5156
- },
5157
- "contentDesc": {
5158
- "type": "string"
5159
- }
5160
- },
5161
- "additionalProperties": false
5162
- }
5163
- },
5164
- "additionalProperties": {}
5754
+ "top": {
5755
+ "type": "number"
5165
5756
  },
5166
- "predictedScreen": {
5167
- "type": "string"
5757
+ "right": {
5758
+ "type": "number"
5168
5759
  },
5169
- "predictedElements": {
5170
- "type": "array",
5171
- "items": {
5172
- "type": "string"
5173
- }
5760
+ "bottom": {
5761
+ "type": "number"
5174
5762
  },
5175
- "confidence": {
5763
+ "centerX": {
5764
+ "type": "number"
5765
+ },
5766
+ "centerY": {
5176
5767
  "type": "number"
5177
5768
  }
5178
5769
  },
5179
5770
  "required": [
5180
- "action",
5181
- "target",
5182
- "predictedScreen",
5183
- "confidence"
5771
+ "left",
5772
+ "top",
5773
+ "right",
5774
+ "bottom"
5184
5775
  ],
5185
- "additionalProperties": {}
5186
- }
5187
- },
5188
- "interactableElements": {
5189
- "type": "array",
5190
- "items": {
5191
- "type": "object",
5192
- "properties": {
5193
- "elementId": {
5194
- "type": "string"
5195
- },
5196
- "elementText": {
5197
- "type": "string"
5198
- },
5776
+ "additionalProperties": false,
5777
+ "description": "Element bounds. Default: object {left, top, right, bottom} (+ optional centerX/centerY). Under --observe-result-compact: positional tuple [left, top, right, bottom]."
5778
+ },
5779
+ "text": {
5780
+ "type": "string"
5781
+ },
5782
+ "resource-id": {
5783
+ "type": "string"
5784
+ },
5785
+ "view-id": {
5786
+ "type": "string"
5787
+ },
5788
+ "content-desc": {
5789
+ "type": "string"
5790
+ },
5791
+ "occlusionState": {
5792
+ "type": "string"
5793
+ },
5794
+ "occludedBy": {
5795
+ "type": "string"
5796
+ },
5797
+ "occludedByViewId": {
5798
+ "type": "string"
5799
+ },
5800
+ "class": {
5801
+ "type": "string"
5802
+ },
5803
+ "package": {
5804
+ "type": "string"
5805
+ },
5806
+ "checkable": {
5807
+ "anyOf": [
5808
+ {
5809
+ "type": "boolean"
5810
+ },
5811
+ {
5812
+ "type": "string",
5813
+ "const": "true"
5814
+ },
5815
+ {
5816
+ "type": "string",
5817
+ "const": "false"
5818
+ }
5819
+ ]
5820
+ },
5821
+ "checked": {
5822
+ "anyOf": [
5823
+ {
5824
+ "type": "boolean"
5825
+ },
5826
+ {
5827
+ "type": "string",
5828
+ "const": "true"
5829
+ },
5830
+ {
5831
+ "type": "string",
5832
+ "const": "false"
5833
+ }
5834
+ ]
5835
+ },
5836
+ "clickable": {
5837
+ "anyOf": [
5838
+ {
5839
+ "type": "boolean"
5840
+ },
5841
+ {
5842
+ "type": "string",
5843
+ "const": "true"
5844
+ },
5845
+ {
5846
+ "type": "string",
5847
+ "const": "false"
5848
+ }
5849
+ ]
5850
+ },
5851
+ "enabled": {
5852
+ "anyOf": [
5853
+ {
5854
+ "type": "boolean"
5855
+ },
5856
+ {
5857
+ "type": "string",
5858
+ "const": "true"
5859
+ },
5860
+ {
5861
+ "type": "string",
5862
+ "const": "false"
5863
+ }
5864
+ ]
5865
+ },
5866
+ "focusable": {
5867
+ "anyOf": [
5868
+ {
5869
+ "type": "boolean"
5870
+ },
5871
+ {
5872
+ "type": "string",
5873
+ "const": "true"
5874
+ },
5875
+ {
5876
+ "type": "string",
5877
+ "const": "false"
5878
+ }
5879
+ ]
5880
+ },
5881
+ "focused": {
5882
+ "anyOf": [
5883
+ {
5884
+ "type": "boolean"
5885
+ },
5886
+ {
5887
+ "type": "string",
5888
+ "const": "true"
5889
+ },
5890
+ {
5891
+ "type": "string",
5892
+ "const": "false"
5893
+ }
5894
+ ]
5895
+ },
5896
+ "accessibility-focused": {
5897
+ "anyOf": [
5898
+ {
5899
+ "type": "boolean"
5900
+ },
5901
+ {
5902
+ "type": "string",
5903
+ "const": "true"
5904
+ },
5905
+ {
5906
+ "type": "string",
5907
+ "const": "false"
5908
+ }
5909
+ ]
5910
+ },
5911
+ "scrollable": {
5912
+ "anyOf": [
5913
+ {
5914
+ "type": "boolean"
5915
+ },
5916
+ {
5917
+ "type": "string",
5918
+ "const": "true"
5919
+ },
5920
+ {
5921
+ "type": "string",
5922
+ "const": "false"
5923
+ }
5924
+ ]
5925
+ },
5926
+ "selected": {
5927
+ "anyOf": [
5928
+ {
5929
+ "type": "boolean"
5930
+ },
5931
+ {
5932
+ "type": "string",
5933
+ "const": "true"
5934
+ },
5935
+ {
5936
+ "type": "string",
5937
+ "const": "false"
5938
+ }
5939
+ ]
5940
+ }
5941
+ },
5942
+ "required": [
5943
+ "bounds"
5944
+ ],
5945
+ "additionalProperties": {}
5946
+ }
5947
+ },
5948
+ "freshness": {
5949
+ "type": "object",
5950
+ "properties": {
5951
+ "requestedAfter": {
5952
+ "type": "integer",
5953
+ "minimum": -9007199254740991,
5954
+ "maximum": 9007199254740991
5955
+ },
5956
+ "actualTimestamp": {
5957
+ "type": "integer",
5958
+ "minimum": -9007199254740991,
5959
+ "maximum": 9007199254740991
5960
+ },
5961
+ "isFresh": {
5962
+ "type": "boolean"
5963
+ },
5964
+ "staleDurationMs": {
5965
+ "type": "integer",
5966
+ "minimum": -9007199254740991,
5967
+ "maximum": 9007199254740991
5968
+ },
5969
+ "warning": {
5970
+ "type": "string"
5971
+ }
5972
+ },
5973
+ "required": [
5974
+ "isFresh"
5975
+ ],
5976
+ "additionalProperties": {}
5977
+ },
5978
+ "predictions": {
5979
+ "type": "object",
5980
+ "properties": {
5981
+ "likelyActions": {
5982
+ "type": "array",
5983
+ "items": {
5984
+ "type": "object",
5985
+ "properties": {
5986
+ "action": {
5987
+ "type": "string"
5988
+ },
5989
+ "target": {
5990
+ "type": "object",
5991
+ "properties": {
5992
+ "text": {
5993
+ "type": "string"
5994
+ },
5995
+ "elementId": {
5996
+ "type": "string"
5997
+ },
5998
+ "contentDesc": {
5999
+ "type": "string"
6000
+ },
6001
+ "container": {
6002
+ "type": "object",
6003
+ "properties": {
6004
+ "text": {
6005
+ "type": "string"
6006
+ },
6007
+ "elementId": {
6008
+ "type": "string"
6009
+ },
6010
+ "contentDesc": {
6011
+ "type": "string"
6012
+ }
6013
+ },
6014
+ "additionalProperties": false
6015
+ },
6016
+ "lookFor": {
6017
+ "type": "object",
6018
+ "properties": {
6019
+ "text": {
6020
+ "type": "string"
6021
+ },
6022
+ "elementId": {
6023
+ "type": "string"
6024
+ },
6025
+ "contentDesc": {
6026
+ "type": "string"
6027
+ }
6028
+ },
6029
+ "additionalProperties": false
6030
+ }
6031
+ },
6032
+ "additionalProperties": {}
6033
+ },
6034
+ "predictedScreen": {
6035
+ "type": "string"
6036
+ },
6037
+ "predictedElements": {
6038
+ "type": "array",
6039
+ "items": {
6040
+ "type": "string"
6041
+ }
6042
+ },
6043
+ "confidence": {
6044
+ "type": "number"
6045
+ }
6046
+ },
6047
+ "required": [
6048
+ "action",
6049
+ "target",
6050
+ "predictedScreen",
6051
+ "confidence"
6052
+ ],
6053
+ "additionalProperties": {}
6054
+ }
6055
+ },
6056
+ "interactableElements": {
6057
+ "type": "array",
6058
+ "items": {
6059
+ "type": "object",
6060
+ "properties": {
6061
+ "elementId": {
6062
+ "type": "string"
6063
+ },
6064
+ "elementText": {
6065
+ "type": "string"
6066
+ },
5199
6067
  "elementContentDesc": {
5200
6068
  "type": "string"
5201
6069
  },
@@ -5219,107 +6087,532 @@
5219
6087
  "additionalProperties": false
5220
6088
  }
5221
6089
  },
5222
- "additionalProperties": {}
5223
- }
5224
- }
5225
- },
5226
- "required": [
5227
- "likelyActions",
5228
- "interactableElements"
5229
- ],
5230
- "additionalProperties": {}
5231
- },
5232
- "accessibilityState": {
5233
- "type": "object",
5234
- "properties": {
5235
- "enabled": {
5236
- "type": "boolean"
5237
- },
5238
- "service": {
5239
- "type": "string",
5240
- "enum": [
5241
- "talkback",
5242
- "voiceover",
5243
- "unknown"
6090
+ "additionalProperties": {}
6091
+ }
6092
+ }
6093
+ },
6094
+ "required": [
6095
+ "likelyActions",
6096
+ "interactableElements"
6097
+ ],
6098
+ "additionalProperties": {}
6099
+ },
6100
+ "accessibilityState": {
6101
+ "type": "object",
6102
+ "properties": {
6103
+ "enabled": {
6104
+ "type": "boolean"
6105
+ },
6106
+ "service": {
6107
+ "type": "string",
6108
+ "enum": [
6109
+ "talkback",
6110
+ "voiceover",
6111
+ "unknown"
6112
+ ]
6113
+ }
6114
+ },
6115
+ "required": [
6116
+ "enabled",
6117
+ "service"
6118
+ ],
6119
+ "additionalProperties": {}
6120
+ },
6121
+ "deviceLock": {
6122
+ "type": "object",
6123
+ "properties": {
6124
+ "locked": {
6125
+ "type": "boolean"
6126
+ },
6127
+ "keyguardShowing": {
6128
+ "type": "boolean"
6129
+ },
6130
+ "secure": {
6131
+ "type": "boolean"
6132
+ }
6133
+ },
6134
+ "required": [
6135
+ "locked",
6136
+ "keyguardShowing"
6137
+ ],
6138
+ "additionalProperties": false
6139
+ },
6140
+ "observeScope": {
6141
+ "type": "object",
6142
+ "properties": {
6143
+ "applied": {
6144
+ "type": "array",
6145
+ "items": {
6146
+ "type": "string",
6147
+ "enum": [
6148
+ "focus",
6149
+ "region",
6150
+ "overview"
6151
+ ]
6152
+ }
6153
+ },
6154
+ "gatedOff": {
6155
+ "type": "array",
6156
+ "items": {
6157
+ "type": "string",
6158
+ "enum": [
6159
+ "focus",
6160
+ "region",
6161
+ "overview"
6162
+ ]
6163
+ }
6164
+ },
6165
+ "nodesBefore": {
6166
+ "type": "integer",
6167
+ "minimum": 0,
6168
+ "maximum": 9007199254740991
6169
+ },
6170
+ "nodesAfter": {
6171
+ "type": "integer",
6172
+ "minimum": 0,
6173
+ "maximum": 9007199254740991
6174
+ },
6175
+ "regionPx": {
6176
+ "type": "object",
6177
+ "properties": {
6178
+ "left": {
6179
+ "type": "number"
6180
+ },
6181
+ "top": {
6182
+ "type": "number"
6183
+ },
6184
+ "right": {
6185
+ "type": "number"
6186
+ },
6187
+ "bottom": {
6188
+ "type": "number"
6189
+ },
6190
+ "centerX": {
6191
+ "type": "number"
6192
+ },
6193
+ "centerY": {
6194
+ "type": "number"
6195
+ }
6196
+ },
6197
+ "required": [
6198
+ "left",
6199
+ "top",
6200
+ "right",
6201
+ "bottom"
6202
+ ],
6203
+ "additionalProperties": false,
6204
+ "description": "Element bounds. Default: object {left, top, right, bottom} (+ optional centerX/centerY). Under --observe-result-compact: positional tuple [left, top, right, bottom]."
6205
+ },
6206
+ "focus": {
6207
+ "type": "object",
6208
+ "properties": {
6209
+ "by": {
6210
+ "type": "string",
6211
+ "enum": [
6212
+ "anchor",
6213
+ "foreground-app"
6214
+ ]
6215
+ },
6216
+ "matched": {
6217
+ "type": "boolean"
6218
+ },
6219
+ "packageName": {
6220
+ "type": "string"
6221
+ }
6222
+ },
6223
+ "required": [
6224
+ "by",
6225
+ "matched"
6226
+ ],
6227
+ "additionalProperties": {}
6228
+ }
6229
+ },
6230
+ "required": [
6231
+ "applied",
6232
+ "nodesBefore",
6233
+ "nodesAfter"
6234
+ ],
6235
+ "additionalProperties": {}
6236
+ },
6237
+ "artifact": {
6238
+ "type": "object",
6239
+ "properties": {
6240
+ "path": {
6241
+ "type": "string"
6242
+ },
6243
+ "format": {
6244
+ "type": "string",
6245
+ "const": "json"
6246
+ },
6247
+ "payload": {
6248
+ "type": "string"
6249
+ },
6250
+ "bytes": {
6251
+ "type": "integer",
6252
+ "minimum": 0,
6253
+ "maximum": 9007199254740991
6254
+ },
6255
+ "tool": {
6256
+ "type": "string"
6257
+ }
6258
+ },
6259
+ "required": [
6260
+ "path",
6261
+ "format",
6262
+ "payload",
6263
+ "bytes",
6264
+ "tool"
6265
+ ],
6266
+ "additionalProperties": {}
6267
+ }
6268
+ }
6269
+ },
6270
+ "_meta": {
6271
+ "ui": {
6272
+ "resourceUri": "ui://automobile/observe"
6273
+ }
6274
+ }
6275
+ },
6276
+ {
6277
+ "name": "openLink",
6278
+ "description": "Open URL in browser",
6279
+ "inputSchema": {
6280
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
6281
+ "type": "object",
6282
+ "properties": {
6283
+ "url": {
6284
+ "type": "string",
6285
+ "description": "URL to open"
6286
+ },
6287
+ "platform": {
6288
+ "type": "string",
6289
+ "enum": [
6290
+ "android",
6291
+ "ios"
6292
+ ]
6293
+ },
6294
+ "waitFor": {
6295
+ "type": "object",
6296
+ "additionalProperties": false,
6297
+ "not": {
6298
+ "required": [
6299
+ "timeout",
6300
+ "timeoutMs"
6301
+ ]
6302
+ },
6303
+ "properties": {
6304
+ "for": {
6305
+ "type": "string",
6306
+ "enum": [
6307
+ "appear",
6308
+ "disappear",
6309
+ "clickable",
6310
+ "textEquals",
6311
+ "countStable",
6312
+ "stable"
6313
+ ]
6314
+ },
6315
+ "pollMs": {
6316
+ "type": "number"
6317
+ },
6318
+ "stableReads": {
6319
+ "type": "number"
6320
+ },
6321
+ "elementId": {
6322
+ "type": "string"
6323
+ },
6324
+ "text": {
6325
+ "type": "string"
6326
+ },
6327
+ "textAny": {
6328
+ "type": "array",
6329
+ "items": {
6330
+ "type": "string"
6331
+ }
6332
+ },
6333
+ "className": {
6334
+ "type": "string"
6335
+ },
6336
+ "contentDescription": {
6337
+ "type": "string"
6338
+ },
6339
+ "matchType": {
6340
+ "type": "string",
6341
+ "enum": [
6342
+ "all",
6343
+ "any"
6344
+ ]
6345
+ },
6346
+ "textMatch": {
6347
+ "type": "string",
6348
+ "enum": [
6349
+ "exact",
6350
+ "contains",
6351
+ "regex"
6352
+ ],
6353
+ "description": "How to match waitFor.text; does not affect contentDescription"
6354
+ },
6355
+ "activeWindow": {
6356
+ "type": "object",
6357
+ "additionalProperties": false,
6358
+ "properties": {
6359
+ "appId": {
6360
+ "type": "string"
6361
+ },
6362
+ "packageName": {
6363
+ "type": "string"
6364
+ },
6365
+ "bundleId": {
6366
+ "type": "string"
6367
+ },
6368
+ "activityName": {
6369
+ "type": "string"
6370
+ }
6371
+ },
6372
+ "anyOf": [
6373
+ {
6374
+ "required": [
6375
+ "appId"
6376
+ ]
6377
+ },
6378
+ {
6379
+ "required": [
6380
+ "packageName"
6381
+ ]
6382
+ },
6383
+ {
6384
+ "required": [
6385
+ "bundleId"
6386
+ ]
6387
+ },
6388
+ {
6389
+ "required": [
6390
+ "activityName"
6391
+ ]
6392
+ }
6393
+ ]
6394
+ },
6395
+ "absent": {
6396
+ "type": "object",
6397
+ "additionalProperties": false,
6398
+ "description": "Wait until an element matching these fields is absent (text uses contains match)",
6399
+ "properties": {
6400
+ "elementId": {
6401
+ "type": "string"
6402
+ },
6403
+ "text": {
6404
+ "type": "string"
6405
+ },
6406
+ "className": {
6407
+ "type": "string"
6408
+ },
6409
+ "contentDescription": {
6410
+ "type": "string"
6411
+ }
6412
+ },
6413
+ "anyOf": [
6414
+ {
6415
+ "required": [
6416
+ "elementId"
6417
+ ]
6418
+ },
6419
+ {
6420
+ "required": [
6421
+ "text"
6422
+ ]
6423
+ },
6424
+ {
6425
+ "required": [
6426
+ "className"
6427
+ ]
6428
+ },
6429
+ {
6430
+ "required": [
6431
+ "contentDescription"
6432
+ ]
6433
+ }
6434
+ ]
6435
+ },
6436
+ "container": {
6437
+ "type": "object",
6438
+ "properties": {
6439
+ "elementId": {
6440
+ "type": "string"
6441
+ },
6442
+ "text": {
6443
+ "type": "string"
6444
+ }
6445
+ },
6446
+ "additionalProperties": false,
6447
+ "oneOf": [
6448
+ {
6449
+ "required": [
6450
+ "elementId"
6451
+ ]
6452
+ },
6453
+ {
6454
+ "required": [
6455
+ "text"
6456
+ ]
6457
+ }
6458
+ ]
6459
+ },
6460
+ "timeout": {
6461
+ "type": "number"
6462
+ },
6463
+ "timeoutMs": {
6464
+ "type": "number"
6465
+ }
6466
+ },
6467
+ "anyOf": [
6468
+ {
6469
+ "properties": {
6470
+ "for": {
6471
+ "const": "stable"
6472
+ }
6473
+ },
6474
+ "required": [
6475
+ "for"
6476
+ ],
6477
+ "not": {
6478
+ "required": [
6479
+ "container"
6480
+ ]
6481
+ }
6482
+ },
6483
+ {
6484
+ "properties": {
6485
+ "for": {
6486
+ "not": {
6487
+ "enum": [
6488
+ "stable",
6489
+ "textEquals"
6490
+ ]
6491
+ }
6492
+ }
6493
+ },
6494
+ "required": [
6495
+ "for",
6496
+ "elementId"
6497
+ ]
6498
+ },
6499
+ {
6500
+ "properties": {
6501
+ "for": {
6502
+ "not": {
6503
+ "const": "stable"
6504
+ }
6505
+ }
6506
+ },
6507
+ "required": [
6508
+ "for",
6509
+ "text"
6510
+ ]
6511
+ },
6512
+ {
6513
+ "required": [
6514
+ "textAny"
6515
+ ],
6516
+ "not": {
6517
+ "anyOf": [
6518
+ {
6519
+ "required": [
6520
+ "elementId"
6521
+ ]
6522
+ },
6523
+ {
6524
+ "required": [
6525
+ "text"
6526
+ ]
6527
+ },
6528
+ {
6529
+ "required": [
6530
+ "className"
6531
+ ]
6532
+ },
6533
+ {
6534
+ "required": [
6535
+ "contentDescription"
6536
+ ]
6537
+ },
6538
+ {
6539
+ "required": [
6540
+ "matchType"
6541
+ ]
6542
+ },
6543
+ {
6544
+ "required": [
6545
+ "textMatch"
6546
+ ]
6547
+ }
6548
+ ]
6549
+ }
6550
+ },
6551
+ {
6552
+ "not": {
6553
+ "anyOf": [
6554
+ {
6555
+ "required": [
6556
+ "textAny"
6557
+ ]
6558
+ },
6559
+ {
6560
+ "required": [
6561
+ "for"
6562
+ ]
6563
+ }
6564
+ ]
6565
+ },
6566
+ "anyOf": [
6567
+ {
6568
+ "required": [
6569
+ "elementId"
6570
+ ]
6571
+ },
6572
+ {
6573
+ "required": [
6574
+ "text"
6575
+ ]
6576
+ },
6577
+ {
6578
+ "required": [
6579
+ "className"
6580
+ ]
6581
+ },
6582
+ {
6583
+ "required": [
6584
+ "contentDescription"
6585
+ ]
6586
+ },
6587
+ {
6588
+ "required": [
6589
+ "activeWindow"
6590
+ ]
6591
+ },
6592
+ {
6593
+ "required": [
6594
+ "absent"
6595
+ ]
6596
+ }
5244
6597
  ]
5245
6598
  }
5246
- },
5247
- "required": [
5248
- "enabled",
5249
- "service"
5250
- ],
5251
- "additionalProperties": {}
5252
- },
5253
- "deviceLock": {
5254
- "type": "object",
5255
- "properties": {
5256
- "locked": {
5257
- "type": "boolean"
5258
- },
5259
- "keyguardShowing": {
5260
- "type": "boolean"
5261
- },
5262
- "secure": {
5263
- "type": "boolean"
5264
- }
5265
- },
5266
- "required": [
5267
- "locked",
5268
- "keyguardShowing"
5269
- ],
5270
- "additionalProperties": false
6599
+ ]
5271
6600
  },
5272
- "artifact": {
6601
+ "settled": {
6602
+ "description": "After waitFor matches, wait for a quiet hierarchy period (requires waitFor)",
5273
6603
  "type": "object",
5274
6604
  "properties": {
5275
- "path": {
5276
- "type": "string"
5277
- },
5278
- "format": {
5279
- "type": "string",
5280
- "const": "json"
5281
- },
5282
- "payload": {
5283
- "type": "string"
5284
- },
5285
- "bytes": {
6605
+ "quietPeriodMs": {
5286
6606
  "type": "integer",
5287
- "minimum": 0,
5288
- "maximum": 9007199254740991
5289
- },
5290
- "tool": {
5291
- "type": "string"
6607
+ "exclusiveMinimum": 0,
6608
+ "maximum": 9007199254740991,
6609
+ "description": "Quiet-period ms (no hierarchy change) required after waitFor matches"
5292
6610
  }
5293
6611
  },
5294
6612
  "required": [
5295
- "path",
5296
- "format",
5297
- "payload",
5298
- "bytes",
5299
- "tool"
6613
+ "quietPeriodMs"
5300
6614
  ],
5301
- "additionalProperties": {}
5302
- }
5303
- }
5304
- }
5305
- },
5306
- {
5307
- "name": "openLink",
5308
- "description": "Open URL in browser",
5309
- "inputSchema": {
5310
- "$schema": "https://json-schema.org/draft/2020-12/schema",
5311
- "type": "object",
5312
- "properties": {
5313
- "url": {
5314
- "type": "string",
5315
- "description": "URL to open"
5316
- },
5317
- "platform": {
5318
- "type": "string",
5319
- "enum": [
5320
- "android",
5321
- "ios"
5322
- ]
6615
+ "additionalProperties": false
5323
6616
  },
5324
6617
  "sessionUuid": {
5325
6618
  "description": "Session",
@@ -5337,7 +6630,55 @@
5337
6630
  "url",
5338
6631
  "platform"
5339
6632
  ],
5340
- "additionalProperties": false
6633
+ "additionalProperties": false,
6634
+ "if": {
6635
+ "required": [
6636
+ "platform",
6637
+ "waitFor"
6638
+ ],
6639
+ "properties": {
6640
+ "platform": {
6641
+ "const": "ios"
6642
+ },
6643
+ "waitFor": {
6644
+ "required": [
6645
+ "activeWindow"
6646
+ ],
6647
+ "properties": {
6648
+ "activeWindow": {
6649
+ "required": [
6650
+ "activityName"
6651
+ ],
6652
+ "not": {
6653
+ "anyOf": [
6654
+ {
6655
+ "required": [
6656
+ "appId"
6657
+ ]
6658
+ },
6659
+ {
6660
+ "required": [
6661
+ "bundleId"
6662
+ ]
6663
+ },
6664
+ {
6665
+ "required": [
6666
+ "packageName"
6667
+ ]
6668
+ }
6669
+ ]
6670
+ }
6671
+ }
6672
+ }
6673
+ }
6674
+ }
6675
+ },
6676
+ "then": false,
6677
+ "dependentRequired": {
6678
+ "settled": [
6679
+ "waitFor"
6680
+ ]
6681
+ }
5341
6682
  }
5342
6683
  },
5343
6684
  {
@@ -5999,7 +7340,7 @@
5999
7340
  },
6000
7341
  {
6001
7342
  "name": "setAppPermissions",
6002
- "description": "Grant, revoke, reset, or configure app permissions on Android devices, iOS simulators (grant/revoke/reset), and iOS physical devices (reset only, permissions=['all'] supported)",
7343
+ "description": "userId grant/revoke; device-wide reset ['all']; no POST_NOTIFICATIONS.",
6003
7344
  "inputSchema": {
6004
7345
  "$schema": "https://json-schema.org/draft/2020-12/schema",
6005
7346
  "type": "object",
@@ -6008,8 +7349,6 @@
6008
7349
  "type": "string"
6009
7350
  },
6010
7351
  "action": {
6011
- "description": "Permission action; defaults to grant. Android supports grant; iOS simulators support grant/revoke/reset; iOS physical devices support reset only, including permissions=['all'].",
6012
- "type": "string",
6013
7352
  "enum": [
6014
7353
  "grant",
6015
7354
  "revoke",
@@ -6017,7 +7356,6 @@
6017
7356
  ]
6018
7357
  },
6019
7358
  "permissions": {
6020
- "description": "Runtime permissions or simulator privacy services to change; iOS physical reset accepts 'all'",
6021
7359
  "type": "array",
6022
7360
  "items": {
6023
7361
  "type": "string",
@@ -6025,18 +7363,17 @@
6025
7363
  }
6026
7364
  },
6027
7365
  "userId": {
6028
- "description": "Android user id",
6029
7366
  "type": "integer",
6030
7367
  "minimum": 0,
6031
7368
  "maximum": 9007199254740991
6032
7369
  },
7370
+ "notificationsEnabled": {
7371
+ "type": "boolean"
7372
+ },
6033
7373
  "notificationPolicyAccess": {
6034
- "description": "Android: set DND policy access",
6035
7374
  "type": "boolean"
6036
7375
  },
6037
7376
  "scheduleExactAlarm": {
6038
- "description": "Android: set SCHEDULE_EXACT_ALARM appop",
6039
- "type": "string",
6040
7377
  "enum": [
6041
7378
  "allow",
6042
7379
  "deny"
@@ -6050,21 +7387,60 @@
6050
7387
  ]
6051
7388
  },
6052
7389
  "sessionUuid": {
6053
- "description": "Session",
6054
7390
  "type": "string"
6055
7391
  },
6056
7392
  "keepScreenAwake": {
6057
7393
  "type": "boolean"
6058
7394
  },
6059
7395
  "device": {
6060
- "description": "Device label",
6061
7396
  "type": "string"
6062
7397
  }
6063
7398
  },
6064
7399
  "required": [
6065
7400
  "appId"
6066
7401
  ],
6067
- "additionalProperties": false
7402
+ "additionalProperties": false,
7403
+ "if": {
7404
+ "properties": {
7405
+ "action": {
7406
+ "const": "reset"
7407
+ }
7408
+ },
7409
+ "required": [
7410
+ "action"
7411
+ ]
7412
+ },
7413
+ "then": {
7414
+ "required": [
7415
+ "permissions"
7416
+ ],
7417
+ "not": {
7418
+ "required": [
7419
+ "userId"
7420
+ ]
7421
+ },
7422
+ "if": {
7423
+ "properties": {
7424
+ "platform": {
7425
+ "const": "android"
7426
+ }
7427
+ },
7428
+ "required": [
7429
+ "platform"
7430
+ ]
7431
+ },
7432
+ "then": {
7433
+ "properties": {
7434
+ "permissions": {
7435
+ "minItems": 1,
7436
+ "maxItems": 1,
7437
+ "items": {
7438
+ "const": "all"
7439
+ }
7440
+ }
7441
+ }
7442
+ }
7443
+ }
6068
7444
  }
6069
7445
  },
6070
7446
  {
@@ -6980,7 +8356,7 @@
6980
8356
  },
6981
8357
  {
6982
8358
  "name": "tapOn",
6983
- "description": "Tap an element by text/content-desc or resource-id; use sibling for adjacent controls.",
8359
+ "description": "Tap an element by text/content-desc, resource-id, or Android test tag; use sibling for adjacent controls.",
6984
8360
  "inputSchema": {
6985
8361
  "$schema": "https://json-schema.org/draft/2020-12/schema",
6986
8362
  "type": "object",
@@ -6994,6 +8370,11 @@
6994
8370
  "minLength": 1,
6995
8371
  "description": "Resource ID, e.g. com.app:id/btn_login"
6996
8372
  },
8373
+ "testTag": {
8374
+ "type": "string",
8375
+ "minLength": 1,
8376
+ "description": "Android accessibility test tag"
8377
+ },
6997
8378
  "text": {
6998
8379
  "type": "string",
6999
8380
  "minLength": 1,
@@ -7015,6 +8396,11 @@
7015
8396
  "elementId"
7016
8397
  ]
7017
8398
  },
8399
+ {
8400
+ "required": [
8401
+ "testTag"
8402
+ ]
8403
+ },
7018
8404
  {
7019
8405
  "required": [
7020
8406
  "text"
@@ -7026,7 +8412,7 @@
7026
8412
  ]
7027
8413
  }
7028
8414
  ],
7029
- "description": "Element to tap: elementId, text, or ordered text variants"
8415
+ "description": "Element to tap: elementId, Android testTag, text, or ordered text variants"
7030
8416
  },
7031
8417
  "sibling": {
7032
8418
  "description": "Tap a clickable sibling of the match, e.g. checkbox beside label",
@@ -7902,12 +9288,18 @@
7902
9288
  "bundleId": {
7903
9289
  "type": "string"
7904
9290
  },
9291
+ "navigationRoute": {
9292
+ "type": "string"
9293
+ },
7905
9294
  "navigationTitle": {
7906
9295
  "type": "string"
7907
9296
  },
7908
9297
  "selectedTab": {
7909
9298
  "type": "string"
7910
9299
  },
9300
+ "presentation": {
9301
+ "type": "string"
9302
+ },
7911
9303
  "modalClass": {
7912
9304
  "type": "string"
7913
9305
  },
@@ -8060,12 +9452,18 @@
8060
9452
  "bundleId": {
8061
9453
  "type": "string"
8062
9454
  },
9455
+ "navigationRoute": {
9456
+ "type": "string"
9457
+ },
8063
9458
  "navigationTitle": {
8064
9459
  "type": "string"
8065
9460
  },
8066
9461
  "selectedTab": {
8067
9462
  "type": "string"
8068
9463
  },
9464
+ "presentation": {
9465
+ "type": "string"
9466
+ },
8069
9467
  "modalClass": {
8070
9468
  "type": "string"
8071
9469
  },
@@ -8154,12 +9552,18 @@
8154
9552
  "bundleId": {
8155
9553
  "type": "string"
8156
9554
  },
9555
+ "navigationRoute": {
9556
+ "type": "string"
9557
+ },
8157
9558
  "navigationTitle": {
8158
9559
  "type": "string"
8159
9560
  },
8160
9561
  "selectedTab": {
8161
9562
  "type": "string"
8162
9563
  },
9564
+ "presentation": {
9565
+ "type": "string"
9566
+ },
8163
9567
  "modalClass": {
8164
9568
  "type": "string"
8165
9569
  },
@@ -9411,5 +10815,41 @@
9411
10815
  ],
9412
10816
  "additionalProperties": false
9413
10817
  }
10818
+ },
10819
+ {
10820
+ "name": "wakeAndUnlock",
10821
+ "description": "Wake a device and unlock its keyguard. Android: swipe lock or secure PIN via `pin`; iOS: wake + swipe-dismiss (pin ignored).",
10822
+ "inputSchema": {
10823
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
10824
+ "type": "object",
10825
+ "properties": {
10826
+ "pin": {
10827
+ "description": "Credential to unlock a secure Android device. Optional; logically required to unlock a secure lock unless a pin was already remembered this session. Ignored on iOS.",
10828
+ "type": "string"
10829
+ },
10830
+ "platform": {
10831
+ "type": "string",
10832
+ "enum": [
10833
+ "android",
10834
+ "ios"
10835
+ ]
10836
+ },
10837
+ "sessionUuid": {
10838
+ "description": "Session",
10839
+ "type": "string"
10840
+ },
10841
+ "keepScreenAwake": {
10842
+ "type": "boolean"
10843
+ },
10844
+ "device": {
10845
+ "description": "Device label",
10846
+ "type": "string"
10847
+ }
10848
+ },
10849
+ "required": [
10850
+ "platform"
10851
+ ],
10852
+ "additionalProperties": false
10853
+ }
9414
10854
  }
9415
10855
  ]