@kaeawc/auto-mobile 0.0.45 → 0.0.46

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 +1720 -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 +388 -384
  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 +1720 -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,527 @@
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
+ },
6271
+ {
6272
+ "name": "openLink",
6273
+ "description": "Open URL in browser",
6274
+ "inputSchema": {
6275
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
6276
+ "type": "object",
6277
+ "properties": {
6278
+ "url": {
6279
+ "type": "string",
6280
+ "description": "URL to open"
6281
+ },
6282
+ "platform": {
6283
+ "type": "string",
6284
+ "enum": [
6285
+ "android",
6286
+ "ios"
6287
+ ]
6288
+ },
6289
+ "waitFor": {
6290
+ "type": "object",
6291
+ "additionalProperties": false,
6292
+ "not": {
6293
+ "required": [
6294
+ "timeout",
6295
+ "timeoutMs"
6296
+ ]
6297
+ },
6298
+ "properties": {
6299
+ "for": {
6300
+ "type": "string",
6301
+ "enum": [
6302
+ "appear",
6303
+ "disappear",
6304
+ "clickable",
6305
+ "textEquals",
6306
+ "countStable",
6307
+ "stable"
6308
+ ]
6309
+ },
6310
+ "pollMs": {
6311
+ "type": "number"
6312
+ },
6313
+ "stableReads": {
6314
+ "type": "number"
6315
+ },
6316
+ "elementId": {
6317
+ "type": "string"
6318
+ },
6319
+ "text": {
6320
+ "type": "string"
6321
+ },
6322
+ "textAny": {
6323
+ "type": "array",
6324
+ "items": {
6325
+ "type": "string"
6326
+ }
6327
+ },
6328
+ "className": {
6329
+ "type": "string"
6330
+ },
6331
+ "contentDescription": {
6332
+ "type": "string"
6333
+ },
6334
+ "matchType": {
6335
+ "type": "string",
6336
+ "enum": [
6337
+ "all",
6338
+ "any"
6339
+ ]
6340
+ },
6341
+ "textMatch": {
6342
+ "type": "string",
6343
+ "enum": [
6344
+ "exact",
6345
+ "contains",
6346
+ "regex"
6347
+ ],
6348
+ "description": "How to match waitFor.text; does not affect contentDescription"
6349
+ },
6350
+ "activeWindow": {
6351
+ "type": "object",
6352
+ "additionalProperties": false,
6353
+ "properties": {
6354
+ "appId": {
6355
+ "type": "string"
6356
+ },
6357
+ "packageName": {
6358
+ "type": "string"
6359
+ },
6360
+ "bundleId": {
6361
+ "type": "string"
6362
+ },
6363
+ "activityName": {
6364
+ "type": "string"
6365
+ }
6366
+ },
6367
+ "anyOf": [
6368
+ {
6369
+ "required": [
6370
+ "appId"
6371
+ ]
6372
+ },
6373
+ {
6374
+ "required": [
6375
+ "packageName"
6376
+ ]
6377
+ },
6378
+ {
6379
+ "required": [
6380
+ "bundleId"
6381
+ ]
6382
+ },
6383
+ {
6384
+ "required": [
6385
+ "activityName"
6386
+ ]
6387
+ }
6388
+ ]
6389
+ },
6390
+ "absent": {
6391
+ "type": "object",
6392
+ "additionalProperties": false,
6393
+ "description": "Wait until an element matching these fields is absent (text uses contains match)",
6394
+ "properties": {
6395
+ "elementId": {
6396
+ "type": "string"
6397
+ },
6398
+ "text": {
6399
+ "type": "string"
6400
+ },
6401
+ "className": {
6402
+ "type": "string"
6403
+ },
6404
+ "contentDescription": {
6405
+ "type": "string"
6406
+ }
6407
+ },
6408
+ "anyOf": [
6409
+ {
6410
+ "required": [
6411
+ "elementId"
6412
+ ]
6413
+ },
6414
+ {
6415
+ "required": [
6416
+ "text"
6417
+ ]
6418
+ },
6419
+ {
6420
+ "required": [
6421
+ "className"
6422
+ ]
6423
+ },
6424
+ {
6425
+ "required": [
6426
+ "contentDescription"
6427
+ ]
6428
+ }
6429
+ ]
6430
+ },
6431
+ "container": {
6432
+ "type": "object",
6433
+ "properties": {
6434
+ "elementId": {
6435
+ "type": "string"
6436
+ },
6437
+ "text": {
6438
+ "type": "string"
6439
+ }
6440
+ },
6441
+ "additionalProperties": false,
6442
+ "oneOf": [
6443
+ {
6444
+ "required": [
6445
+ "elementId"
6446
+ ]
6447
+ },
6448
+ {
6449
+ "required": [
6450
+ "text"
6451
+ ]
6452
+ }
6453
+ ]
6454
+ },
6455
+ "timeout": {
6456
+ "type": "number"
6457
+ },
6458
+ "timeoutMs": {
6459
+ "type": "number"
6460
+ }
6461
+ },
6462
+ "anyOf": [
6463
+ {
6464
+ "properties": {
6465
+ "for": {
6466
+ "const": "stable"
6467
+ }
6468
+ },
6469
+ "required": [
6470
+ "for"
6471
+ ],
6472
+ "not": {
6473
+ "required": [
6474
+ "container"
6475
+ ]
6476
+ }
6477
+ },
6478
+ {
6479
+ "properties": {
6480
+ "for": {
6481
+ "not": {
6482
+ "enum": [
6483
+ "stable",
6484
+ "textEquals"
6485
+ ]
6486
+ }
6487
+ }
6488
+ },
6489
+ "required": [
6490
+ "for",
6491
+ "elementId"
6492
+ ]
6493
+ },
6494
+ {
6495
+ "properties": {
6496
+ "for": {
6497
+ "not": {
6498
+ "const": "stable"
6499
+ }
6500
+ }
6501
+ },
6502
+ "required": [
6503
+ "for",
6504
+ "text"
6505
+ ]
6506
+ },
6507
+ {
6508
+ "required": [
6509
+ "textAny"
6510
+ ],
6511
+ "not": {
6512
+ "anyOf": [
6513
+ {
6514
+ "required": [
6515
+ "elementId"
6516
+ ]
6517
+ },
6518
+ {
6519
+ "required": [
6520
+ "text"
6521
+ ]
6522
+ },
6523
+ {
6524
+ "required": [
6525
+ "className"
6526
+ ]
6527
+ },
6528
+ {
6529
+ "required": [
6530
+ "contentDescription"
6531
+ ]
6532
+ },
6533
+ {
6534
+ "required": [
6535
+ "matchType"
6536
+ ]
6537
+ },
6538
+ {
6539
+ "required": [
6540
+ "textMatch"
6541
+ ]
6542
+ }
6543
+ ]
6544
+ }
6545
+ },
6546
+ {
6547
+ "not": {
6548
+ "anyOf": [
6549
+ {
6550
+ "required": [
6551
+ "textAny"
6552
+ ]
6553
+ },
6554
+ {
6555
+ "required": [
6556
+ "for"
6557
+ ]
6558
+ }
6559
+ ]
6560
+ },
6561
+ "anyOf": [
6562
+ {
6563
+ "required": [
6564
+ "elementId"
6565
+ ]
6566
+ },
6567
+ {
6568
+ "required": [
6569
+ "text"
6570
+ ]
6571
+ },
6572
+ {
6573
+ "required": [
6574
+ "className"
6575
+ ]
6576
+ },
6577
+ {
6578
+ "required": [
6579
+ "contentDescription"
6580
+ ]
6581
+ },
6582
+ {
6583
+ "required": [
6584
+ "activeWindow"
6585
+ ]
6586
+ },
6587
+ {
6588
+ "required": [
6589
+ "absent"
6590
+ ]
6591
+ }
5244
6592
  ]
5245
6593
  }
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
6594
+ ]
5271
6595
  },
5272
- "artifact": {
6596
+ "settled": {
6597
+ "description": "After waitFor matches, wait for a quiet hierarchy period (requires waitFor)",
5273
6598
  "type": "object",
5274
6599
  "properties": {
5275
- "path": {
5276
- "type": "string"
5277
- },
5278
- "format": {
5279
- "type": "string",
5280
- "const": "json"
5281
- },
5282
- "payload": {
5283
- "type": "string"
5284
- },
5285
- "bytes": {
6600
+ "quietPeriodMs": {
5286
6601
  "type": "integer",
5287
- "minimum": 0,
5288
- "maximum": 9007199254740991
5289
- },
5290
- "tool": {
5291
- "type": "string"
6602
+ "exclusiveMinimum": 0,
6603
+ "maximum": 9007199254740991,
6604
+ "description": "Quiet-period ms (no hierarchy change) required after waitFor matches"
5292
6605
  }
5293
6606
  },
5294
6607
  "required": [
5295
- "path",
5296
- "format",
5297
- "payload",
5298
- "bytes",
5299
- "tool"
6608
+ "quietPeriodMs"
5300
6609
  ],
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
- ]
6610
+ "additionalProperties": false
5323
6611
  },
5324
6612
  "sessionUuid": {
5325
6613
  "description": "Session",
@@ -5337,7 +6625,55 @@
5337
6625
  "url",
5338
6626
  "platform"
5339
6627
  ],
5340
- "additionalProperties": false
6628
+ "additionalProperties": false,
6629
+ "if": {
6630
+ "required": [
6631
+ "platform",
6632
+ "waitFor"
6633
+ ],
6634
+ "properties": {
6635
+ "platform": {
6636
+ "const": "ios"
6637
+ },
6638
+ "waitFor": {
6639
+ "required": [
6640
+ "activeWindow"
6641
+ ],
6642
+ "properties": {
6643
+ "activeWindow": {
6644
+ "required": [
6645
+ "activityName"
6646
+ ],
6647
+ "not": {
6648
+ "anyOf": [
6649
+ {
6650
+ "required": [
6651
+ "appId"
6652
+ ]
6653
+ },
6654
+ {
6655
+ "required": [
6656
+ "bundleId"
6657
+ ]
6658
+ },
6659
+ {
6660
+ "required": [
6661
+ "packageName"
6662
+ ]
6663
+ }
6664
+ ]
6665
+ }
6666
+ }
6667
+ }
6668
+ }
6669
+ }
6670
+ },
6671
+ "then": false,
6672
+ "dependentRequired": {
6673
+ "settled": [
6674
+ "waitFor"
6675
+ ]
6676
+ }
5341
6677
  }
5342
6678
  },
5343
6679
  {
@@ -5999,7 +7335,7 @@
5999
7335
  },
6000
7336
  {
6001
7337
  "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)",
7338
+ "description": "userId grant/revoke; device-wide reset ['all']; no POST_NOTIFICATIONS.",
6003
7339
  "inputSchema": {
6004
7340
  "$schema": "https://json-schema.org/draft/2020-12/schema",
6005
7341
  "type": "object",
@@ -6008,8 +7344,6 @@
6008
7344
  "type": "string"
6009
7345
  },
6010
7346
  "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
7347
  "enum": [
6014
7348
  "grant",
6015
7349
  "revoke",
@@ -6017,7 +7351,6 @@
6017
7351
  ]
6018
7352
  },
6019
7353
  "permissions": {
6020
- "description": "Runtime permissions or simulator privacy services to change; iOS physical reset accepts 'all'",
6021
7354
  "type": "array",
6022
7355
  "items": {
6023
7356
  "type": "string",
@@ -6025,18 +7358,17 @@
6025
7358
  }
6026
7359
  },
6027
7360
  "userId": {
6028
- "description": "Android user id",
6029
7361
  "type": "integer",
6030
7362
  "minimum": 0,
6031
7363
  "maximum": 9007199254740991
6032
7364
  },
7365
+ "notificationsEnabled": {
7366
+ "type": "boolean"
7367
+ },
6033
7368
  "notificationPolicyAccess": {
6034
- "description": "Android: set DND policy access",
6035
7369
  "type": "boolean"
6036
7370
  },
6037
7371
  "scheduleExactAlarm": {
6038
- "description": "Android: set SCHEDULE_EXACT_ALARM appop",
6039
- "type": "string",
6040
7372
  "enum": [
6041
7373
  "allow",
6042
7374
  "deny"
@@ -6050,21 +7382,60 @@
6050
7382
  ]
6051
7383
  },
6052
7384
  "sessionUuid": {
6053
- "description": "Session",
6054
7385
  "type": "string"
6055
7386
  },
6056
7387
  "keepScreenAwake": {
6057
7388
  "type": "boolean"
6058
7389
  },
6059
7390
  "device": {
6060
- "description": "Device label",
6061
7391
  "type": "string"
6062
7392
  }
6063
7393
  },
6064
7394
  "required": [
6065
7395
  "appId"
6066
7396
  ],
6067
- "additionalProperties": false
7397
+ "additionalProperties": false,
7398
+ "if": {
7399
+ "properties": {
7400
+ "action": {
7401
+ "const": "reset"
7402
+ }
7403
+ },
7404
+ "required": [
7405
+ "action"
7406
+ ]
7407
+ },
7408
+ "then": {
7409
+ "required": [
7410
+ "permissions"
7411
+ ],
7412
+ "not": {
7413
+ "required": [
7414
+ "userId"
7415
+ ]
7416
+ },
7417
+ "if": {
7418
+ "properties": {
7419
+ "platform": {
7420
+ "const": "android"
7421
+ }
7422
+ },
7423
+ "required": [
7424
+ "platform"
7425
+ ]
7426
+ },
7427
+ "then": {
7428
+ "properties": {
7429
+ "permissions": {
7430
+ "minItems": 1,
7431
+ "maxItems": 1,
7432
+ "items": {
7433
+ "const": "all"
7434
+ }
7435
+ }
7436
+ }
7437
+ }
7438
+ }
6068
7439
  }
