@kaeawc/auto-mobile 0.0.27 → 0.0.30

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.
@@ -1623,11 +1623,11 @@
1623
1623
  },
1624
1624
  "elementId": {
1625
1625
  "type": "string",
1626
- "description": "Element resource ID / accessibility identifier"
1626
+ "description": "Element resource-id (e.g. \"com.app:id/btn_login\"). Only use for resource-id values."
1627
1627
  },
1628
1628
  "text": {
1629
1629
  "type": "string",
1630
- "description": "Element text"
1630
+ "description": "Element text, content-desc, or placeholder value from observe output."
1631
1631
  },
1632
1632
  "container": {
1633
1633
  "description": "Container selector object to scope search. Provide { \"elementId\": \"<id>\" } or { \"text\": \"<text>\" }.",
@@ -3967,6 +3967,59 @@
3967
3967
  "additionalProperties": false
3968
3968
  }
3969
3969
  },
3970
+ {
3971
+ "name": "phoneCall",
3972
+ "description": "Simulate an incoming phone call on an Android emulator via the emulator console (gsm call/accept/cancel/busy/hold). Emulator-only: physical devices return an unsupported error.",
3973
+ "inputSchema": {
3974
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3975
+ "type": "object",
3976
+ "properties": {
3977
+ "action": {
3978
+ "type": "string",
3979
+ "enum": [
3980
+ "call",
3981
+ "accept",
3982
+ "cancel",
3983
+ "busy",
3984
+ "hold"
3985
+ ],
3986
+ "description": "Phone call action: 'call' simulates an incoming call; 'accept' answers a ringing or waiting call; 'cancel' ends the call from the network side; 'busy' rejects a waiting call with a busy signal; 'hold' puts the active call on hold (no phoneNumber required)."
3987
+ },
3988
+ "phoneNumber": {
3989
+ "description": "Phone number for the call action. Required for all actions except 'hold'. Digits with optional leading '+', max 20 digits.",
3990
+ "type": "string"
3991
+ },
3992
+ "platform": {
3993
+ "type": "string",
3994
+ "enum": [
3995
+ "android",
3996
+ "ios"
3997
+ ],
3998
+ "description": "Target platform"
3999
+ },
4000
+ "sessionUuid": {
4001
+ "description": "Session UUID",
4002
+ "type": "string"
4003
+ },
4004
+ "keepScreenAwake": {
4005
+ "description": "Keep device awake",
4006
+ "type": "boolean"
4007
+ },
4008
+ "device": {
4009
+ "description": "Device label for multi-device plans (e.g., \"A\", \"B\")",
4010
+ "type": "string"
4011
+ },
4012
+ "deviceId": {
4013
+ "description": "Device ID",
4014
+ "type": "string"
4015
+ }
4016
+ },
4017
+ "required": [
4018
+ "action"
4019
+ ],
4020
+ "additionalProperties": false
4021
+ }
4022
+ },
3970
4023
  {
3971
4024
  "name": "pinchOn",
3972
4025
  "description": "Pinch to zoom",
@@ -4413,6 +4466,53 @@
4413
4466
  "additionalProperties": false
4414
4467
  }
4415
4468
  },
4469
+ {
4470
+ "name": "sendSms",
4471
+ "description": "Send a simulated incoming SMS to an Android emulator via the emulator console (sms send). Emulator-only: physical devices return an unsupported error.",
4472
+ "inputSchema": {
4473
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
4474
+ "type": "object",
4475
+ "properties": {
4476
+ "phoneNumber": {
4477
+ "type": "string",
4478
+ "description": "Sender phone number for the simulated incoming SMS. Digits with optional leading '+', max 20 digits."
4479
+ },
4480
+ "message": {
4481
+ "type": "string",
4482
+ "description": "SMS message body. Max 1024 characters. Must not contain newlines, carriage returns, or NUL bytes."
4483
+ },
4484
+ "platform": {
4485
+ "type": "string",
4486
+ "enum": [
4487
+ "android",
4488
+ "ios"
4489
+ ],
4490
+ "description": "Target platform"
4491
+ },
4492
+ "sessionUuid": {
4493
+ "description": "Session UUID",
4494
+ "type": "string"
4495
+ },
4496
+ "keepScreenAwake": {
4497
+ "description": "Keep device awake",
4498
+ "type": "boolean"
4499
+ },
4500
+ "device": {
4501
+ "description": "Device label for multi-device plans (e.g., \"A\", \"B\")",
4502
+ "type": "string"
4503
+ },
4504
+ "deviceId": {
4505
+ "description": "Device ID",
4506
+ "type": "string"
4507
+ }
4508
+ },
4509
+ "required": [
4510
+ "phoneNumber",
4511
+ "message"
4512
+ ],
4513
+ "additionalProperties": false
4514
+ }
4515
+ },
4416
4516
  {
4417
4517
  "name": "setActiveDevice",
4418
4518
  "description": "Set active device",
@@ -5862,8 +5962,8 @@
5862
5962
  }
5863
5963
  },
