adb-ready 0.2.0 → 0.3.0

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.
@@ -1,45 +1,142 @@
1
1
  {
2
2
  "title": "ADB Ready agent tool contract",
3
3
  "schemaVersion": 1,
4
- "packageVersion": "0.2.0",
4
+ "packageVersion": "0.3.0",
5
5
  "protocolVersion": "2025-11-25",
6
6
  "transport": "stdio",
7
7
  "tools": [
8
8
  {
9
- "name": "capture_screenshot",
10
- "description": "Capture a verified PNG inside the project without overwriting an existing file.",
9
+ "name": "assert_ui",
10
+ "description": "Assert that a semantic UI selector is visible or gone in the current hierarchy.",
11
11
  "inputSchema": {
12
12
  "type": "object",
13
13
  "$schema": "https://json-schema.org/draft/2020-12/schema",
14
14
  "properties": {
15
- "out": {
15
+ "targetHandle": {
16
16
  "type": "string",
17
- "minLength": 1
17
+ "format": "uuid",
18
+ "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
19
+ },
20
+ "selector": {
21
+ "anyOf": [
22
+ {
23
+ "type": "string",
24
+ "pattern": "^(?:class|desc|id|package|text)=.{1,256}$"
25
+ },
26
+ {
27
+ "type": "object",
28
+ "properties": {
29
+ "field": {
30
+ "type": "string",
31
+ "enum": ["class", "desc", "id", "package", "text"]
32
+ },
33
+ "value": {
34
+ "type": "string",
35
+ "minLength": 1,
36
+ "maxLength": 256
37
+ },
38
+ "match": {
39
+ "type": "string",
40
+ "enum": ["contains", "exact", "starts-with"]
41
+ },
42
+ "enabled": {
43
+ "type": "boolean"
44
+ },
45
+ "actionable": {
46
+ "type": "boolean"
47
+ }
48
+ },
49
+ "required": ["field", "value"]
50
+ }
51
+ ]
52
+ },
53
+ "state": {
54
+ "type": "string",
55
+ "enum": ["gone", "visible"]
18
56
  }
19
- }
57
+ },
58
+ "required": ["selector"]
20
59
  },
21
60
  "annotations": {
22
- "readOnlyHint": false,
61
+ "readOnlyHint": true,
23
62
  "destructiveHint": false,
24
- "idempotentHint": false,
63
+ "idempotentHint": true,
25
64
  "openWorldHint": false
65
+ },
66
+ "outputSchema": {
67
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
68
+ "type": "object",
69
+ "properties": {
70
+ "schemaVersion": {
71
+ "type": "number",
72
+ "const": 1
73
+ },
74
+ "command": {
75
+ "type": "string"
76
+ },
77
+ "commandId": {
78
+ "type": "string"
79
+ },
80
+ "ok": {
81
+ "type": "boolean"
82
+ },
83
+ "startedAt": {
84
+ "type": "string"
85
+ },
86
+ "finishedAt": {
87
+ "type": "string"
88
+ },
89
+ "durationMs": {
90
+ "type": "number",
91
+ "minimum": 0
92
+ },
93
+ "data": {
94
+ "anyOf": [
95
+ {},
96
+ {
97
+ "type": "null"
98
+ }
99
+ ]
100
+ },
101
+ "problems": {
102
+ "type": "array",
103
+ "items": {
104
+ "type": "object",
105
+ "properties": {
106
+ "code": {
107
+ "type": "string"
108
+ }
109
+ },
110
+ "required": ["code"],
111
+ "additionalProperties": {}
112
+ }
113
+ }
114
+ },
115
+ "required": [
116
+ "schemaVersion",
117
+ "command",
118
+ "commandId",
119
+ "ok",
120
+ "startedAt",
121
+ "finishedAt",
122
+ "durationMs",
123
+ "data",
124
+ "problems"
125
+ ],
126
+ "additionalProperties": {}
26
127
  }
27
128
  },
28
129
  {
29
- "name": "compile_debug_context",
30
- "description": "Compile bounded redacted context. Screenshots and UI text are excluded.",
130
+ "name": "audit_ui",
131
+ "description": "Audit the current screen for enabled actionable nodes without human-readable labels or stable automation IDs.",
31
132
  "inputSchema": {
32
133
  "type": "object",
33
134
  "$schema": "https://json-schema.org/draft/2020-12/schema",
34
135
  "properties": {
35
- "sessionId": {
136
+ "targetHandle": {
36
137
  "type": "string",
37
- "minLength": 1
38
- },
39
- "budget": {
40
- "type": "integer",
41
- "minimum": 1000,
42
- "maximum": 100000
138
+ "format": "uuid",
139
+ "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
43
140
  }
44
141
  }
45
142
  },
@@ -48,101 +145,385 @@
48
145
  "destructiveHint": false,
49
146
  "idempotentHint": true,
50
147
  "openWorldHint": false
51
- }
52
- },
53
- {
54
- "name": "doctor",
55
- "description": "Inspect the local runtime, ADB server, capabilities, and visible Android targets.",
56
- "inputSchema": {
57
- "type": "object",
58
- "$schema": "https://json-schema.org/draft/2020-12/schema",
59
- "properties": {}
60
148
  },
61
- "annotations": {
62
- "readOnlyHint": true,
63
- "destructiveHint": false,
64
- "idempotentHint": true,
65
- "openWorldHint": false
149
+ "outputSchema": {
150
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
151
+ "type": "object",
152
+ "properties": {
153
+ "schemaVersion": {
154
+ "type": "number",
155
+ "const": 1
156
+ },
157
+ "command": {
158
+ "type": "string"
159
+ },
160
+ "commandId": {
161
+ "type": "string"
162
+ },
163
+ "ok": {
164
+ "type": "boolean"
165
+ },
166
+ "startedAt": {
167
+ "type": "string"
168
+ },
169
+ "finishedAt": {
170
+ "type": "string"
171
+ },
172
+ "durationMs": {
173
+ "type": "number",
174
+ "minimum": 0
175
+ },
176
+ "data": {
177
+ "anyOf": [
178
+ {},
179
+ {
180
+ "type": "null"
181
+ }
182
+ ]
183
+ },
184
+ "problems": {
185
+ "type": "array",
186
+ "items": {
187
+ "type": "object",
188
+ "properties": {
189
+ "code": {
190
+ "type": "string"
191
+ }
192
+ },
193
+ "required": ["code"],
194
+ "additionalProperties": {}
195
+ }
196
+ }
197
+ },
198
+ "required": [
199
+ "schemaVersion",
200
+ "command",
201
+ "commandId",
202
+ "ok",
203
+ "startedAt",
204
+ "finishedAt",
205
+ "durationMs",
206
+ "data",
207
+ "problems"
208
+ ],
209
+ "additionalProperties": {}
66
210
  }
67
211
  },
68
212
  {
69
- "name": "ensure_ready",
70
- "description": "Select exactly one ready Android target and bind it for this MCP connection.",
213
+ "name": "capture_screenshot",
214
+ "description": "Capture a verified PNG inside the project and return its image pixels to the client without overwriting an existing file.",
71
215
  "inputSchema": {
72
216
  "type": "object",
73
217
  "$schema": "https://json-schema.org/draft/2020-12/schema",
74
218
  "properties": {
75
- "device": {
219
+ "targetHandle": {
76
220
  "type": "string",
77
- "minLength": 1
221
+ "format": "uuid",
222
+ "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
78
223
  },
79
- "transportId": {
224
+ "out": {
80
225
  "type": "string",
81
226
  "minLength": 1
82
227
  }
83
228
  }
84
229
  },
85
230
  "annotations": {
86
- "readOnlyHint": true,
231
+ "readOnlyHint": false,
87
232
  "destructiveHint": false,
88
- "idempotentHint": true,
233
+ "idempotentHint": false,
89
234
  "openWorldHint": false
235
+ },
236
+ "outputSchema": {
237
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
238
+ "type": "object",
239
+ "properties": {
240
+ "schemaVersion": {
241
+ "type": "number",
242
+ "const": 1
243
+ },
244
+ "command": {
245
+ "type": "string"
246
+ },
247
+ "commandId": {
248
+ "type": "string"
249
+ },
250
+ "ok": {
251
+ "type": "boolean"
252
+ },
253
+ "startedAt": {
254
+ "type": "string"
255
+ },
256
+ "finishedAt": {
257
+ "type": "string"
258
+ },
259
+ "durationMs": {
260
+ "type": "number",
261
+ "minimum": 0
262
+ },
263
+ "data": {
264
+ "anyOf": [
265
+ {},
266
+ {
267
+ "type": "null"
268
+ }
269
+ ]
270
+ },
271
+ "problems": {
272
+ "type": "array",
273
+ "items": {
274
+ "type": "object",
275
+ "properties": {
276
+ "code": {
277
+ "type": "string"
278
+ }
279
+ },
280
+ "required": ["code"],
281
+ "additionalProperties": {}
282
+ }
283
+ }
284
+ },
285
+ "required": [
286
+ "schemaVersion",
287
+ "command",
288
+ "commandId",
289
+ "ok",
290
+ "startedAt",
291
+ "finishedAt",
292
+ "durationMs",
293
+ "data",
294
+ "problems"
295
+ ],
296
+ "additionalProperties": {}
90
297
  }
91
298
  },
92
299
  {
93
- "name": "get_session_problems",
94
- "description": "Read structured problems from one saved local development session.",
300
+ "name": "clear_ui",
301
+ "description": "Focus one semantic editable field, clear its value, and verify the observable value.",
95
302
  "inputSchema": {
96
303
  "type": "object",
97
304
  "$schema": "https://json-schema.org/draft/2020-12/schema",
98
305
  "properties": {
99
- "sessionId": {
306
+ "targetHandle": {
100
307
  "type": "string",
101
- "minLength": 1
308
+ "format": "uuid",
309
+ "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
310
+ },
311
+ "selector": {
312
+ "anyOf": [
313
+ {
314
+ "type": "string",
315
+ "pattern": "^(?:class|desc|id|package|text)=.{1,256}$"
316
+ },
317
+ {
318
+ "type": "object",
319
+ "properties": {
320
+ "field": {
321
+ "type": "string",
322
+ "enum": ["class", "desc", "id", "package", "text"]
323
+ },
324
+ "value": {
325
+ "type": "string",
326
+ "minLength": 1,
327
+ "maxLength": 256
328
+ },
329
+ "match": {
330
+ "type": "string",
331
+ "enum": ["contains", "exact", "starts-with"]
332
+ },
333
+ "enabled": {
334
+ "type": "boolean"
335
+ },
336
+ "actionable": {
337
+ "type": "boolean"
338
+ }
339
+ },
340
+ "required": ["field", "value"]
341
+ }
342
+ ]
343
+ },
344
+ "occurrence": {
345
+ "type": "integer",
346
+ "minimum": 1,
347
+ "maximum": 10000
348
+ },
349
+ "dryRun": {
350
+ "type": "boolean"
102
351
  }
103
- }
352
+ },
353
+ "required": ["selector"]
104
354
  },
105
355
  "annotations": {
106
- "readOnlyHint": true,
356
+ "readOnlyHint": false,
107
357
  "destructiveHint": false,
108
- "idempotentHint": true,
358
+ "idempotentHint": false,
109
359
  "openWorldHint": false
360
+ },
361
+ "outputSchema": {
362
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
363
+ "type": "object",
364
+ "properties": {
365
+ "schemaVersion": {
366
+ "type": "number",
367
+ "const": 1
368
+ },
369
+ "command": {
370
+ "type": "string"
371
+ },
372
+ "commandId": {
373
+ "type": "string"
374
+ },
375
+ "ok": {
376
+ "type": "boolean"
377
+ },
378
+ "startedAt": {
379
+ "type": "string"
380
+ },
381
+ "finishedAt": {
382
+ "type": "string"
383
+ },
384
+ "durationMs": {
385
+ "type": "number",
386
+ "minimum": 0
387
+ },
388
+ "data": {
389
+ "anyOf": [
390
+ {},
391
+ {
392
+ "type": "null"
393
+ }
394
+ ]
395
+ },
396
+ "problems": {
397
+ "type": "array",
398
+ "items": {
399
+ "type": "object",
400
+ "properties": {
401
+ "code": {
402
+ "type": "string"
403
+ }
404
+ },
405
+ "required": ["code"],
406
+ "additionalProperties": {}
407
+ }
408
+ }
409
+ },
410
+ "required": [
411
+ "schemaVersion",
412
+ "command",
413
+ "commandId",
414
+ "ok",
415
+ "startedAt",
416
+ "finishedAt",
417
+ "durationMs",
418
+ "data",
419
+ "problems"
420
+ ],
421
+ "additionalProperties": {}
110
422
  }
111
423
  },
112
424
  {
113
- "name": "inspect_app",
114
- "description": "Return bounded sensitive app, foreground, and classified-log evidence without a screenshot.",
425
+ "name": "compare_ui",
426
+ "description": "Compare the current UI with a complete digest returned by an earlier inspection or action.",
115
427
  "inputSchema": {
116
428
  "type": "object",
117
429
  "$schema": "https://json-schema.org/draft/2020-12/schema",
118
430
  "properties": {
119
- "applicationId": {
431
+ "targetHandle": {
120
432
  "type": "string",
121
- "minLength": 3
433
+ "format": "uuid",
434
+ "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
435
+ },
436
+ "digest": {
437
+ "type": "string",
438
+ "pattern": "^[a-f0-9]{64}$"
122
439
  }
123
- }
440
+ },
441
+ "required": ["digest"]
124
442
  },
125
443
  "annotations": {
126
444
  "readOnlyHint": true,
127
445
  "destructiveHint": false,
128
446
  "idempotentHint": true,
129
447
  "openWorldHint": false
448
+ },
449
+ "outputSchema": {
450
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
451
+ "type": "object",
452
+ "properties": {
453
+ "schemaVersion": {
454
+ "type": "number",
455
+ "const": 1
456
+ },
457
+ "command": {
458
+ "type": "string"
459
+ },
460
+ "commandId": {
461
+ "type": "string"
462
+ },
463
+ "ok": {
464
+ "type": "boolean"
465
+ },
466
+ "startedAt": {
467
+ "type": "string"
468
+ },
469
+ "finishedAt": {
470
+ "type": "string"
471
+ },
472
+ "durationMs": {
473
+ "type": "number",
474
+ "minimum": 0
475
+ },
476
+ "data": {
477
+ "anyOf": [
478
+ {},
479
+ {
480
+ "type": "null"
481
+ }
482
+ ]
483
+ },
484
+ "problems": {
485
+ "type": "array",
486
+ "items": {
487
+ "type": "object",
488
+ "properties": {
489
+ "code": {
490
+ "type": "string"
491
+ }
492
+ },
493
+ "required": ["code"],
494
+ "additionalProperties": {}
495
+ }
496
+ }
497
+ },
498
+ "required": [
499
+ "schemaVersion",
500
+ "command",
501
+ "commandId",
502
+ "ok",
503
+ "startedAt",
504
+ "finishedAt",
505
+ "durationMs",
506
+ "data",
507
+ "problems"
508
+ ],
509
+ "additionalProperties": {}
130
510
  }
131
511
  },
132
512
  {
133
- "name": "inspect_ui",
134
- "description": "Return a bounded sensitive accessibility snapshot with digest-scoped references.",
513
+ "name": "compile_debug_context",
514
+ "description": "Compile bounded redacted context. Screenshots and UI text are excluded.",
135
515
  "inputSchema": {
136
516
  "type": "object",
137
517
  "$schema": "https://json-schema.org/draft/2020-12/schema",
138
518
  "properties": {
139
- "interactiveOnly": {
140
- "type": "boolean"
519
+ "sessionId": {
520
+ "type": "string",
521
+ "minLength": 1
141
522
  },
142
- "maxDepth": {
523
+ "budget": {
143
524
  "type": "integer",
144
- "minimum": 1,
145
- "maximum": 100
525
+ "minimum": 1000,
526
+ "maximum": 100000
146
527
  }
147
528
  }
148
529
  },
@@ -151,51 +532,159 @@
151
532
  "destructiveHint": false,
152
533
  "idempotentHint": true,
153
534
  "openWorldHint": false
154
- }
155
- },
156
- {
157
- "name": "install_app",
158
- "description": "Install one project-local APK and verify its package. Downloads and split APKs are rejected.",
159
- "inputSchema": {
160
- "type": "object",
535
+ },
536
+ "outputSchema": {
161
537
  "$schema": "https://json-schema.org/draft/2020-12/schema",
538
+ "type": "object",
162
539
  "properties": {
163
- "path": {
164
- "type": "string",
165
- "minLength": 1
540
+ "schemaVersion": {
541
+ "type": "number",
542
+ "const": 1
166
543
  },
167
- "applicationId": {
168
- "type": "string",
169
- "minLength": 3
544
+ "command": {
545
+ "type": "string"
170
546
  },
171
- "replace": {
172
- "type": "boolean"
547
+ "commandId": {
548
+ "type": "string"
173
549
  },
174
- "grantRuntimePermissions": {
550
+ "ok": {
175
551
  "type": "boolean"
552
+ },
553
+ "startedAt": {
554
+ "type": "string"
555
+ },
556
+ "finishedAt": {
557
+ "type": "string"
558
+ },
559
+ "durationMs": {
560
+ "type": "number",
561
+ "minimum": 0
562
+ },
563
+ "data": {
564
+ "anyOf": [
565
+ {},
566
+ {
567
+ "type": "null"
568
+ }
569
+ ]
570
+ },
571
+ "problems": {
572
+ "type": "array",
573
+ "items": {
574
+ "type": "object",
575
+ "properties": {
576
+ "code": {
577
+ "type": "string"
578
+ }
579
+ },
580
+ "required": ["code"],
581
+ "additionalProperties": {}
582
+ }
176
583
  }
177
584
  },
178
- "required": ["path"]
179
- },
180
- "annotations": {
181
- "readOnlyHint": false,
182
- "destructiveHint": false,
183
- "idempotentHint": false,
585
+ "required": [
586
+ "schemaVersion",
587
+ "command",
588
+ "commandId",
589
+ "ok",
590
+ "startedAt",
591
+ "finishedAt",
592
+ "durationMs",
593
+ "data",
594
+ "problems"
595
+ ],
596
+ "additionalProperties": {}
597
+ }
598
+ },
599
+ {
600
+ "name": "doctor",
601
+ "description": "Inspect the local runtime, ADB server, capabilities, and visible Android targets.",
602
+ "inputSchema": {
603
+ "type": "object",
604
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
605
+ "properties": {}
606
+ },
607
+ "annotations": {
608
+ "readOnlyHint": true,
609
+ "destructiveHint": false,
610
+ "idempotentHint": true,
184
611
  "openWorldHint": false
612
+ },
613
+ "outputSchema": {
614
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
615
+ "type": "object",
616
+ "properties": {
617
+ "schemaVersion": {
618
+ "type": "number",
619
+ "const": 1
620
+ },
621
+ "command": {
622
+ "type": "string"
623
+ },
624
+ "commandId": {
625
+ "type": "string"
626
+ },
627
+ "ok": {
628
+ "type": "boolean"
629
+ },
630
+ "startedAt": {
631
+ "type": "string"
632
+ },
633
+ "finishedAt": {
634
+ "type": "string"
635
+ },
636
+ "durationMs": {
637
+ "type": "number",
638
+ "minimum": 0
639
+ },
640
+ "data": {
641
+ "anyOf": [
642
+ {},
643
+ {
644
+ "type": "null"
645
+ }
646
+ ]
647
+ },
648
+ "problems": {
649
+ "type": "array",
650
+ "items": {
651
+ "type": "object",
652
+ "properties": {
653
+ "code": {
654
+ "type": "string"
655
+ }
656
+ },
657
+ "required": ["code"],
658
+ "additionalProperties": {}
659
+ }
660
+ }
661
+ },
662
+ "required": [
663
+ "schemaVersion",
664
+ "command",
665
+ "commandId",
666
+ "ok",
667
+ "startedAt",
668
+ "finishedAt",
669
+ "durationMs",
670
+ "data",
671
+ "problems"
672
+ ],
673
+ "additionalProperties": {}
185
674
  }
186
675
  },
187
676
  {
188
- "name": "launch_app",
189
- "description": "Launch the resolved app and verify it is foreground.",
677
+ "name": "ensure_ready",
678
+ "description": "Select exactly one ready Android target, safely reconnect one unambiguous paired wireless target when needed, and bind it for this MCP connection.",
190
679
  "inputSchema": {
191
680
  "type": "object",
192
681
  "$schema": "https://json-schema.org/draft/2020-12/schema",
193
682
  "properties": {
194
- "applicationId": {
683
+ "device": {
195
684
  "type": "string",
196
- "minLength": 3
685
+ "minLength": 1
197
686
  },
198
- "activity": {
687
+ "transportId": {
199
688
  "type": "string",
200
689
  "minLength": 1
201
690
  }
@@ -206,164 +695,1978 @@
206
695
  "destructiveHint": false,
207
696
  "idempotentHint": true,
208
697
  "openWorldHint": false
698
+ },
699
+ "outputSchema": {
700
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
701
+ "type": "object",
702
+ "properties": {
703
+ "schemaVersion": {
704
+ "type": "number",
705
+ "const": 1
706
+ },
707
+ "command": {
708
+ "type": "string"
709
+ },
710
+ "commandId": {
711
+ "type": "string"
712
+ },
713
+ "ok": {
714
+ "type": "boolean"
715
+ },
716
+ "startedAt": {
717
+ "type": "string"
718
+ },
719
+ "finishedAt": {
720
+ "type": "string"
721
+ },
722
+ "durationMs": {
723
+ "type": "number",
724
+ "minimum": 0
725
+ },
726
+ "data": {
727
+ "anyOf": [
728
+ {},
729
+ {
730
+ "type": "null"
731
+ }
732
+ ]
733
+ },
734
+ "problems": {
735
+ "type": "array",
736
+ "items": {
737
+ "type": "object",
738
+ "properties": {
739
+ "code": {
740
+ "type": "string"
741
+ }
742
+ },
743
+ "required": ["code"],
744
+ "additionalProperties": {}
745
+ }
746
+ }
747
+ },
748
+ "required": [
749
+ "schemaVersion",
750
+ "command",
751
+ "commandId",
752
+ "ok",
753
+ "startedAt",
754
+ "finishedAt",
755
+ "durationMs",
756
+ "data",
757
+ "problems"
758
+ ],
759
+ "additionalProperties": {}
209
760
  }
210
761
  },
211
762
  {
212
- "name": "list_targets",
213
- "description": "List Android targets without changing the connection's bound target.",
763
+ "name": "fill_ui",
764
+ "description": "Focus one semantic editable field, replace its value with conservative shell-safe text, and verify the observable value.",
214
765
  "inputSchema": {
215
766
  "type": "object",
216
767
  "$schema": "https://json-schema.org/draft/2020-12/schema",
217
- "properties": {}
768
+ "properties": {
769
+ "targetHandle": {
770
+ "type": "string",
771
+ "format": "uuid",
772
+ "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
773
+ },
774
+ "selector": {
775
+ "anyOf": [
776
+ {
777
+ "type": "string",
778
+ "pattern": "^(?:class|desc|id|package|text)=.{1,256}$"
779
+ },
780
+ {
781
+ "type": "object",
782
+ "properties": {
783
+ "field": {
784
+ "type": "string",
785
+ "enum": ["class", "desc", "id", "package", "text"]
786
+ },
787
+ "value": {
788
+ "type": "string",
789
+ "minLength": 1,
790
+ "maxLength": 256
791
+ },
792
+ "match": {
793
+ "type": "string",
794
+ "enum": ["contains", "exact", "starts-with"]
795
+ },
796
+ "enabled": {
797
+ "type": "boolean"
798
+ },
799
+ "actionable": {
800
+ "type": "boolean"
801
+ }
802
+ },
803
+ "required": ["field", "value"]
804
+ }
805
+ ]
806
+ },
807
+ "occurrence": {
808
+ "type": "integer",
809
+ "minimum": 1,
810
+ "maximum": 10000
811
+ },
812
+ "text": {
813
+ "type": "string",
814
+ "minLength": 1,
815
+ "maxLength": 256
816
+ },
817
+ "submit": {
818
+ "type": "boolean"
819
+ },
820
+ "dryRun": {
821
+ "type": "boolean"
822
+ }
823
+ },
824
+ "required": ["selector", "text"]
825
+ },
826
+ "annotations": {
827
+ "readOnlyHint": false,
828
+ "destructiveHint": false,
829
+ "idempotentHint": false,
830
+ "openWorldHint": false
831
+ },
832
+ "outputSchema": {
833
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
834
+ "type": "object",
835
+ "properties": {
836
+ "schemaVersion": {
837
+ "type": "number",
838
+ "const": 1
839
+ },
840
+ "command": {
841
+ "type": "string"
842
+ },
843
+ "commandId": {
844
+ "type": "string"
845
+ },
846
+ "ok": {
847
+ "type": "boolean"
848
+ },
849
+ "startedAt": {
850
+ "type": "string"
851
+ },
852
+ "finishedAt": {
853
+ "type": "string"
854
+ },
855
+ "durationMs": {
856
+ "type": "number",
857
+ "minimum": 0
858
+ },
859
+ "data": {
860
+ "anyOf": [
861
+ {},
862
+ {
863
+ "type": "null"
864
+ }
865
+ ]
866
+ },
867
+ "problems": {
868
+ "type": "array",
869
+ "items": {
870
+ "type": "object",
871
+ "properties": {
872
+ "code": {
873
+ "type": "string"
874
+ }
875
+ },
876
+ "required": ["code"],
877
+ "additionalProperties": {}
878
+ }
879
+ }
880
+ },
881
+ "required": [
882
+ "schemaVersion",
883
+ "command",
884
+ "commandId",
885
+ "ok",
886
+ "startedAt",
887
+ "finishedAt",
888
+ "durationMs",
889
+ "data",
890
+ "problems"
891
+ ],
892
+ "additionalProperties": {}
893
+ }
894
+ },
895
+ {
896
+ "name": "find_ui",
897
+ "description": "Find bounded UI nodes by semantic id, text, description, class, or package selectors without changing device state.",
898
+ "inputSchema": {
899
+ "type": "object",
900
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
901
+ "properties": {
902
+ "targetHandle": {
903
+ "type": "string",
904
+ "format": "uuid",
905
+ "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
906
+ },
907
+ "selector": {
908
+ "anyOf": [
909
+ {
910
+ "type": "string",
911
+ "pattern": "^(?:class|desc|id|package|text)=.{1,256}$"
912
+ },
913
+ {
914
+ "type": "object",
915
+ "properties": {
916
+ "field": {
917
+ "type": "string",
918
+ "enum": ["class", "desc", "id", "package", "text"]
919
+ },
920
+ "value": {
921
+ "type": "string",
922
+ "minLength": 1,
923
+ "maxLength": 256
924
+ },
925
+ "match": {
926
+ "type": "string",
927
+ "enum": ["contains", "exact", "starts-with"]
928
+ },
929
+ "enabled": {
930
+ "type": "boolean"
931
+ },
932
+ "actionable": {
933
+ "type": "boolean"
934
+ }
935
+ },
936
+ "required": ["field", "value"]
937
+ }
938
+ ]
939
+ },
940
+ "limit": {
941
+ "type": "integer",
942
+ "minimum": 1,
943
+ "maximum": 100
944
+ }
945
+ },
946
+ "required": ["selector"]
218
947
  },
219
948
  "annotations": {
220
949
  "readOnlyHint": true,
221
950
  "destructiveHint": false,
222
951
  "idempotentHint": true,
223
952
  "openWorldHint": false
953
+ },
954
+ "outputSchema": {
955
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
956
+ "type": "object",
957
+ "properties": {
958
+ "schemaVersion": {
959
+ "type": "number",
960
+ "const": 1
961
+ },
962
+ "command": {
963
+ "type": "string"
964
+ },
965
+ "commandId": {
966
+ "type": "string"
967
+ },
968
+ "ok": {
969
+ "type": "boolean"
970
+ },
971
+ "startedAt": {
972
+ "type": "string"
973
+ },
974
+ "finishedAt": {
975
+ "type": "string"
976
+ },
977
+ "durationMs": {
978
+ "type": "number",
979
+ "minimum": 0
980
+ },
981
+ "data": {
982
+ "anyOf": [
983
+ {},
984
+ {
985
+ "type": "null"
986
+ }
987
+ ]
988
+ },
989
+ "problems": {
990
+ "type": "array",
991
+ "items": {
992
+ "type": "object",
993
+ "properties": {
994
+ "code": {
995
+ "type": "string"
996
+ }
997
+ },
998
+ "required": ["code"],
999
+ "additionalProperties": {}
1000
+ }
1001
+ }
1002
+ },
1003
+ "required": [
1004
+ "schemaVersion",
1005
+ "command",
1006
+ "commandId",
1007
+ "ok",
1008
+ "startedAt",
1009
+ "finishedAt",
1010
+ "durationMs",
1011
+ "data",
1012
+ "problems"
1013
+ ],
1014
+ "additionalProperties": {}
224
1015
  }
225
1016
  },
226
1017
  {
227
- "name": "long_press_ui",
228
- "description": "Long-press a current digest-scoped UI ref or explicit display coordinate, then compare UI state.",
1018
+ "name": "get_dev_session",
1019
+ "description": "Read the durable status of a project-scoped development-session handle after reconnects.",
1020
+ "inputSchema": {
1021
+ "type": "object",
1022
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1023
+ "properties": {
1024
+ "taskHandle": {
1025
+ "type": "string",
1026
+ "format": "uuid",
1027
+ "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
1028
+ }
1029
+ },
1030
+ "required": ["taskHandle"]
1031
+ },
1032
+ "annotations": {
1033
+ "readOnlyHint": true,
1034
+ "destructiveHint": false,
1035
+ "idempotentHint": true,
1036
+ "openWorldHint": false
1037
+ },
1038
+ "outputSchema": {
1039
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1040
+ "type": "object",
1041
+ "properties": {
1042
+ "schemaVersion": {
1043
+ "type": "number",
1044
+ "const": 1
1045
+ },
1046
+ "command": {
1047
+ "type": "string"
1048
+ },
1049
+ "commandId": {
1050
+ "type": "string"
1051
+ },
1052
+ "ok": {
1053
+ "type": "boolean"
1054
+ },
1055
+ "startedAt": {
1056
+ "type": "string"
1057
+ },
1058
+ "finishedAt": {
1059
+ "type": "string"
1060
+ },
1061
+ "durationMs": {
1062
+ "type": "number",
1063
+ "minimum": 0
1064
+ },
1065
+ "data": {
1066
+ "anyOf": [
1067
+ {},
1068
+ {
1069
+ "type": "null"
1070
+ }
1071
+ ]
1072
+ },
1073
+ "problems": {
1074
+ "type": "array",
1075
+ "items": {
1076
+ "type": "object",
1077
+ "properties": {
1078
+ "code": {
1079
+ "type": "string"
1080
+ }
1081
+ },
1082
+ "required": ["code"],
1083
+ "additionalProperties": {}
1084
+ }
1085
+ }
1086
+ },
1087
+ "required": [
1088
+ "schemaVersion",
1089
+ "command",
1090
+ "commandId",
1091
+ "ok",
1092
+ "startedAt",
1093
+ "finishedAt",
1094
+ "durationMs",
1095
+ "data",
1096
+ "problems"
1097
+ ],
1098
+ "additionalProperties": {}
1099
+ }
1100
+ },
1101
+ {
1102
+ "name": "get_session_problems",
1103
+ "description": "Read structured problems from one saved local development session.",
1104
+ "inputSchema": {
1105
+ "type": "object",
1106
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1107
+ "properties": {
1108
+ "sessionId": {
1109
+ "type": "string",
1110
+ "minLength": 1
1111
+ }
1112
+ }
1113
+ },
1114
+ "annotations": {
1115
+ "readOnlyHint": true,
1116
+ "destructiveHint": false,
1117
+ "idempotentHint": true,
1118
+ "openWorldHint": false
1119
+ },
1120
+ "outputSchema": {
1121
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1122
+ "type": "object",
1123
+ "properties": {
1124
+ "schemaVersion": {
1125
+ "type": "number",
1126
+ "const": 1
1127
+ },
1128
+ "command": {
1129
+ "type": "string"
1130
+ },
1131
+ "commandId": {
1132
+ "type": "string"
1133
+ },
1134
+ "ok": {
1135
+ "type": "boolean"
1136
+ },
1137
+ "startedAt": {
1138
+ "type": "string"
1139
+ },
1140
+ "finishedAt": {
1141
+ "type": "string"
1142
+ },
1143
+ "durationMs": {
1144
+ "type": "number",
1145
+ "minimum": 0
1146
+ },
1147
+ "data": {
1148
+ "anyOf": [
1149
+ {},
1150
+ {
1151
+ "type": "null"
1152
+ }
1153
+ ]
1154
+ },
1155
+ "problems": {
1156
+ "type": "array",
1157
+ "items": {
1158
+ "type": "object",
1159
+ "properties": {
1160
+ "code": {
1161
+ "type": "string"
1162
+ }
1163
+ },
1164
+ "required": ["code"],
1165
+ "additionalProperties": {}
1166
+ }
1167
+ }
1168
+ },
1169
+ "required": [
1170
+ "schemaVersion",
1171
+ "command",
1172
+ "commandId",
1173
+ "ok",
1174
+ "startedAt",
1175
+ "finishedAt",
1176
+ "durationMs",
1177
+ "data",
1178
+ "problems"
1179
+ ],
1180
+ "additionalProperties": {}
1181
+ }
1182
+ },
1183
+ {
1184
+ "name": "get_ui",
1185
+ "description": "Read one unambiguous UI node with its current semantic, state, and bounds properties.",
1186
+ "inputSchema": {
1187
+ "type": "object",
1188
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1189
+ "properties": {
1190
+ "targetHandle": {
1191
+ "type": "string",
1192
+ "format": "uuid",
1193
+ "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
1194
+ },
1195
+ "selector": {
1196
+ "anyOf": [
1197
+ {
1198
+ "type": "string",
1199
+ "pattern": "^(?:class|desc|id|package|text)=.{1,256}$"
1200
+ },
1201
+ {
1202
+ "type": "object",
1203
+ "properties": {
1204
+ "field": {
1205
+ "type": "string",
1206
+ "enum": ["class", "desc", "id", "package", "text"]
1207
+ },
1208
+ "value": {
1209
+ "type": "string",
1210
+ "minLength": 1,
1211
+ "maxLength": 256
1212
+ },
1213
+ "match": {
1214
+ "type": "string",
1215
+ "enum": ["contains", "exact", "starts-with"]
1216
+ },
1217
+ "enabled": {
1218
+ "type": "boolean"
1219
+ },
1220
+ "actionable": {
1221
+ "type": "boolean"
1222
+ }
1223
+ },
1224
+ "required": ["field", "value"]
1225
+ }
1226
+ ]
1227
+ },
1228
+ "occurrence": {
1229
+ "type": "integer",
1230
+ "minimum": 1,
1231
+ "maximum": 10000
1232
+ }
1233
+ },
1234
+ "required": ["selector"]
1235
+ },
1236
+ "annotations": {
1237
+ "readOnlyHint": true,
1238
+ "destructiveHint": false,
1239
+ "idempotentHint": true,
1240
+ "openWorldHint": false
1241
+ },
1242
+ "outputSchema": {
1243
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1244
+ "type": "object",
1245
+ "properties": {
1246
+ "schemaVersion": {
1247
+ "type": "number",
1248
+ "const": 1
1249
+ },
1250
+ "command": {
1251
+ "type": "string"
1252
+ },
1253
+ "commandId": {
1254
+ "type": "string"
1255
+ },
1256
+ "ok": {
1257
+ "type": "boolean"
1258
+ },
1259
+ "startedAt": {
1260
+ "type": "string"
1261
+ },
1262
+ "finishedAt": {
1263
+ "type": "string"
1264
+ },
1265
+ "durationMs": {
1266
+ "type": "number",
1267
+ "minimum": 0
1268
+ },
1269
+ "data": {
1270
+ "anyOf": [
1271
+ {},
1272
+ {
1273
+ "type": "null"
1274
+ }
1275
+ ]
1276
+ },
1277
+ "problems": {
1278
+ "type": "array",
1279
+ "items": {
1280
+ "type": "object",
1281
+ "properties": {
1282
+ "code": {
1283
+ "type": "string"
1284
+ }
1285
+ },
1286
+ "required": ["code"],
1287
+ "additionalProperties": {}
1288
+ }
1289
+ }
1290
+ },
1291
+ "required": [
1292
+ "schemaVersion",
1293
+ "command",
1294
+ "commandId",
1295
+ "ok",
1296
+ "startedAt",
1297
+ "finishedAt",
1298
+ "durationMs",
1299
+ "data",
1300
+ "problems"
1301
+ ],
1302
+ "additionalProperties": {}
1303
+ }
1304
+ },
1305
+ {
1306
+ "name": "inspect_app",
1307
+ "description": "Return bounded sensitive app, foreground, and classified-log evidence without a screenshot.",
1308
+ "inputSchema": {
1309
+ "type": "object",
1310
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1311
+ "properties": {
1312
+ "targetHandle": {
1313
+ "type": "string",
1314
+ "format": "uuid",
1315
+ "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
1316
+ },
1317
+ "applicationId": {
1318
+ "type": "string",
1319
+ "minLength": 3
1320
+ }
1321
+ }
1322
+ },
1323
+ "annotations": {
1324
+ "readOnlyHint": true,
1325
+ "destructiveHint": false,
1326
+ "idempotentHint": true,
1327
+ "openWorldHint": false
1328
+ },
1329
+ "outputSchema": {
1330
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1331
+ "type": "object",
1332
+ "properties": {
1333
+ "schemaVersion": {
1334
+ "type": "number",
1335
+ "const": 1
1336
+ },
1337
+ "command": {
1338
+ "type": "string"
1339
+ },
1340
+ "commandId": {
1341
+ "type": "string"
1342
+ },
1343
+ "ok": {
1344
+ "type": "boolean"
1345
+ },
1346
+ "startedAt": {
1347
+ "type": "string"
1348
+ },
1349
+ "finishedAt": {
1350
+ "type": "string"
1351
+ },
1352
+ "durationMs": {
1353
+ "type": "number",
1354
+ "minimum": 0
1355
+ },
1356
+ "data": {
1357
+ "anyOf": [
1358
+ {},
1359
+ {
1360
+ "type": "null"
1361
+ }
1362
+ ]
1363
+ },
1364
+ "problems": {
1365
+ "type": "array",
1366
+ "items": {
1367
+ "type": "object",
1368
+ "properties": {
1369
+ "code": {
1370
+ "type": "string"
1371
+ }
1372
+ },
1373
+ "required": ["code"],
1374
+ "additionalProperties": {}
1375
+ }
1376
+ }
1377
+ },
1378
+ "required": [
1379
+ "schemaVersion",
1380
+ "command",
1381
+ "commandId",
1382
+ "ok",
1383
+ "startedAt",
1384
+ "finishedAt",
1385
+ "durationMs",
1386
+ "data",
1387
+ "problems"
1388
+ ],
1389
+ "additionalProperties": {}
1390
+ }
1391
+ },
1392
+ {
1393
+ "name": "inspect_ui",
1394
+ "description": "Return a bounded sensitive accessibility snapshot with digest-scoped references.",
1395
+ "inputSchema": {
1396
+ "type": "object",
1397
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1398
+ "properties": {
1399
+ "targetHandle": {
1400
+ "type": "string",
1401
+ "format": "uuid",
1402
+ "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
1403
+ },
1404
+ "interactiveOnly": {
1405
+ "type": "boolean"
1406
+ },
1407
+ "maxDepth": {
1408
+ "type": "integer",
1409
+ "minimum": 1,
1410
+ "maximum": 100
1411
+ }
1412
+ }
1413
+ },
1414
+ "annotations": {
1415
+ "readOnlyHint": true,
1416
+ "destructiveHint": false,
1417
+ "idempotentHint": true,
1418
+ "openWorldHint": false
1419
+ },
1420
+ "outputSchema": {
1421
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1422
+ "type": "object",
1423
+ "properties": {
1424
+ "schemaVersion": {
1425
+ "type": "number",
1426
+ "const": 1
1427
+ },
1428
+ "command": {
1429
+ "type": "string"
1430
+ },
1431
+ "commandId": {
1432
+ "type": "string"
1433
+ },
1434
+ "ok": {
1435
+ "type": "boolean"
1436
+ },
1437
+ "startedAt": {
1438
+ "type": "string"
1439
+ },
1440
+ "finishedAt": {
1441
+ "type": "string"
1442
+ },
1443
+ "durationMs": {
1444
+ "type": "number",
1445
+ "minimum": 0
1446
+ },
1447
+ "data": {
1448
+ "anyOf": [
1449
+ {},
1450
+ {
1451
+ "type": "null"
1452
+ }
1453
+ ]
1454
+ },
1455
+ "problems": {
1456
+ "type": "array",
1457
+ "items": {
1458
+ "type": "object",
1459
+ "properties": {
1460
+ "code": {
1461
+ "type": "string"
1462
+ }
1463
+ },
1464
+ "required": ["code"],
1465
+ "additionalProperties": {}
1466
+ }
1467
+ }
1468
+ },
1469
+ "required": [
1470
+ "schemaVersion",
1471
+ "command",
1472
+ "commandId",
1473
+ "ok",
1474
+ "startedAt",
1475
+ "finishedAt",
1476
+ "durationMs",
1477
+ "data",
1478
+ "problems"
1479
+ ],
1480
+ "additionalProperties": {}
1481
+ }
1482
+ },
1483
+ {
1484
+ "name": "install_app",
1485
+ "description": "Install one project-local APK or a complete split APK set and verify its package.",
1486
+ "inputSchema": {
1487
+ "type": "object",
1488
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1489
+ "properties": {
1490
+ "targetHandle": {
1491
+ "type": "string",
1492
+ "format": "uuid",
1493
+ "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
1494
+ },
1495
+ "path": {
1496
+ "type": "string",
1497
+ "minLength": 1
1498
+ },
1499
+ "paths": {
1500
+ "minItems": 1,
1501
+ "maxItems": 64,
1502
+ "type": "array",
1503
+ "items": {
1504
+ "type": "string",
1505
+ "minLength": 1
1506
+ }
1507
+ },
1508
+ "applicationId": {
1509
+ "type": "string",
1510
+ "minLength": 3
1511
+ },
1512
+ "replace": {
1513
+ "type": "boolean"
1514
+ },
1515
+ "grantRuntimePermissions": {
1516
+ "type": "boolean"
1517
+ }
1518
+ }
1519
+ },
1520
+ "annotations": {
1521
+ "readOnlyHint": false,
1522
+ "destructiveHint": false,
1523
+ "idempotentHint": false,
1524
+ "openWorldHint": false
1525
+ },
1526
+ "outputSchema": {
1527
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1528
+ "type": "object",
1529
+ "properties": {
1530
+ "schemaVersion": {
1531
+ "type": "number",
1532
+ "const": 1
1533
+ },
1534
+ "command": {
1535
+ "type": "string"
1536
+ },
1537
+ "commandId": {
1538
+ "type": "string"
1539
+ },
1540
+ "ok": {
1541
+ "type": "boolean"
1542
+ },
1543
+ "startedAt": {
1544
+ "type": "string"
1545
+ },
1546
+ "finishedAt": {
1547
+ "type": "string"
1548
+ },
1549
+ "durationMs": {
1550
+ "type": "number",
1551
+ "minimum": 0
1552
+ },
1553
+ "data": {
1554
+ "anyOf": [
1555
+ {},
1556
+ {
1557
+ "type": "null"
1558
+ }
1559
+ ]
1560
+ },
1561
+ "problems": {
1562
+ "type": "array",
1563
+ "items": {
1564
+ "type": "object",
1565
+ "properties": {
1566
+ "code": {
1567
+ "type": "string"
1568
+ }
1569
+ },
1570
+ "required": ["code"],
1571
+ "additionalProperties": {}
1572
+ }
1573
+ }
1574
+ },
1575
+ "required": [
1576
+ "schemaVersion",
1577
+ "command",
1578
+ "commandId",
1579
+ "ok",
1580
+ "startedAt",
1581
+ "finishedAt",
1582
+ "durationMs",
1583
+ "data",
1584
+ "problems"
1585
+ ],
1586
+ "additionalProperties": {}
1587
+ }
1588
+ },
1589
+ {
1590
+ "name": "launch_app",
1591
+ "description": "Launch the resolved app and verify it is foreground.",
1592
+ "inputSchema": {
1593
+ "type": "object",
1594
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1595
+ "properties": {
1596
+ "targetHandle": {
1597
+ "type": "string",
1598
+ "format": "uuid",
1599
+ "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
1600
+ },
1601
+ "applicationId": {
1602
+ "type": "string",
1603
+ "minLength": 3
1604
+ },
1605
+ "activity": {
1606
+ "type": "string",
1607
+ "minLength": 1
1608
+ }
1609
+ }
1610
+ },
1611
+ "annotations": {
1612
+ "readOnlyHint": false,
1613
+ "destructiveHint": false,
1614
+ "idempotentHint": true,
1615
+ "openWorldHint": false
1616
+ },
1617
+ "outputSchema": {
1618
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1619
+ "type": "object",
1620
+ "properties": {
1621
+ "schemaVersion": {
1622
+ "type": "number",
1623
+ "const": 1
1624
+ },
1625
+ "command": {
1626
+ "type": "string"
1627
+ },
1628
+ "commandId": {
1629
+ "type": "string"
1630
+ },
1631
+ "ok": {
1632
+ "type": "boolean"
1633
+ },
1634
+ "startedAt": {
1635
+ "type": "string"
1636
+ },
1637
+ "finishedAt": {
1638
+ "type": "string"
1639
+ },
1640
+ "durationMs": {
1641
+ "type": "number",
1642
+ "minimum": 0
1643
+ },
1644
+ "data": {
1645
+ "anyOf": [
1646
+ {},
1647
+ {
1648
+ "type": "null"
1649
+ }
1650
+ ]
1651
+ },
1652
+ "problems": {
1653
+ "type": "array",
1654
+ "items": {
1655
+ "type": "object",
1656
+ "properties": {
1657
+ "code": {
1658
+ "type": "string"
1659
+ }
1660
+ },
1661
+ "required": ["code"],
1662
+ "additionalProperties": {}
1663
+ }
1664
+ }
1665
+ },
1666
+ "required": [
1667
+ "schemaVersion",
1668
+ "command",
1669
+ "commandId",
1670
+ "ok",
1671
+ "startedAt",
1672
+ "finishedAt",
1673
+ "durationMs",
1674
+ "data",
1675
+ "problems"
1676
+ ],
1677
+ "additionalProperties": {}
1678
+ }
1679
+ },
1680
+ {
1681
+ "name": "list_sessions",
1682
+ "description": "List project-scoped saved sessions with status, preset, recency, and stable cursor pagination filters.",
1683
+ "inputSchema": {
1684
+ "type": "object",
1685
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1686
+ "properties": {
1687
+ "status": {
1688
+ "type": "string",
1689
+ "enum": ["completed", "failed", "interrupted", "running"]
1690
+ },
1691
+ "preset": {
1692
+ "type": "string",
1693
+ "minLength": 1,
1694
+ "maxLength": 64
1695
+ },
1696
+ "sinceMs": {
1697
+ "type": "integer",
1698
+ "minimum": 1,
1699
+ "maximum": 31536000000
1700
+ },
1701
+ "limit": {
1702
+ "type": "integer",
1703
+ "minimum": 1,
1704
+ "maximum": 100
1705
+ },
1706
+ "cursor": {
1707
+ "type": "string",
1708
+ "minLength": 1,
1709
+ "maxLength": 128
1710
+ }
1711
+ }
1712
+ },
1713
+ "annotations": {
1714
+ "readOnlyHint": true,
1715
+ "destructiveHint": false,
1716
+ "idempotentHint": true,
1717
+ "openWorldHint": false
1718
+ },
1719
+ "outputSchema": {
1720
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1721
+ "type": "object",
1722
+ "properties": {
1723
+ "schemaVersion": {
1724
+ "type": "number",
1725
+ "const": 1
1726
+ },
1727
+ "command": {
1728
+ "type": "string"
1729
+ },
1730
+ "commandId": {
1731
+ "type": "string"
1732
+ },
1733
+ "ok": {
1734
+ "type": "boolean"
1735
+ },
1736
+ "startedAt": {
1737
+ "type": "string"
1738
+ },
1739
+ "finishedAt": {
1740
+ "type": "string"
1741
+ },
1742
+ "durationMs": {
1743
+ "type": "number",
1744
+ "minimum": 0
1745
+ },
1746
+ "data": {
1747
+ "anyOf": [
1748
+ {},
1749
+ {
1750
+ "type": "null"
1751
+ }
1752
+ ]
1753
+ },
1754
+ "problems": {
1755
+ "type": "array",
1756
+ "items": {
1757
+ "type": "object",
1758
+ "properties": {
1759
+ "code": {
1760
+ "type": "string"
1761
+ }
1762
+ },
1763
+ "required": ["code"],
1764
+ "additionalProperties": {}
1765
+ }
1766
+ }
1767
+ },
1768
+ "required": [
1769
+ "schemaVersion",
1770
+ "command",
1771
+ "commandId",
1772
+ "ok",
1773
+ "startedAt",
1774
+ "finishedAt",
1775
+ "durationMs",
1776
+ "data",
1777
+ "problems"
1778
+ ],
1779
+ "additionalProperties": {}
1780
+ }
1781
+ },
1782
+ {
1783
+ "name": "list_targets",
1784
+ "description": "List Android targets without changing the connection's bound target.",
1785
+ "inputSchema": {
1786
+ "type": "object",
1787
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1788
+ "properties": {}
1789
+ },
1790
+ "annotations": {
1791
+ "readOnlyHint": true,
1792
+ "destructiveHint": false,
1793
+ "idempotentHint": true,
1794
+ "openWorldHint": false
1795
+ },
1796
+ "outputSchema": {
1797
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1798
+ "type": "object",
1799
+ "properties": {
1800
+ "schemaVersion": {
1801
+ "type": "number",
1802
+ "const": 1
1803
+ },
1804
+ "command": {
1805
+ "type": "string"
1806
+ },
1807
+ "commandId": {
1808
+ "type": "string"
1809
+ },
1810
+ "ok": {
1811
+ "type": "boolean"
1812
+ },
1813
+ "startedAt": {
1814
+ "type": "string"
1815
+ },
1816
+ "finishedAt": {
1817
+ "type": "string"
1818
+ },
1819
+ "durationMs": {
1820
+ "type": "number",
1821
+ "minimum": 0
1822
+ },
1823
+ "data": {
1824
+ "anyOf": [
1825
+ {},
1826
+ {
1827
+ "type": "null"
1828
+ }
1829
+ ]
1830
+ },
1831
+ "problems": {
1832
+ "type": "array",
1833
+ "items": {
1834
+ "type": "object",
1835
+ "properties": {
1836
+ "code": {
1837
+ "type": "string"
1838
+ }
1839
+ },
1840
+ "required": ["code"],
1841
+ "additionalProperties": {}
1842
+ }
1843
+ }
1844
+ },
1845
+ "required": [
1846
+ "schemaVersion",
1847
+ "command",
1848
+ "commandId",
1849
+ "ok",
1850
+ "startedAt",
1851
+ "finishedAt",
1852
+ "durationMs",
1853
+ "data",
1854
+ "problems"
1855
+ ],
1856
+ "additionalProperties": {}
1857
+ }
1858
+ },
1859
+ {
1860
+ "name": "long_press_ui",
1861
+ "description": "Long-press a unique semantic selector, current digest-scoped UI ref, or explicit display coordinate, then compare UI state.",
1862
+ "inputSchema": {
1863
+ "type": "object",
1864
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1865
+ "properties": {
1866
+ "targetHandle": {
1867
+ "type": "string",
1868
+ "format": "uuid",
1869
+ "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
1870
+ },
1871
+ "target": {
1872
+ "anyOf": [
1873
+ {
1874
+ "type": "object",
1875
+ "properties": {
1876
+ "ref": {
1877
+ "type": "string",
1878
+ "pattern": "^ui:[a-f0-9]{12}:\\d+$"
1879
+ }
1880
+ },
1881
+ "required": ["ref"]
1882
+ },
1883
+ {
1884
+ "type": "object",
1885
+ "properties": {
1886
+ "selector": {
1887
+ "anyOf": [
1888
+ {
1889
+ "type": "string",
1890
+ "pattern": "^(?:class|desc|id|package|text)=.{1,256}$"
1891
+ },
1892
+ {
1893
+ "type": "object",
1894
+ "properties": {
1895
+ "field": {
1896
+ "type": "string",
1897
+ "enum": ["class", "desc", "id", "package", "text"]
1898
+ },
1899
+ "value": {
1900
+ "type": "string",
1901
+ "minLength": 1,
1902
+ "maxLength": 256
1903
+ },
1904
+ "match": {
1905
+ "type": "string",
1906
+ "enum": ["contains", "exact", "starts-with"]
1907
+ },
1908
+ "enabled": {
1909
+ "type": "boolean"
1910
+ },
1911
+ "actionable": {
1912
+ "type": "boolean"
1913
+ }
1914
+ },
1915
+ "required": ["field", "value"]
1916
+ }
1917
+ ]
1918
+ },
1919
+ "occurrence": {
1920
+ "type": "integer",
1921
+ "minimum": 1,
1922
+ "maximum": 10000
1923
+ }
1924
+ },
1925
+ "required": ["selector"]
1926
+ },
1927
+ {
1928
+ "type": "object",
1929
+ "properties": {
1930
+ "x": {
1931
+ "type": "integer",
1932
+ "minimum": 0,
1933
+ "maximum": 100000
1934
+ },
1935
+ "y": {
1936
+ "type": "integer",
1937
+ "minimum": 0,
1938
+ "maximum": 100000
1939
+ }
1940
+ },
1941
+ "required": ["x", "y"]
1942
+ }
1943
+ ]
1944
+ },
1945
+ "dryRun": {
1946
+ "type": "boolean"
1947
+ }
1948
+ },
1949
+ "required": ["target"]
1950
+ },
1951
+ "annotations": {
1952
+ "readOnlyHint": false,
1953
+ "destructiveHint": false,
1954
+ "idempotentHint": false,
1955
+ "openWorldHint": false
1956
+ },
1957
+ "outputSchema": {
1958
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1959
+ "type": "object",
1960
+ "properties": {
1961
+ "schemaVersion": {
1962
+ "type": "number",
1963
+ "const": 1
1964
+ },
1965
+ "command": {
1966
+ "type": "string"
1967
+ },
1968
+ "commandId": {
1969
+ "type": "string"
1970
+ },
1971
+ "ok": {
1972
+ "type": "boolean"
1973
+ },
1974
+ "startedAt": {
1975
+ "type": "string"
1976
+ },
1977
+ "finishedAt": {
1978
+ "type": "string"
1979
+ },
1980
+ "durationMs": {
1981
+ "type": "number",
1982
+ "minimum": 0
1983
+ },
1984
+ "data": {
1985
+ "anyOf": [
1986
+ {},
1987
+ {
1988
+ "type": "null"
1989
+ }
1990
+ ]
1991
+ },
1992
+ "problems": {
1993
+ "type": "array",
1994
+ "items": {
1995
+ "type": "object",
1996
+ "properties": {
1997
+ "code": {
1998
+ "type": "string"
1999
+ }
2000
+ },
2001
+ "required": ["code"],
2002
+ "additionalProperties": {}
2003
+ }
2004
+ }
2005
+ },
2006
+ "required": [
2007
+ "schemaVersion",
2008
+ "command",
2009
+ "commandId",
2010
+ "ok",
2011
+ "startedAt",
2012
+ "finishedAt",
2013
+ "durationMs",
2014
+ "data",
2015
+ "problems"
2016
+ ],
2017
+ "additionalProperties": {}
2018
+ }
2019
+ },
2020
+ {
2021
+ "name": "open_url",
2022
+ "description": "Open an absolute URL and verify an explicit app handler when provided.",
2023
+ "inputSchema": {
2024
+ "type": "object",
2025
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
2026
+ "properties": {
2027
+ "targetHandle": {
2028
+ "type": "string",
2029
+ "format": "uuid",
2030
+ "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
2031
+ },
2032
+ "url": {
2033
+ "type": "string",
2034
+ "format": "uri"
2035
+ },
2036
+ "applicationId": {
2037
+ "type": "string",
2038
+ "minLength": 3
2039
+ }
2040
+ },
2041
+ "required": ["url"]
2042
+ },
2043
+ "annotations": {
2044
+ "readOnlyHint": false,
2045
+ "destructiveHint": false,
2046
+ "idempotentHint": false,
2047
+ "openWorldHint": false
2048
+ },
2049
+ "outputSchema": {
2050
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
2051
+ "type": "object",
2052
+ "properties": {
2053
+ "schemaVersion": {
2054
+ "type": "number",
2055
+ "const": 1
2056
+ },
2057
+ "command": {
2058
+ "type": "string"
2059
+ },
2060
+ "commandId": {
2061
+ "type": "string"
2062
+ },
2063
+ "ok": {
2064
+ "type": "boolean"
2065
+ },
2066
+ "startedAt": {
2067
+ "type": "string"
2068
+ },
2069
+ "finishedAt": {
2070
+ "type": "string"
2071
+ },
2072
+ "durationMs": {
2073
+ "type": "number",
2074
+ "minimum": 0
2075
+ },
2076
+ "data": {
2077
+ "anyOf": [
2078
+ {},
2079
+ {
2080
+ "type": "null"
2081
+ }
2082
+ ]
2083
+ },
2084
+ "problems": {
2085
+ "type": "array",
2086
+ "items": {
2087
+ "type": "object",
2088
+ "properties": {
2089
+ "code": {
2090
+ "type": "string"
2091
+ }
2092
+ },
2093
+ "required": ["code"],
2094
+ "additionalProperties": {}
2095
+ }
2096
+ }
2097
+ },
2098
+ "required": [
2099
+ "schemaVersion",
2100
+ "command",
2101
+ "commandId",
2102
+ "ok",
2103
+ "startedAt",
2104
+ "finishedAt",
2105
+ "durationMs",
2106
+ "data",
2107
+ "problems"
2108
+ ],
2109
+ "additionalProperties": {}
2110
+ }
2111
+ },
2112
+ {
2113
+ "name": "press_key_ui",
2114
+ "description": "Press one allowlisted Android navigation or volume key, then compare UI state.",
2115
+ "inputSchema": {
2116
+ "type": "object",
2117
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
2118
+ "properties": {
2119
+ "targetHandle": {
2120
+ "type": "string",
2121
+ "format": "uuid",
2122
+ "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
2123
+ },
2124
+ "key": {
2125
+ "type": "string",
2126
+ "enum": ["back", "enter", "home", "menu", "volume-down", "volume-up"]
2127
+ },
2128
+ "dryRun": {
2129
+ "type": "boolean"
2130
+ }
2131
+ },
2132
+ "required": ["key"]
2133
+ },
2134
+ "annotations": {
2135
+ "readOnlyHint": false,
2136
+ "destructiveHint": false,
2137
+ "idempotentHint": false,
2138
+ "openWorldHint": false
2139
+ },
2140
+ "outputSchema": {
2141
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
2142
+ "type": "object",
2143
+ "properties": {
2144
+ "schemaVersion": {
2145
+ "type": "number",
2146
+ "const": 1
2147
+ },
2148
+ "command": {
2149
+ "type": "string"
2150
+ },
2151
+ "commandId": {
2152
+ "type": "string"
2153
+ },
2154
+ "ok": {
2155
+ "type": "boolean"
2156
+ },
2157
+ "startedAt": {
2158
+ "type": "string"
2159
+ },
2160
+ "finishedAt": {
2161
+ "type": "string"
2162
+ },
2163
+ "durationMs": {
2164
+ "type": "number",
2165
+ "minimum": 0
2166
+ },
2167
+ "data": {
2168
+ "anyOf": [
2169
+ {},
2170
+ {
2171
+ "type": "null"
2172
+ }
2173
+ ]
2174
+ },
2175
+ "problems": {
2176
+ "type": "array",
2177
+ "items": {
2178
+ "type": "object",
2179
+ "properties": {
2180
+ "code": {
2181
+ "type": "string"
2182
+ }
2183
+ },
2184
+ "required": ["code"],
2185
+ "additionalProperties": {}
2186
+ }
2187
+ }
2188
+ },
2189
+ "required": [
2190
+ "schemaVersion",
2191
+ "command",
2192
+ "commandId",
2193
+ "ok",
2194
+ "startedAt",
2195
+ "finishedAt",
2196
+ "durationMs",
2197
+ "data",
2198
+ "problems"
2199
+ ],
2200
+ "additionalProperties": {}
2201
+ }
2202
+ },
2203
+ {
2204
+ "name": "resolve_app",
2205
+ "description": "Resolve the Android project application ID with provenance.",
2206
+ "inputSchema": {
2207
+ "type": "object",
2208
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
2209
+ "properties": {
2210
+ "applicationId": {
2211
+ "type": "string",
2212
+ "minLength": 3
2213
+ }
2214
+ }
2215
+ },
2216
+ "annotations": {
2217
+ "readOnlyHint": true,
2218
+ "destructiveHint": false,
2219
+ "idempotentHint": true,
2220
+ "openWorldHint": false
2221
+ },
2222
+ "outputSchema": {
2223
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
2224
+ "type": "object",
2225
+ "properties": {
2226
+ "schemaVersion": {
2227
+ "type": "number",
2228
+ "const": 1
2229
+ },
2230
+ "command": {
2231
+ "type": "string"
2232
+ },
2233
+ "commandId": {
2234
+ "type": "string"
2235
+ },
2236
+ "ok": {
2237
+ "type": "boolean"
2238
+ },
2239
+ "startedAt": {
2240
+ "type": "string"
2241
+ },
2242
+ "finishedAt": {
2243
+ "type": "string"
2244
+ },
2245
+ "durationMs": {
2246
+ "type": "number",
2247
+ "minimum": 0
2248
+ },
2249
+ "data": {
2250
+ "anyOf": [
2251
+ {},
2252
+ {
2253
+ "type": "null"
2254
+ }
2255
+ ]
2256
+ },
2257
+ "problems": {
2258
+ "type": "array",
2259
+ "items": {
2260
+ "type": "object",
2261
+ "properties": {
2262
+ "code": {
2263
+ "type": "string"
2264
+ }
2265
+ },
2266
+ "required": ["code"],
2267
+ "additionalProperties": {}
2268
+ }
2269
+ }
2270
+ },
2271
+ "required": [
2272
+ "schemaVersion",
2273
+ "command",
2274
+ "commandId",
2275
+ "ok",
2276
+ "startedAt",
2277
+ "finishedAt",
2278
+ "durationMs",
2279
+ "data",
2280
+ "problems"
2281
+ ],
2282
+ "additionalProperties": {}
2283
+ }
2284
+ },
2285
+ {
2286
+ "name": "restart_app",
2287
+ "description": "Restart the resolved app and verify it is foreground.",
2288
+ "inputSchema": {
2289
+ "type": "object",
2290
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
2291
+ "properties": {
2292
+ "targetHandle": {
2293
+ "type": "string",
2294
+ "format": "uuid",
2295
+ "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
2296
+ },
2297
+ "applicationId": {
2298
+ "type": "string",
2299
+ "minLength": 3
2300
+ },
2301
+ "activity": {
2302
+ "type": "string",
2303
+ "minLength": 1
2304
+ }
2305
+ }
2306
+ },
2307
+ "annotations": {
2308
+ "readOnlyHint": false,
2309
+ "destructiveHint": false,
2310
+ "idempotentHint": true,
2311
+ "openWorldHint": false
2312
+ },
2313
+ "outputSchema": {
2314
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
2315
+ "type": "object",
2316
+ "properties": {
2317
+ "schemaVersion": {
2318
+ "type": "number",
2319
+ "const": 1
2320
+ },
2321
+ "command": {
2322
+ "type": "string"
2323
+ },
2324
+ "commandId": {
2325
+ "type": "string"
2326
+ },
2327
+ "ok": {
2328
+ "type": "boolean"
2329
+ },
2330
+ "startedAt": {
2331
+ "type": "string"
2332
+ },
2333
+ "finishedAt": {
2334
+ "type": "string"
2335
+ },
2336
+ "durationMs": {
2337
+ "type": "number",
2338
+ "minimum": 0
2339
+ },
2340
+ "data": {
2341
+ "anyOf": [
2342
+ {},
2343
+ {
2344
+ "type": "null"
2345
+ }
2346
+ ]
2347
+ },
2348
+ "problems": {
2349
+ "type": "array",
2350
+ "items": {
2351
+ "type": "object",
2352
+ "properties": {
2353
+ "code": {
2354
+ "type": "string"
2355
+ }
2356
+ },
2357
+ "required": ["code"],
2358
+ "additionalProperties": {}
2359
+ }
2360
+ }
2361
+ },
2362
+ "required": [
2363
+ "schemaVersion",
2364
+ "command",
2365
+ "commandId",
2366
+ "ok",
2367
+ "startedAt",
2368
+ "finishedAt",
2369
+ "durationMs",
2370
+ "data",
2371
+ "problems"
2372
+ ],
2373
+ "additionalProperties": {}
2374
+ }
2375
+ },
2376
+ {
2377
+ "name": "scroll_ui",
2378
+ "description": "Scroll the screen or one unique semantic scroll container in a display-relative direction, then compare UI state.",
229
2379
  "inputSchema": {
230
2380
  "type": "object",
231
2381
  "$schema": "https://json-schema.org/draft/2020-12/schema",
232
2382
  "properties": {
233
- "target": {
2383
+ "targetHandle": {
2384
+ "type": "string",
2385
+ "format": "uuid",
2386
+ "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
2387
+ },
2388
+ "direction": {
2389
+ "type": "string",
2390
+ "enum": ["down", "left", "right", "up"]
2391
+ },
2392
+ "selector": {
234
2393
  "anyOf": [
235
2394
  {
236
- "type": "object",
237
- "properties": {
238
- "ref": {
239
- "type": "string",
240
- "pattern": "^ui:[a-f0-9]{12}:\\d+$"
241
- }
242
- },
243
- "required": ["ref"]
2395
+ "type": "string",
2396
+ "pattern": "^(?:class|desc|id|package|text)=.{1,256}$"
244
2397
  },
245
2398
  {
246
2399
  "type": "object",
247
2400
  "properties": {
248
- "x": {
249
- "type": "integer",
250
- "minimum": 0,
251
- "maximum": 100000
2401
+ "field": {
2402
+ "type": "string",
2403
+ "enum": ["class", "desc", "id", "package", "text"]
252
2404
  },
253
- "y": {
254
- "type": "integer",
255
- "minimum": 0,
256
- "maximum": 100000
2405
+ "value": {
2406
+ "type": "string",
2407
+ "minLength": 1,
2408
+ "maxLength": 256
2409
+ },
2410
+ "match": {
2411
+ "type": "string",
2412
+ "enum": ["contains", "exact", "starts-with"]
2413
+ },
2414
+ "enabled": {
2415
+ "type": "boolean"
2416
+ },
2417
+ "actionable": {
2418
+ "type": "boolean"
257
2419
  }
258
2420
  },
259
- "required": ["x", "y"]
2421
+ "required": ["field", "value"]
260
2422
  }
261
2423
  ]
262
2424
  },
2425
+ "occurrence": {
2426
+ "type": "integer",
2427
+ "minimum": 1,
2428
+ "maximum": 10000
2429
+ },
263
2430
  "dryRun": {
264
2431
  "type": "boolean"
265
2432
  }
266
2433
  },
267
- "required": ["target"]
2434
+ "required": ["direction"]
268
2435
  },
269
2436
  "annotations": {
270
2437
  "readOnlyHint": false,
271
2438
  "destructiveHint": false,
272
2439
  "idempotentHint": false,
273
2440
  "openWorldHint": false
2441
+ },
2442
+ "outputSchema": {
2443
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
2444
+ "type": "object",
2445
+ "properties": {
2446
+ "schemaVersion": {
2447
+ "type": "number",
2448
+ "const": 1
2449
+ },
2450
+ "command": {
2451
+ "type": "string"
2452
+ },
2453
+ "commandId": {
2454
+ "type": "string"
2455
+ },
2456
+ "ok": {
2457
+ "type": "boolean"
2458
+ },
2459
+ "startedAt": {
2460
+ "type": "string"
2461
+ },
2462
+ "finishedAt": {
2463
+ "type": "string"
2464
+ },
2465
+ "durationMs": {
2466
+ "type": "number",
2467
+ "minimum": 0
2468
+ },
2469
+ "data": {
2470
+ "anyOf": [
2471
+ {},
2472
+ {
2473
+ "type": "null"
2474
+ }
2475
+ ]
2476
+ },
2477
+ "problems": {
2478
+ "type": "array",
2479
+ "items": {
2480
+ "type": "object",
2481
+ "properties": {
2482
+ "code": {
2483
+ "type": "string"
2484
+ }
2485
+ },
2486
+ "required": ["code"],
2487
+ "additionalProperties": {}
2488
+ }
2489
+ }
2490
+ },
2491
+ "required": [
2492
+ "schemaVersion",
2493
+ "command",
2494
+ "commandId",
2495
+ "ok",
2496
+ "startedAt",
2497
+ "finishedAt",
2498
+ "durationMs",
2499
+ "data",
2500
+ "problems"
2501
+ ],
2502
+ "additionalProperties": {}
274
2503
  }
275
2504
  },
276
2505
  {
277
- "name": "open_url",
278
- "description": "Open an absolute URL and verify an explicit app handler when provided.",
2506
+ "name": "start_dev_session",
2507
+ "description": "Start the configured development session as a durable local process and return an opaque handle immediately.",
279
2508
  "inputSchema": {
280
2509
  "type": "object",
281
2510
  "$schema": "https://json-schema.org/draft/2020-12/schema",
282
2511
  "properties": {
283
- "url": {
284
- "type": "string",
285
- "format": "uri"
286
- },
287
- "applicationId": {
2512
+ "targetHandle": {
288
2513
  "type": "string",
289
- "minLength": 3
2514
+ "format": "uuid",
2515
+ "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
290
2516
  }
291
- },
292
- "required": ["url"]
2517
+ }
293
2518
  },
294
2519
  "annotations": {
295
2520
  "readOnlyHint": false,
296
2521
  "destructiveHint": false,
297
2522
  "idempotentHint": false,
298
2523
  "openWorldHint": false
299
- }
300
- },
301
- {
302
- "name": "press_key_ui",
303
- "description": "Press one allowlisted Android navigation or volume key, then compare UI state.",
304
- "inputSchema": {
305
- "type": "object",
2524
+ },
2525
+ "outputSchema": {
306
2526
  "$schema": "https://json-schema.org/draft/2020-12/schema",
2527
+ "type": "object",
307
2528
  "properties": {
308
- "key": {
309
- "type": "string",
310
- "enum": ["back", "enter", "home", "menu", "volume-down", "volume-up"]
2529
+ "schemaVersion": {
2530
+ "type": "number",
2531
+ "const": 1
311
2532
  },
312
- "dryRun": {
2533
+ "command": {
2534
+ "type": "string"
2535
+ },
2536
+ "commandId": {
2537
+ "type": "string"
2538
+ },
2539
+ "ok": {
313
2540
  "type": "boolean"
2541
+ },
2542
+ "startedAt": {
2543
+ "type": "string"
2544
+ },
2545
+ "finishedAt": {
2546
+ "type": "string"
2547
+ },
2548
+ "durationMs": {
2549
+ "type": "number",
2550
+ "minimum": 0
2551
+ },
2552
+ "data": {
2553
+ "anyOf": [
2554
+ {},
2555
+ {
2556
+ "type": "null"
2557
+ }
2558
+ ]
2559
+ },
2560
+ "problems": {
2561
+ "type": "array",
2562
+ "items": {
2563
+ "type": "object",
2564
+ "properties": {
2565
+ "code": {
2566
+ "type": "string"
2567
+ }
2568
+ },
2569
+ "required": ["code"],
2570
+ "additionalProperties": {}
2571
+ }
314
2572
  }
315
2573
  },
316
- "required": ["key"]
317
- },
318
- "annotations": {
319
- "readOnlyHint": false,
320
- "destructiveHint": false,
321
- "idempotentHint": false,
322
- "openWorldHint": false
2574
+ "required": [
2575
+ "schemaVersion",
2576
+ "command",
2577
+ "commandId",
2578
+ "ok",
2579
+ "startedAt",
2580
+ "finishedAt",
2581
+ "durationMs",
2582
+ "data",
2583
+ "problems"
2584
+ ],
2585
+ "additionalProperties": {}
323
2586
  }
324
2587
  },
325
2588
  {
326
- "name": "resolve_app",
327
- "description": "Resolve the Android project application ID with provenance.",
2589
+ "name": "stop_dev_session",
2590
+ "description": "Stop only the durable project-scoped development process owned by an opaque handle.",
328
2591
  "inputSchema": {
329
2592
  "type": "object",
330
2593
  "$schema": "https://json-schema.org/draft/2020-12/schema",
331
2594
  "properties": {
332
- "applicationId": {
2595
+ "taskHandle": {
333
2596
  "type": "string",
334
- "minLength": 3
2597
+ "format": "uuid",
2598
+ "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
335
2599
  }
336
- }
2600
+ },
2601
+ "required": ["taskHandle"]
337
2602
  },
338
2603
  "annotations": {
339
- "readOnlyHint": true,
2604
+ "readOnlyHint": false,
340
2605
  "destructiveHint": false,
341
2606
  "idempotentHint": true,
342
2607
  "openWorldHint": false
343
- }
344
- },
345
- {
346
- "name": "restart_app",
347
- "description": "Restart the resolved app and verify it is foreground.",
348
- "inputSchema": {
349
- "type": "object",
2608
+ },
2609
+ "outputSchema": {
350
2610
  "$schema": "https://json-schema.org/draft/2020-12/schema",
2611
+ "type": "object",
351
2612
  "properties": {
352
- "applicationId": {
353
- "type": "string",
354
- "minLength": 3
2613
+ "schemaVersion": {
2614
+ "type": "number",
2615
+ "const": 1
355
2616
  },
356
- "activity": {
357
- "type": "string",
358
- "minLength": 1
2617
+ "command": {
2618
+ "type": "string"
2619
+ },
2620
+ "commandId": {
2621
+ "type": "string"
2622
+ },
2623
+ "ok": {
2624
+ "type": "boolean"
2625
+ },
2626
+ "startedAt": {
2627
+ "type": "string"
2628
+ },
2629
+ "finishedAt": {
2630
+ "type": "string"
2631
+ },
2632
+ "durationMs": {
2633
+ "type": "number",
2634
+ "minimum": 0
2635
+ },
2636
+ "data": {
2637
+ "anyOf": [
2638
+ {},
2639
+ {
2640
+ "type": "null"
2641
+ }
2642
+ ]
2643
+ },
2644
+ "problems": {
2645
+ "type": "array",
2646
+ "items": {
2647
+ "type": "object",
2648
+ "properties": {
2649
+ "code": {
2650
+ "type": "string"
2651
+ }
2652
+ },
2653
+ "required": ["code"],
2654
+ "additionalProperties": {}
2655
+ }
359
2656
  }
360
- }
361
- },
362
- "annotations": {
363
- "readOnlyHint": false,
364
- "destructiveHint": false,
365
- "idempotentHint": true,
366
- "openWorldHint": false
2657
+ },
2658
+ "required": [
2659
+ "schemaVersion",
2660
+ "command",
2661
+ "commandId",
2662
+ "ok",
2663
+ "startedAt",
2664
+ "finishedAt",
2665
+ "durationMs",
2666
+ "data",
2667
+ "problems"
2668
+ ],
2669
+ "additionalProperties": {}
367
2670
  }
368
2671
  },
369
2672
  {
@@ -373,6 +2676,11 @@
373
2676
  "type": "object",
374
2677
  "$schema": "https://json-schema.org/draft/2020-12/schema",
375
2678
  "properties": {
2679
+ "targetHandle": {
2680
+ "type": "string",
2681
+ "format": "uuid",
2682
+ "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
2683
+ },
376
2684
  "direction": {
377
2685
  "type": "string",
378
2686
  "enum": ["down", "left", "right", "up"]
@@ -407,15 +2715,82 @@
407
2715
  "destructiveHint": false,
408
2716
  "idempotentHint": false,
409
2717
  "openWorldHint": false
2718
+ },
2719
+ "outputSchema": {
2720
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
2721
+ "type": "object",
2722
+ "properties": {
2723
+ "schemaVersion": {
2724
+ "type": "number",
2725
+ "const": 1
2726
+ },
2727
+ "command": {
2728
+ "type": "string"
2729
+ },
2730
+ "commandId": {
2731
+ "type": "string"
2732
+ },
2733
+ "ok": {
2734
+ "type": "boolean"
2735
+ },
2736
+ "startedAt": {
2737
+ "type": "string"
2738
+ },
2739
+ "finishedAt": {
2740
+ "type": "string"
2741
+ },
2742
+ "durationMs": {
2743
+ "type": "number",
2744
+ "minimum": 0
2745
+ },
2746
+ "data": {
2747
+ "anyOf": [
2748
+ {},
2749
+ {
2750
+ "type": "null"
2751
+ }
2752
+ ]
2753
+ },
2754
+ "problems": {
2755
+ "type": "array",
2756
+ "items": {
2757
+ "type": "object",
2758
+ "properties": {
2759
+ "code": {
2760
+ "type": "string"
2761
+ }
2762
+ },
2763
+ "required": ["code"],
2764
+ "additionalProperties": {}
2765
+ }
2766
+ }
2767
+ },
2768
+ "required": [
2769
+ "schemaVersion",
2770
+ "command",
2771
+ "commandId",
2772
+ "ok",
2773
+ "startedAt",
2774
+ "finishedAt",
2775
+ "durationMs",
2776
+ "data",
2777
+ "problems"
2778
+ ],
2779
+ "additionalProperties": {}
410
2780
  }
411
2781
  },
412
2782
  {
413
2783
  "name": "tap_ui",
414
- "description": "Tap a current digest-scoped UI ref or explicit display coordinate, then compare UI state.",
2784
+ "description": "Tap a unique semantic selector, current digest-scoped UI ref, or explicit display coordinate, then compare UI state.",
415
2785
  "inputSchema": {
416
2786
  "type": "object",
417
2787
  "$schema": "https://json-schema.org/draft/2020-12/schema",
418
2788
  "properties": {
2789
+ "targetHandle": {
2790
+ "type": "string",
2791
+ "format": "uuid",
2792
+ "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
2793
+ },
419
2794
  "target": {
420
2795
  "anyOf": [
421
2796
  {
@@ -428,6 +2803,50 @@
428
2803
  },
429
2804
  "required": ["ref"]
430
2805
  },
2806
+ {
2807
+ "type": "object",
2808
+ "properties": {
2809
+ "selector": {
2810
+ "anyOf": [
2811
+ {
2812
+ "type": "string",
2813
+ "pattern": "^(?:class|desc|id|package|text)=.{1,256}$"
2814
+ },
2815
+ {
2816
+ "type": "object",
2817
+ "properties": {
2818
+ "field": {
2819
+ "type": "string",
2820
+ "enum": ["class", "desc", "id", "package", "text"]
2821
+ },
2822
+ "value": {
2823
+ "type": "string",
2824
+ "minLength": 1,
2825
+ "maxLength": 256
2826
+ },
2827
+ "match": {
2828
+ "type": "string",
2829
+ "enum": ["contains", "exact", "starts-with"]
2830
+ },
2831
+ "enabled": {
2832
+ "type": "boolean"
2833
+ },
2834
+ "actionable": {
2835
+ "type": "boolean"
2836
+ }
2837
+ },
2838
+ "required": ["field", "value"]
2839
+ }
2840
+ ]
2841
+ },
2842
+ "occurrence": {
2843
+ "type": "integer",
2844
+ "minimum": 1,
2845
+ "maximum": 10000
2846
+ }
2847
+ },
2848
+ "required": ["selector"]
2849
+ },
431
2850
  {
432
2851
  "type": "object",
433
2852
  "properties": {
@@ -457,6 +2876,68 @@
457
2876
  "destructiveHint": false,
458
2877
  "idempotentHint": false,
459
2878
  "openWorldHint": false
2879
+ },
2880
+ "outputSchema": {
2881
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
2882
+ "type": "object",
2883
+ "properties": {
2884
+ "schemaVersion": {
2885
+ "type": "number",
2886
+ "const": 1
2887
+ },
2888
+ "command": {
2889
+ "type": "string"
2890
+ },
2891
+ "commandId": {
2892
+ "type": "string"
2893
+ },
2894
+ "ok": {
2895
+ "type": "boolean"
2896
+ },
2897
+ "startedAt": {
2898
+ "type": "string"
2899
+ },
2900
+ "finishedAt": {
2901
+ "type": "string"
2902
+ },
2903
+ "durationMs": {
2904
+ "type": "number",
2905
+ "minimum": 0
2906
+ },
2907
+ "data": {
2908
+ "anyOf": [
2909
+ {},
2910
+ {
2911
+ "type": "null"
2912
+ }
2913
+ ]
2914
+ },
2915
+ "problems": {
2916
+ "type": "array",
2917
+ "items": {
2918
+ "type": "object",
2919
+ "properties": {
2920
+ "code": {
2921
+ "type": "string"
2922
+ }
2923
+ },
2924
+ "required": ["code"],
2925
+ "additionalProperties": {}
2926
+ }
2927
+ }
2928
+ },
2929
+ "required": [
2930
+ "schemaVersion",
2931
+ "command",
2932
+ "commandId",
2933
+ "ok",
2934
+ "startedAt",
2935
+ "finishedAt",
2936
+ "durationMs",
2937
+ "data",
2938
+ "problems"
2939
+ ],
2940
+ "additionalProperties": {}
460
2941
  }
461
2942
  },
462
2943
  {
@@ -466,6 +2947,11 @@
466
2947
  "type": "object",
467
2948
  "$schema": "https://json-schema.org/draft/2020-12/schema",
468
2949
  "properties": {
2950
+ "targetHandle": {
2951
+ "type": "string",
2952
+ "format": "uuid",
2953
+ "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
2954
+ },
469
2955
  "text": {
470
2956
  "type": "string",
471
2957
  "minLength": 1,
@@ -485,6 +2971,68 @@
485
2971
  "destructiveHint": false,
486
2972
  "idempotentHint": false,
487
2973
  "openWorldHint": false
2974
+ },
2975
+ "outputSchema": {
2976
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
2977
+ "type": "object",
2978
+ "properties": {
2979
+ "schemaVersion": {
2980
+ "type": "number",
2981
+ "const": 1
2982
+ },
2983
+ "command": {
2984
+ "type": "string"
2985
+ },
2986
+ "commandId": {
2987
+ "type": "string"
2988
+ },
2989
+ "ok": {
2990
+ "type": "boolean"
2991
+ },
2992
+ "startedAt": {
2993
+ "type": "string"
2994
+ },
2995
+ "finishedAt": {
2996
+ "type": "string"
2997
+ },
2998
+ "durationMs": {
2999
+ "type": "number",
3000
+ "minimum": 0
3001
+ },
3002
+ "data": {
3003
+ "anyOf": [
3004
+ {},
3005
+ {
3006
+ "type": "null"
3007
+ }
3008
+ ]
3009
+ },
3010
+ "problems": {
3011
+ "type": "array",
3012
+ "items": {
3013
+ "type": "object",
3014
+ "properties": {
3015
+ "code": {
3016
+ "type": "string"
3017
+ }
3018
+ },
3019
+ "required": ["code"],
3020
+ "additionalProperties": {}
3021
+ }
3022
+ }
3023
+ },
3024
+ "required": [
3025
+ "schemaVersion",
3026
+ "command",
3027
+ "commandId",
3028
+ "ok",
3029
+ "startedAt",
3030
+ "finishedAt",
3031
+ "durationMs",
3032
+ "data",
3033
+ "problems"
3034
+ ],
3035
+ "additionalProperties": {}
488
3036
  }
489
3037
  },
490
3038
  {
@@ -494,10 +3042,43 @@
494
3042
  "type": "object",
495
3043
  "$schema": "https://json-schema.org/draft/2020-12/schema",
496
3044
  "properties": {
497
- "selector": {
3045
+ "targetHandle": {
498
3046
  "type": "string",
499
- "minLength": 3,
500
- "maxLength": 264
3047
+ "format": "uuid",
3048
+ "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
3049
+ },
3050
+ "selector": {
3051
+ "anyOf": [
3052
+ {
3053
+ "type": "string",
3054
+ "pattern": "^(?:class|desc|id|package|text)=.{1,256}$"
3055
+ },
3056
+ {
3057
+ "type": "object",
3058
+ "properties": {
3059
+ "field": {
3060
+ "type": "string",
3061
+ "enum": ["class", "desc", "id", "package", "text"]
3062
+ },
3063
+ "value": {
3064
+ "type": "string",
3065
+ "minLength": 1,
3066
+ "maxLength": 256
3067
+ },
3068
+ "match": {
3069
+ "type": "string",
3070
+ "enum": ["contains", "exact", "starts-with"]
3071
+ },
3072
+ "enabled": {
3073
+ "type": "boolean"
3074
+ },
3075
+ "actionable": {
3076
+ "type": "boolean"
3077
+ }
3078
+ },
3079
+ "required": ["field", "value"]
3080
+ }
3081
+ ]
501
3082
  },
502
3083
  "state": {
503
3084
  "type": "string",
@@ -516,6 +3097,68 @@
516
3097
  "destructiveHint": false,
517
3098
  "idempotentHint": true,
518
3099
  "openWorldHint": false
3100
+ },
3101
+ "outputSchema": {
3102
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3103
+ "type": "object",
3104
+ "properties": {
3105
+ "schemaVersion": {
3106
+ "type": "number",
3107
+ "const": 1
3108
+ },
3109
+ "command": {
3110
+ "type": "string"
3111
+ },
3112
+ "commandId": {
3113
+ "type": "string"
3114
+ },
3115
+ "ok": {
3116
+ "type": "boolean"
3117
+ },
3118
+ "startedAt": {
3119
+ "type": "string"
3120
+ },
3121
+ "finishedAt": {
3122
+ "type": "string"
3123
+ },
3124
+ "durationMs": {
3125
+ "type": "number",
3126
+ "minimum": 0
3127
+ },
3128
+ "data": {
3129
+ "anyOf": [
3130
+ {},
3131
+ {
3132
+ "type": "null"
3133
+ }
3134
+ ]
3135
+ },
3136
+ "problems": {
3137
+ "type": "array",
3138
+ "items": {
3139
+ "type": "object",
3140
+ "properties": {
3141
+ "code": {
3142
+ "type": "string"
3143
+ }
3144
+ },
3145
+ "required": ["code"],
3146
+ "additionalProperties": {}
3147
+ }
3148
+ }
3149
+ },
3150
+ "required": [
3151
+ "schemaVersion",
3152
+ "command",
3153
+ "commandId",
3154
+ "ok",
3155
+ "startedAt",
3156
+ "finishedAt",
3157
+ "durationMs",
3158
+ "data",
3159
+ "problems"
3160
+ ],
3161
+ "additionalProperties": {}
519
3162
  }
520
3163
  }
521
3164
  ]