6069
7440
  },
6070
7441
  {
@@ -6980,7 +8351,7 @@
6980
8351
  },
6981
8352
  {
6982
8353
  "name": "tapOn",
6983
- "description": "Tap an element by text/content-desc or resource-id; use sibling for adjacent controls.",
8354
+ "description": "Tap an element by text/content-desc, resource-id, or Android test tag; use sibling for adjacent controls.",
6984
8355
  "inputSchema": {
6985
8356
  "$schema": "https://json-schema.org/draft/2020-12/schema",
6986
8357
  "type": "object",
@@ -6994,6 +8365,11 @@
6994
8365
  "minLength": 1,
6995
8366
  "description": "Resource ID, e.g. com.app:id/btn_login"
6996
8367
  },
8368
+ "testTag": {
8369
+ "type": "string",
8370
+ "minLength": 1,
8371
+ "description": "Android accessibility test tag"
8372
+ },
6997
8373
  "text": {
6998
8374
  "type": "string",
6999
8375
  "minLength": 1,
@@ -7015,6 +8391,11 @@
7015
8391
  "elementId"
7016
8392
  ]
7017
8393
  },
8394
+ {
8395
+ "required": [
8396
+ "testTag"
8397
+ ]
8398
+ },
7018
8399
  {
7019
8400
  "required": [
7020
8401
  "text"
@@ -7026,7 +8407,7 @@
7026
8407
  ]
7027
8408
  }