5864
5964
  {
5865
- "name": "tapOn",
5866
- "description": "Tap UI elements by text or ID (returns selectedElement metadata)",
5965
+ "name": "tapAny",
5966
+ "description": "Tap any clickable element without knowing its text or ID. Good for tapping the first list item. Use container to scope, selectionStrategy to pick 'first' (default) or 'random', and scrollableContainer: true to limit to list/RecyclerView items.",
5867
5967
  "inputSchema": {
5868
5968
  "$schema": "https://json-schema.org/draft/2020-12/schema",
5869
5969
  "type": "object",
@@ -5899,6 +5999,18 @@
5899
5999
  }
5900
6000
  ]
5901
6001
  },
6002
+ "selectionStrategy": {
6003
+ "description": "Element selection strategy: 'first' (default) or 'random'",
6004
+ "type": "string",
6005
+ "enum": [
6006
+ "first",
6007
+ "random"
6008
+ ]
6009
+ },
6010
+ "scrollableContainer": {
6011
+ "description": "Only search within scrollable containers (lists/RecyclerViews). Use this to avoid tapping search bars or other clickable UI elements when you want the first list item.",
6012
+ "type": "boolean"
6013
+ },
5902
6014
  "action": {
5903
6015
  "default": "tap",
5904
6016
  "description": "Action type (default: tap)",
@@ -5906,16 +6018,7 @@
5906
6018
  "enum": [
5907
6019
  "tap",
5908
6020
  "doubleTap",
5909
- "longPress",
5910
- "focus"
5911
- ]
5912
- },
5913
- "selectionStrategy": {
5914
- "description": "Element selection strategy when multiple matches are found (default: first)",
5915
- "type": "string",
5916
- "enum": [
5917
- "first",
5918
- "random"
6021
+ "longPress"
5919
6022
  ]
5920
6023
  },
5921
6024
  "duration": {
@@ -5923,7 +6026,7 @@
5923
6026
  "type": "number"
5924
6027
  },