7028
8409
  ],
7029
- "description": "Element to tap: elementId, text, or ordered text variants"
8410
+ "description": "Element to tap: elementId, Android testTag, text, or ordered text variants"
7030
8411
  },
7031
8412
  "sibling": {
7032
8413
  "description": "Tap a clickable sibling of the match, e.g. checkbox beside label",
@@ -7902,12 +9283,18 @@
7902
9283
  "bundleId": {
7903
9284
  "type": "string"
7904
9285
  },
9286
+ "navigationRoute": {
9287
+ "type": "string"
9288
+ },
7905
9289
  "navigationTitle": {
7906
9290
  "type": "string"
7907
9291
  },
7908
9292
  "selectedTab": {
7909
9293
  "type": "string"
7910
9294
  },
9295
+ "presentation": {
9296
+ "type": "string"
9297
+ },
7911
9298
  "modalClass": {
7912
9299
  "type": "string"
7913
9300
  },
@@ -8060,12 +9447,18 @@
8060
9447
  "bundleId": {
8061
9448
  "type": "string"
8062
9449
  },
9450
+ "navigationRoute": {
9451
+ "type": "string"
9452
+ },
8063
9453
  "navigationTitle": {
8064
9454
  "type": "string"
8065
9455
  },
8066
9456
  "selectedTab": {
8067
9457
  "type": "string"
8068
9458
  },
9459
+ "presentation": {
9460
+ "type": "string"
9461
+ },
8069
9462
  "modalClass": {
8070
9463
  "type": "string"
8071
9464
  },
@@ -8154,12 +9547,18 @@
8154
9547
  "bundleId": {
8155
9548
  "type": "string"
8156
9549
  },
9550
+ "navigationRoute": {
9551
+ "type": "string"
9552
+ },
8157
9553
  "navigationTitle": {
8158
9554
  "type": "string"
8159
9555
  },
8160
9556
  "selectedTab": {
8161
9557
  "type": "string"
8162
9558
  },
9559
+ "presentation": {
9560
+ "type": "string"
9561
+ },
8163
9562
  "modalClass": {
8164
9563
  "type": "string"
8165
9564
  },
@@ -9411,5 +10810,41 @@
9411
10810
  ],
9412
10811
  "additionalProperties": false
9413
10812
  }
10813
+ },
10814
+ {
10815
+ "name": "wakeAndUnlock",
10816
+ "description": "Wake a device and unlock its keyguard. Android: swipe lock or secure PIN via `pin`; iOS: wake + swipe-dismiss (pin ignored).",
10817
+ "inputSchema": {
10818
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
10819
+ "type": "object",
10820
+ "properties": {
10821
+ "pin": {
10822
+ "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.",
10823
+ "type": "string"
10824
+ },
10825
+ "platform": {
10826
+ "type": "string",
10827
+ "enum": [
10828
+ "android",
10829
+ "ios"
10830
+ ]
10831
+ },
10832
+ "sessionUuid": {
10833
+ "description": "Session",
10834
+ "type": "string"
10835
+ },
10836
+ "keepScreenAwake": {
10837
+ "type": "boolean"
10838
+ },
10839
+ "device": {
10840
+ "description": "Device label",
10841
+ "type": "string"
10842
+ }
10843
+ },
10844
+ "required": [
10845
+ "platform"
10846
+ ],
10847
+ "additionalProperties": false
10848
+ }
9414
10849
  }
9415
10850
  ]