5925
6028
  "searchUntil": {
5926
- "description": "Poll for element before tapping",
6029
+ "description": "Poll for clickable element before tapping",
5927
6030
  "type": "object",
5928
6031
  "properties": {
5929
6032
  "duration": {
@@ -5935,18 +6038,6 @@
5935
6038
  },
5936
6039
  "additionalProperties": false
5937
6040
  },
5938
- "preTapStability": {
5939
- "description": "When true, refresh the accessibility hierarchy before tapping and require consecutive re-finds with stable bounds before dispatching the gesture. Prevents tapping stale coordinates when the UI is still settling (loading overlays, list refreshes, keyboard). Recommended for search result lists and dynamic content.",
5940
- "type": "boolean"
5941
- },
5942
- "retryIfNoChange": {
5943
- "description": "When true, compare the view hierarchy before and after the tap. If unchanged (ghost tap detected), retry the tap once after a short delay. Recommended for taps that should cause obvious UI changes like navigation or screen transitions.",
5944
- "type": "boolean"
5945
- },
5946
- "ensureTap": {
5947
- "description": "Convenience flag that enables both preTapStability and retryIfNoChange. Use on taps in dynamic UI where you want both stable bounds before tapping and ghost-tap detection after.",
5948
- "type": "boolean"
5949
- },
5950
6041
  "platform": {
5951
6042
  "type": "string",
5952
6043
  "enum": [
@@ -5955,14 +6046,6 @@
5955
6046
  ],
5956
6047
  "description": "Target platform"
5957
6048
  },
5958
- "elementId": {
5959
- "type": "string",
5960
- "description": "Element resource ID / accessibility identifier"
5961
- },
5962
- "text": {
5963
- "type": "string",
5964
- "description": "Element text"
5965
- },
5966
6049
  "sessionUuid": {
5967
6050
  "description": "Session UUID",
5968
6051
  "type": "string"
@@ -5978,26 +6061,1142 @@
5978
6061
  "deviceId": {
5979
6062
  "description": "Device ID",
5980
6063
  "type": "string"
5981
- },
5982
- "tapClickableParent": {
5983
- "description": "Tap the nearest clickable parent that contains the text element. Useful for list items where the clickable row doesn't have a resource-id but contains children with text.",
6064
+ }
6065
+ },
6066
+ "required": [
6067
+ "action",
6068
+ "platform"
6069
+ ],
6070
+ "additionalProperties": false
6071
+ },
6072
+ "outputSchema": {
6073
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
6074
+ "type": "object",
6075
+ "properties": {
6076
+ "success": {
5984
6077
  "type": "boolean"
5985
6078
  },
5986
- "clickable": {
5987
- "type": "boolean",
5988
- "const": true,
5989
- "description": "Select clickable elements. Use with selectionStrategy: 'first' to tap the first clickable item in a list without knowing its text or ID."
6079
+ "action": {
6080
+ "type": "string",
6081
+ "enum": [
6082
+ "tap",
6083
+ "doubleTap",
6084
+ "longPress",
6085
+ "focus"
6086
+ ]
5990
6087
  },
5991
- "scrollableContainer": {
5992
- "description": "Only search within scrollable containers (lists/RecyclerViews). Use this to avoid tapping search bars or other clickable UI elements when you want the first list item.",
5993
- "type": "boolean"
6088
+ "message": {
6089
+ "type": "string"
5994
6090
  },
5995
- "siblingOfText": {
5996
- "type": "string",
5997
- "minLength": 1,
5998
- "description": "Find a clickable element that is a sibling of an element containing this text. Useful for tapping checkboxes, icons, or buttons next to a specific text label."
5999
- }
6000
- },
6091
+ "element": {
6092
+ "type": "object",
6093
+ "properties": {
6094
+ "bounds": {
6095
+ "type": "object",
6096
+ "properties": {
6097
+ "left": {
6098
+ "type": "integer",
6099
+ "minimum": -9007199254740991,
6100
+ "maximum": 9007199254740991
6101
+ },
6102
+ "top": {
6103
+ "type": "integer",
6104
+ "minimum": -9007199254740991,
6105
+ "maximum": 9007199254740991
6106
+ },
6107
+ "right": {
6108
+ "type": "integer",
6109
+ "minimum": -9007199254740991,
6110
+ "maximum": 9007199254740991
6111
+ },
6112
+ "bottom": {
6113
+ "type": "integer",
6114
+ "minimum": -9007199254740991,
6115
+ "maximum": 9007199254740991
6116
+ },
6117
+ "centerX": {
6118
+ "type": "integer",
6119
+ "minimum": -9007199254740991,
6120
+ "maximum": 9007199254740991
6121
+ },
6122
+ "centerY": {
6123
+ "type": "integer",
6124
+ "minimum": -9007199254740991,
6125
+ "maximum": 9007199254740991
6126
+ }
6127
+ },
6128
+ "required": [
6129
+ "left",
6130
+ "top",
6131
+ "right",
6132
+ "bottom"
6133
+ ],
6134
+ "additionalProperties": false
6135
+ },
6136
+ "text": {
6137
+ "type": "string"
6138
+ },
6139
+ "resource-id": {
6140
+ "type": "string"
6141
+ },
6142
+ "content-desc": {
6143
+ "type": "string"
6144
+ },
6145
+ "class": {
6146
+ "type": "string"
6147
+ },
6148
+ "package": {
6149
+ "type": "string"
6150
+ },
6151
+ "checkable": {
6152
+ "anyOf": [
6153
+ {
6154
+ "type": "boolean"
6155
+ },
6156
+ {
6157
+ "type": "string",
6158
+ "const": "true"
6159
+ },
6160
+ {
6161
+ "type": "string",
6162
+ "const": "false"
6163
+ }
6164
+ ]
6165
+ },
6166
+ "checked": {
6167
+ "anyOf": [
6168
+ {
6169
+ "type": "boolean"
6170
+ },
6171
+ {
6172
+ "type": "string",
6173
+ "const": "true"
6174
+ },
6175
+ {
6176
+ "type": "string",
6177
+ "const": "false"
6178
+ }
6179
+ ]
6180
+ },
6181
+ "clickable": {
6182
+ "anyOf": [
6183
+ {
6184
+ "type": "boolean"
6185
+ },
6186
+ {
6187
+ "type": "string",
6188
+ "const": "true"
6189
+ },
6190
+ {
6191
+ "type": "string",
6192
+ "const": "false"
6193
+ }
6194
+ ]
6195
+ },
6196
+ "enabled": {
6197
+ "anyOf": [
6198
+ {
6199
+ "type": "boolean"
6200
+ },
6201
+ {
6202
+ "type": "string",
6203
+ "const": "true"
6204
+ },
6205
+ {
6206
+ "type": "string",
6207
+ "const": "false"
6208
+ }
6209
+ ]
6210
+ },
6211
+ "focusable": {
6212
+ "anyOf": [
6213
+ {
6214
+ "type": "boolean"
6215
+ },
6216
+ {
6217
+ "type": "string",
6218
+ "const": "true"
6219
+ },
6220
+ {
6221
+ "type": "string",
6222
+ "const": "false"
6223
+ }
6224
+ ]
6225
+ },
6226
+ "focused": {
6227
+ "anyOf": [
6228
+ {
6229
+ "type": "boolean"
6230
+ },
6231
+ {
6232
+ "type": "string",
6233
+ "const": "true"
6234
+ },
6235
+ {
6236
+ "type": "string",
6237
+ "const": "false"
6238
+ }
6239
+ ]
6240
+ },
6241
+ "accessibility-focused": {
6242
+ "anyOf": [
6243
+ {
6244
+ "type": "boolean"
6245
+ },
6246
+ {
6247
+ "type": "string",
6248
+ "const": "true"
6249
+ },
6250
+ {
6251
+ "type": "string",
6252
+ "const": "false"
6253
+ }
6254
+ ]
6255
+ },
6256
+ "scrollable": {
6257
+ "anyOf": [
6258
+ {
6259
+ "type": "boolean"
6260
+ },
6261
+ {
6262
+ "type": "string",
6263
+ "const": "true"
6264
+ },
6265
+ {
6266
+ "type": "string",
6267
+ "const": "false"
6268
+ }
6269
+ ]
6270
+ },
6271
+ "selected": {
6272
+ "anyOf": [
6273
+ {
6274
+ "type": "boolean"
6275
+ },
6276
+ {
6277
+ "type": "string",
6278
+ "const": "true"
6279
+ },
6280
+ {
6281
+ "type": "string",
6282
+ "const": "false"
6283
+ }
6284
+ ]
6285
+ }
6286
+ },
6287
+ "required": [
6288
+ "bounds"
6289
+ ],
6290
+ "additionalProperties": {}
6291
+ },
6292
+ "observation": {
6293
+ "type": "object",
6294
+ "properties": {
6295
+ "selectedElements": {
6296
+ "type": "array",
6297
+ "items": {
6298
+ "type": "object",
6299
+ "properties": {
6300
+ "text": {
6301
+ "type": "string"
6302
+ },
6303
+ "resourceId": {
6304
+ "type": "string"
6305
+ },
6306
+ "contentDesc": {
6307
+ "type": "string"
6308
+ },
6309
+ "bounds": {
6310
+ "type": "object",
6311
+ "properties": {
6312
+ "left": {
6313
+ "type": "integer",
6314
+ "minimum": -9007199254740991,
6315
+ "maximum": 9007199254740991
6316
+ },
6317
+ "top": {
6318
+ "type": "integer",
6319
+ "minimum": -9007199254740991,
6320
+ "maximum": 9007199254740991
6321
+ },
6322
+ "right": {
6323
+ "type": "integer",
6324
+ "minimum": -9007199254740991,
6325
+ "maximum": 9007199254740991
6326
+ },
6327
+ "bottom": {
6328
+ "type": "integer",
6329
+ "minimum": -9007199254740991,
6330
+ "maximum": 9007199254740991
6331
+ },
6332
+ "centerX": {
6333
+ "type": "integer",
6334
+ "minimum": -9007199254740991,
6335
+ "maximum": 9007199254740991
6336
+ },
6337
+ "centerY": {
6338
+ "type": "integer",
6339
+ "minimum": -9007199254740991,
6340
+ "maximum": 9007199254740991
6341
+ }
6342
+ },
6343
+ "required": [
6344
+ "left",
6345
+ "top",
6346
+ "right",
6347
+ "bottom"
6348
+ ],
6349
+ "additionalProperties": false
6350
+ },
6351
+ "indexInMatches": {
6352
+ "type": "integer",
6353
+ "minimum": -9007199254740991,
6354
+ "maximum": 9007199254740991
6355
+ },
6356
+ "totalMatches": {
6357
+ "type": "integer",
6358
+ "minimum": -9007199254740991,
6359
+ "maximum": 9007199254740991
6360
+ },
6361
+ "selectionStrategy": {
6362
+ "type": "string"
6363
+ },
6364
+ "selectedState": {
6365
+ "type": "object",
6366
+ "properties": {
6367
+ "method": {
6368
+ "type": "string",
6369
+ "enum": [
6370
+ "accessibility",
6371
+ "visual"
6372
+ ]
6373
+ },
6374
+ "confidence": {
6375
+ "type": "number"
6376
+ },
6377
+ "reason": {
6378
+ "type": "string"
6379
+ }
6380
+ },
6381
+ "required": [
6382
+ "method",
6383
+ "confidence"
6384
+ ],
6385
+ "additionalProperties": false
6386
+ }
6387
+ },
6388
+ "additionalProperties": {}
6389
+ }
6390
+ },
6391
+ "focusedElement": {
6392
+ "type": "object",
6393
+ "properties": {
6394
+ "bounds": {
6395
+ "type": "object",
6396
+ "properties": {
6397
+ "left": {
6398
+ "type": "integer",
6399
+ "minimum": -9007199254740991,
6400
+ "maximum": 9007199254740991
6401
+ },
6402
+ "top": {
6403
+ "type": "integer",
6404
+ "minimum": -9007199254740991,
6405
+ "maximum": 9007199254740991
6406
+ },
6407
+ "right": {
6408
+ "type": "integer",
6409
+ "minimum": -9007199254740991,
6410
+ "maximum": 9007199254740991
6411
+ },
6412
+ "bottom": {
6413
+ "type": "integer",
6414
+ "minimum": -9007199254740991,
6415
+ "maximum": 9007199254740991
6416
+ },
6417
+ "centerX": {
6418
+ "type": "integer",
6419
+ "minimum": -9007199254740991,
6420
+ "maximum": 9007199254740991
6421
+ },
6422
+ "centerY": {
6423
+ "type": "integer",
6424
+ "minimum": -9007199254740991,
6425
+ "maximum": 9007199254740991
6426
+ }
6427
+ },
6428
+ "required": [
6429
+ "left",
6430
+ "top",
6431
+ "right",
6432
+ "bottom"
6433
+ ],
6434
+ "additionalProperties": false
6435
+ },
6436
+ "text": {
6437
+ "type": "string"
6438
+ },
6439
+ "resource-id": {
6440
+ "type": "string"
6441
+ },
6442
+ "content-desc": {
6443
+ "type": "string"
6444
+ },
6445
+ "class": {
6446
+ "type": "string"
6447
+ },
6448
+ "package": {
6449
+ "type": "string"
6450
+ },
6451
+ "checkable": {
6452
+ "anyOf": [
6453
+ {
6454
+ "type": "boolean"
6455
+ },
6456
+ {
6457
+ "type": "string",
6458
+ "const": "true"
6459
+ },
6460
+ {
6461
+ "type": "string",
6462
+ "const": "false"
6463
+ }
6464
+ ]
6465
+ },
6466
+ "checked": {
6467
+ "anyOf": [
6468
+ {
6469
+ "type": "boolean"
6470
+ },
6471
+ {
6472
+ "type": "string",
6473
+ "const": "true"
6474
+ },
6475
+ {
6476
+ "type": "string",
6477
+ "const": "false"
6478
+ }
6479
+ ]
6480
+ },
6481
+ "clickable": {
6482
+ "anyOf": [
6483
+ {
6484
+ "type": "boolean"
6485
+ },
6486
+ {
6487
+ "type": "string",
6488
+ "const": "true"
6489
+ },
6490
+ {
6491
+ "type": "string",
6492
+ "const": "false"
6493
+ }
6494
+ ]
6495
+ },
6496
+ "enabled": {
6497
+ "anyOf": [
6498
+ {
6499
+ "type": "boolean"
6500
+ },
6501
+ {
6502
+ "type": "string",
6503
+ "const": "true"
6504
+ },
6505
+ {
6506
+ "type": "string",
6507
+ "const": "false"
6508
+ }
6509
+ ]
6510
+ },
6511
+ "focusable": {
6512
+ "anyOf": [
6513
+ {
6514
+ "type": "boolean"
6515
+ },
6516
+ {
6517
+ "type": "string",
6518
+ "const": "true"
6519
+ },
6520
+ {
6521
+ "type": "string",
6522
+ "const": "false"
6523
+ }
6524
+ ]
6525
+ },
6526
+ "focused": {
6527
+ "anyOf": [
6528
+ {
6529
+ "type": "boolean"
6530
+ },
6531
+ {
6532
+ "type": "string",
6533
+ "const": "true"
6534
+ },
6535
+ {
6536
+ "type": "string",
6537
+ "const": "false"
6538
+ }
6539
+ ]
6540
+ },
6541
+ "accessibility-focused": {
6542
+ "anyOf": [
6543
+ {
6544
+ "type": "boolean"
6545
+ },
6546
+ {
6547
+ "type": "string",
6548
+ "const": "true"
6549
+ },
6550
+ {
6551
+ "type": "string",
6552
+ "const": "false"
6553
+ }
6554
+ ]
6555
+ },
6556
+ "scrollable": {
6557
+ "anyOf": [
6558
+ {
6559
+ "type": "boolean"
6560
+ },
6561
+ {
6562
+ "type": "string",
6563
+ "const": "true"
6564
+ },
6565
+ {
6566
+ "type": "string",
6567
+ "const": "false"
6568
+ }
6569
+ ]
6570
+ },
6571
+ "selected": {
6572
+ "anyOf": [
6573
+ {
6574
+ "type": "boolean"
6575
+ },
6576
+ {
6577
+ "type": "string",
6578
+ "const": "true"
6579
+ },
6580
+ {
6581
+ "type": "string",
6582
+ "const": "false"
6583
+ }
6584
+ ]
6585
+ }
6586
+ },
6587
+ "required": [
6588
+ "bounds"
6589
+ ],
6590
+ "additionalProperties": {}
6591
+ },
6592
+ "accessibilityFocusedElement": {
6593
+ "type": "object",
6594
+ "properties": {
6595
+ "bounds": {
6596
+ "type": "object",
6597
+ "properties": {
6598
+ "left": {
6599
+ "type": "integer",
6600
+ "minimum": -9007199254740991,
6601
+ "maximum": 9007199254740991
6602
+ },
6603
+ "top": {
6604
+ "type": "integer",
6605
+ "minimum": -9007199254740991,
6606
+ "maximum": 9007199254740991
6607
+ },
6608
+ "right": {
6609
+ "type": "integer",
6610
+ "minimum": -9007199254740991,
6611
+ "maximum": 9007199254740991
6612
+ },
6613
+ "bottom": {
6614
+ "type": "integer",
6615
+ "minimum": -9007199254740991,
6616
+ "maximum": 9007199254740991
6617
+ },
6618
+ "centerX": {
6619
+ "type": "integer",
6620
+ "minimum": -9007199254740991,
6621
+ "maximum": 9007199254740991
6622
+ },
6623
+ "centerY": {
6624
+ "type": "integer",
6625
+ "minimum": -9007199254740991,
6626
+ "maximum": 9007199254740991
6627
+ }
6628
+ },
6629
+ "required": [
6630
+ "left",
6631
+ "top",
6632
+ "right",
6633
+ "bottom"
6634
+ ],
6635
+ "additionalProperties": false
6636
+ },
6637
+ "text": {
6638
+ "type": "string"
6639
+ },
6640
+ "resource-id": {
6641
+ "type": "string"
6642
+ },
6643
+ "content-desc": {
6644
+ "type": "string"
6645
+ },
6646
+ "class": {
6647
+ "type": "string"
6648
+ },
6649
+ "package": {
6650
+ "type": "string"
6651
+ },
6652
+ "checkable": {
6653
+ "anyOf": [
6654
+ {
6655
+ "type": "boolean"
6656
+ },
6657
+ {
6658
+ "type": "string",
6659
+ "const": "true"
6660
+ },
6661
+ {
6662
+ "type": "string",
6663
+ "const": "false"
6664
+ }
6665
+ ]
6666
+ },
6667
+ "checked": {
6668
+ "anyOf": [
6669
+ {
6670
+ "type": "boolean"
6671
+ },
6672
+ {
6673
+ "type": "string",
6674
+ "const": "true"
6675
+ },
6676
+ {
6677
+ "type": "string",
6678
+ "const": "false"
6679
+ }
6680
+ ]
6681
+ },
6682
+ "clickable": {
6683
+ "anyOf": [
6684
+ {
6685
+ "type": "boolean"
6686
+ },
6687
+ {
6688
+ "type": "string",
6689
+ "const": "true"
6690
+ },
6691
+ {
6692
+ "type": "string",
6693
+ "const": "false"
6694
+ }
6695
+ ]
6696
+ },
6697
+ "enabled": {
6698
+ "anyOf": [
6699
+ {
6700
+ "type": "boolean"
6701
+ },
6702
+ {
6703
+ "type": "string",
6704
+ "const": "true"
6705
+ },
6706
+ {
6707
+ "type": "string",
6708
+ "const": "false"
6709
+ }
6710
+ ]
6711
+ },
6712
+ "focusable": {
6713
+ "anyOf": [
6714
+ {
6715
+ "type": "boolean"
6716
+ },
6717
+ {
6718
+ "type": "string",
6719
+ "const": "true"
6720
+ },
6721
+ {
6722
+ "type": "string",
6723
+ "const": "false"
6724
+ }
6725
+ ]
6726
+ },
6727
+ "focused": {
6728
+ "anyOf": [
6729
+ {
6730
+ "type": "boolean"
6731
+ },
6732
+ {
6733
+ "type": "string",
6734
+ "const": "true"
6735
+ },
6736
+ {
6737
+ "type": "string",
6738
+ "const": "false"
6739
+ }
6740
+ ]
6741
+ },
6742
+ "accessibility-focused": {
6743
+ "anyOf": [
6744
+ {
6745
+ "type": "boolean"
6746
+ },
6747
+ {
6748
+ "type": "string",
6749
+ "const": "true"
6750
+ },
6751
+ {
6752
+ "type": "string",
6753
+ "const": "false"
6754
+ }
6755
+ ]
6756
+ },
6757
+ "scrollable": {
6758
+ "anyOf": [
6759
+ {
6760
+ "type": "boolean"
6761
+ },
6762
+ {
6763
+ "type": "string",
6764
+ "const": "true"
6765
+ },
6766
+ {
6767
+ "type": "string",
6768
+ "const": "false"
6769
+ }
6770
+ ]
6771
+ },
6772
+ "selected": {
6773
+ "anyOf": [
6774
+ {
6775
+ "type": "boolean"
6776
+ },
6777
+ {
6778
+ "type": "string",
6779
+ "const": "true"
6780
+ },
6781
+ {
6782
+ "type": "string",
6783
+ "const": "false"
6784
+ }
6785
+ ]
6786
+ }
6787
+ },
6788
+ "required": [
6789
+ "bounds"
6790
+ ],
6791
+ "additionalProperties": {}
6792
+ },
6793
+ "activeWindow": {
6794
+ "type": "object",
6795
+ "properties": {
6796
+ "appId": {
6797
+ "type": "string"
6798
+ },
6799
+ "activityName": {
6800
+ "type": "string"
6801
+ },
6802
+ "layoutSeqSum": {
6803
+ "type": "integer",
6804
+ "minimum": -9007199254740991,
6805
+ "maximum": 9007199254740991
6806
+ },
6807
+ "type": {
6808
+ "type": "string"
6809
+ }
6810
+ },
6811
+ "additionalProperties": {}
6812
+ }
6813
+ },
6814
+ "additionalProperties": {}
6815
+ },
6816
+ "selectedElement": {
6817
+ "type": "object",
6818
+ "properties": {
6819
+ "text": {
6820
+ "type": "string"
6821
+ },
6822
+ "resourceId": {
6823
+ "type": "string"
6824
+ },
6825
+ "contentDesc": {
6826
+ "type": "string"
6827
+ },
6828
+ "bounds": {
6829
+ "type": "object",
6830
+ "properties": {
6831
+ "left": {
6832
+ "type": "integer",
6833
+ "minimum": -9007199254740991,
6834
+ "maximum": 9007199254740991
6835
+ },
6836
+ "top": {
6837
+ "type": "integer",
6838
+ "minimum": -9007199254740991,
6839
+ "maximum": 9007199254740991
6840
+ },
6841
+ "right": {
6842
+ "type": "integer",
6843
+ "minimum": -9007199254740991,
6844
+ "maximum": 9007199254740991
6845
+ },
6846
+ "bottom": {
6847
+ "type": "integer",
6848
+ "minimum": -9007199254740991,
6849
+ "maximum": 9007199254740991
6850
+ },
6851
+ "centerX": {
6852
+ "type": "integer",
6853
+ "minimum": -9007199254740991,
6854
+ "maximum": 9007199254740991
6855
+ },
6856
+ "centerY": {
6857
+ "type": "integer",
6858
+ "minimum": -9007199254740991,
6859
+ "maximum": 9007199254740991
6860
+ }
6861
+ },
6862
+ "required": [
6863
+ "left",
6864
+ "top",
6865
+ "right",
6866
+ "bottom"
6867
+ ],
6868
+ "additionalProperties": false
6869
+ },
6870
+ "indexInMatches": {
6871
+ "type": "integer",
6872
+ "minimum": -9007199254740991,
6873
+ "maximum": 9007199254740991
6874
+ },
6875
+ "totalMatches": {
6876
+ "type": "integer",
6877
+ "minimum": -9007199254740991,
6878
+ "maximum": 9007199254740991
6879
+ },
6880
+ "selectionStrategy": {
6881
+ "type": "string"
6882
+ },
6883
+ "selectedState": {
6884
+ "type": "object",
6885
+ "properties": {
6886
+ "method": {
6887
+ "type": "string",
6888
+ "enum": [
6889
+ "accessibility",
6890
+ "visual"
6891
+ ]
6892
+ },
6893
+ "confidence": {
6894
+ "type": "number"
6895
+ },
6896
+ "reason": {
6897
+ "type": "string"
6898
+ }
6899
+ },
6900
+ "required": [
6901
+ "method",
6902
+ "confidence"
6903
+ ],
6904
+ "additionalProperties": false
6905
+ }
6906
+ },
6907
+ "additionalProperties": {}
6908
+ },
6909
+ "selectedElements": {
6910
+ "type": "array",
6911
+ "items": {
6912
+ "type": "object",
6913
+ "properties": {
6914
+ "text": {
6915
+ "type": "string"
6916
+ },
6917
+ "resourceId": {
6918
+ "type": "string"
6919
+ },
6920
+ "contentDesc": {
6921
+ "type": "string"
6922
+ },
6923
+ "bounds": {
6924
+ "type": "object",
6925
+ "properties": {
6926
+ "left": {
6927
+ "type": "integer",
6928
+ "minimum": -9007199254740991,
6929
+ "maximum": 9007199254740991
6930
+ },
6931
+ "top": {
6932
+ "type": "integer",
6933
+ "minimum": -9007199254740991,
6934
+ "maximum": 9007199254740991
6935
+ },
6936
+ "right": {
6937
+ "type": "integer",
6938
+ "minimum": -9007199254740991,
6939
+ "maximum": 9007199254740991
6940
+ },
6941
+ "bottom": {
6942
+ "type": "integer",
6943
+ "minimum": -9007199254740991,
6944
+ "maximum": 9007199254740991
6945
+ },
6946
+ "centerX": {
6947
+ "type": "integer",
6948
+ "minimum": -9007199254740991,
6949
+ "maximum": 9007199254740991
6950
+ },
6951
+ "centerY": {
6952
+ "type": "integer",
6953
+ "minimum": -9007199254740991,
6954
+ "maximum": 9007199254740991
6955
+ }
6956
+ },
6957
+ "required": [
6958
+ "left",
6959
+ "top",
6960
+ "right",
6961
+ "bottom"
6962
+ ],
6963
+ "additionalProperties": false
6964
+ },
6965
+ "indexInMatches": {
6966
+ "type": "integer",
6967
+ "minimum": -9007199254740991,
6968
+ "maximum": 9007199254740991
6969
+ },
6970
+ "totalMatches": {
6971
+ "type": "integer",
6972
+ "minimum": -9007199254740991,
6973
+ "maximum": 9007199254740991
6974
+ },
6975
+ "selectionStrategy": {
6976
+ "type": "string"
6977
+ },
6978
+ "selectedState": {
6979
+ "type": "object",
6980
+ "properties": {
6981
+ "method": {
6982
+ "type": "string",
6983
+ "enum": [
6984
+ "accessibility",
6985
+ "visual"
6986
+ ]
6987
+ },
6988
+ "confidence": {
6989
+ "type": "number"
6990
+ },
6991
+ "reason": {
6992
+ "type": "string"
6993
+ }
6994
+ },
6995
+ "required": [
6996
+ "method",
6997
+ "confidence"
6998
+ ],
6999
+ "additionalProperties": false
7000
+ }
7001
+ },
7002
+ "additionalProperties": {}
7003
+ }
7004
+ },
7005
+ "error": {
7006
+ "type": "string"
7007
+ },
7008
+ "pressRecognized": {
7009
+ "type": "boolean"
7010
+ },
7011
+ "contextMenuOpened": {
7012
+ "type": "boolean"
7013
+ },
7014
+ "selectionStarted": {
7015
+ "type": "boolean"
7016
+ },
7017
+ "searchUntil": {
7018
+ "type": "object",
7019
+ "properties": {
7020
+ "durationMs": {
7021
+ "type": "integer",
7022
+ "minimum": -9007199254740991,
7023
+ "maximum": 9007199254740991
7024
+ },
7025
+ "requestCount": {
7026
+ "type": "integer",
7027
+ "minimum": -9007199254740991,
7028
+ "maximum": 9007199254740991
7029
+ },
7030
+ "changeCount": {
7031
+ "type": "integer",
7032
+ "minimum": -9007199254740991,
7033
+ "maximum": 9007199254740991
7034
+ }
7035
+ },
7036
+ "additionalProperties": false
7037
+ },
7038
+ "debug": {}
7039
+ },
7040
+ "required": [
7041
+ "success",
7042
+ "action"
7043
+ ],
7044
+ "additionalProperties": {}
7045
+ }
7046
+ },
7047
+ {
7048
+ "name": "tapOn",
7049
+ "description": "Tap a specific UI element identified by text or resource-id.\nProvide a selector: { \"text\": \"Login\" } or { \"elementId\": \"com.app:id/btn\" }.\nSet sibling: true to tap a clickable sibling adjacent to the matched element (e.g., a checkbox next to a label).\ncontent-desc values from observe should be passed as text, not elementId.",
7050
+ "inputSchema": {
7051
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
7052
+ "type": "object",
7053
+ "properties": {
7054
+ "selector": {
7055
+ "anyOf": [
7056
+ {
7057
+ "type": "object",
7058
+ "properties": {
7059
+ "elementId": {
7060
+ "type": "string",
7061
+ "minLength": 1,
7062
+ "description": "Element resource-id (e.g. \"com.app:id/btn_login\"). Only use for resource-id values."
7063
+ }
7064
+ },
7065
+ "required": [
7066
+ "elementId"
7067
+ ],
7068
+ "additionalProperties": false
7069
+ },
7070
+ {
7071
+ "type": "object",
7072
+ "properties": {
7073
+ "text": {
7074
+ "type": "string",
7075
+ "minLength": 1,
7076
+ "description": "Element text, content-desc, or placeholder value from observe output."
7077
+ }
7078
+ },
7079
+ "required": [
7080
+ "text"
7081
+ ],
7082
+ "additionalProperties": false
7083
+ }
7084
+ ],
7085
+ "description": "Element to tap. Provide exactly one of elementId or text."
7086
+ },
7087
+ "sibling": {
7088
+ "description": "When true, tap a clickable sibling of the matched element instead of the element itself. Useful for tapping checkboxes, icons, or buttons adjacent to a text label.",
7089
+ "type": "boolean"
7090
+ },
7091
+ "container": {
7092
+ "description": "Container selector object to scope search. Provide { \"elementId\": \"<id>\" } or { \"text\": \"<text>\" }.",
7093
+ "anyOf": [
7094
+ {
7095
+ "type": "object",
7096
+ "properties": {
7097
+ "elementId": {
7098
+ "type": "string",
7099
+ "description": "Container resource ID"
7100
+ }
7101
+ },
7102
+ "required": [
7103
+ "elementId"
7104
+ ],
7105
+ "additionalProperties": false
7106
+ },
7107
+ {
7108
+ "type": "object",
7109
+ "properties": {
7110
+ "text": {
7111
+ "type": "string",
7112
+ "description": "Container text"
7113
+ }
7114
+ },
7115
+ "required": [
7116
+ "text"
7117
+ ],
7118
+ "additionalProperties": false
7119
+ }
7120
+ ]
7121
+ },
7122
+ "action": {
7123
+ "default": "tap",
7124
+ "description": "Action type (default: tap)",
7125
+ "type": "string",
7126
+ "enum": [
7127
+ "tap",
7128
+ "doubleTap",
7129
+ "longPress",
7130
+ "focus"
7131
+ ]
7132
+ },
7133
+ "selectionStrategy": {
7134
+ "description": "Element selection strategy when multiple matches are found (default: first)",
7135
+ "type": "string",
7136
+ "enum": [
7137
+ "first",
7138
+ "random"
7139
+ ]
7140
+ },
7141
+ "duration": {
7142
+ "description": "Long press duration (ms)",
7143
+ "type": "number"
7144
+ },
7145
+ "searchUntil": {
7146
+ "description": "Poll for element before tapping",
7147
+ "type": "object",
7148
+ "properties": {
7149
+ "duration": {
7150
+ "description": "Polling duration (ms, default: 500)",
7151
+ "type": "number",
7152
+ "minimum": 100,
7153
+ "maximum": 12000
7154
+ }
7155
+ },
7156
+ "additionalProperties": false
7157
+ },
7158
+ "preTapStability": {
7159
+ "description": "When true, refresh the accessibility hierarchy before tapping and require consecutive re-finds with stable bounds before dispatching the gesture. Prevents tapping stale coordinates when the UI is still settling (loading overlays, list refreshes, keyboard). Recommended for search result lists and dynamic content.",
7160
+ "type": "boolean"
7161
+ },
7162
+ "retryIfNoChange": {
7163
+ "description": "When true, compare the view hierarchy before and after the tap. If unchanged (ghost tap detected), retry the tap once after a short delay. Recommended for taps that should cause obvious UI changes like navigation or screen transitions.",
7164
+ "type": "boolean"
7165
+ },
7166
+ "ensureTap": {
7167
+ "description": "Convenience flag that enables both preTapStability and retryIfNoChange. Use on taps in dynamic UI where you want both stable bounds before tapping and ghost-tap detection after.",
7168
+ "type": "boolean"
7169
+ },
7170
+ "platform": {
7171
+ "type": "string",
7172
+ "enum": [
7173
+ "android",
7174
+ "ios"
7175
+ ],
7176
+ "description": "Target platform"
7177
+ },
7178
+ "sessionUuid": {
7179
+ "description": "Session UUID",
7180
+ "type": "string"
7181
+ },
7182
+ "keepScreenAwake": {
7183
+ "description": "Keep device awake",
7184
+ "type": "boolean"
7185
+ },
7186
+ "device": {
7187
+ "description": "Device label for multi-device plans (e.g., \"A\", \"B\")",
7188
+ "type": "string"
7189
+ },
7190
+ "deviceId": {
7191
+ "description": "Device ID",
7192
+ "type": "string"
7193
+ }
7194
+ },
7195
+ "required": [
7196
+ "selector",
7197
+ "action",
7198
+ "platform"
7199
+ ],
6001
7200
  "additionalProperties": false
6002
7201
  },
6003
7202
  "outputSchema": {