mobile-debug-mcp 0.36.0 → 0.37.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.
Files changed (171) hide show
  1. package/README.md +10 -0
  2. package/agent-plugin/.antigravity-plugin/plugin.json +1 -1
  3. package/agent-plugin/.claude-plugin/plugin.json +2 -2
  4. package/agent-plugin/.codex-plugin/plugin.json +1 -1
  5. package/agent-plugin/.cursor-plugin/plugin.json +2 -2
  6. package/agent-plugin/.mcp.json +1 -1
  7. package/agent-plugin/cursor/.cursor-plugin/plugin.json +2 -2
  8. package/agent-plugin/cursor/skills/mobile-debug-mcp/SKILL.md +10 -2
  9. package/agent-plugin/mcp.json +1 -1
  10. package/agent-plugin/mcp_config.json +1 -1
  11. package/agent-plugin/plugin.json +1 -1
  12. package/agent-plugin/skills/mobile-debug-mcp/SKILL.md +10 -2
  13. package/dist/contracts/device-readiness.js +1 -0
  14. package/dist/interact/waits/ui-change-wait.js +9 -2
  15. package/dist/interact/waits/ui-wait.js +7 -3
  16. package/dist/manage/index.js +3 -0
  17. package/dist/observe/device-readiness.js +116 -0
  18. package/dist/observe/evidence.js +31 -0
  19. package/dist/observe/ios-trace/sessions.js +5 -3
  20. package/dist/observe/readiness-service.js +21 -9
  21. package/dist/observe/readiness.js +30 -0
  22. package/dist/observe/screenshot-encoding.js +4 -0
  23. package/dist/observe/snapshot-collection.js +7 -2
  24. package/dist/server/definitions/manage.js +3 -2
  25. package/dist/server/handlers/action-execution.js +23 -14
  26. package/dist/server/handlers/compact-interaction.js +106 -0
  27. package/dist/server/handlers/compact-state.js +47 -0
  28. package/dist/server/handlers/input.js +2 -0
  29. package/dist/server/handlers/interact.js +2 -0
  30. package/dist/server/handlers/interaction-diagnostics.js +62 -0
  31. package/dist/server/handlers/journey.js +18 -20
  32. package/dist/server/handlers/observe.js +2 -1
  33. package/dist/server/handlers/tool-handlers.js +9 -5
  34. package/dist/server/schemas/interaction-diagnostics.js +9 -0
  35. package/dist/server/tool-definitions.js +9 -4
  36. package/dist/server-core.js +5 -2
  37. package/dist/server.js +1 -1
  38. package/dist/system/android.js +19 -15
  39. package/dist/system/index.js +2 -1
  40. package/dist/utils/android/utils.js +7 -16
  41. package/dist/utils/app-installation.js +77 -0
  42. package/dist/utils/benchmark-metrics.js +43 -0
  43. package/dist/utils/exec.js +4 -0
  44. package/dist/utils/ios/utils.js +4 -11
  45. package/dist/utils/resolve-device.js +3 -2
  46. package/dist/utils/timing.js +3 -3
  47. package/docs/CHANGELOG.md +25 -0
  48. package/docs/benchmarks/README.md +1 -0
  49. package/docs/benchmarks/end-to-end-latency/README.md +98 -0
  50. package/docs/benchmarks/end-to-end-latency/android-snapshot-pair.json +6532 -0
  51. package/docs/benchmarks/end-to-end-latency/android-snapshot-pair.md +30 -0
  52. package/docs/benchmarks/end-to-end-latency/baseline-attempt-1.json +15901 -0
  53. package/docs/benchmarks/end-to-end-latency/baseline-attempt-1.md +14 -0
  54. package/docs/benchmarks/end-to-end-latency/baseline.json +233843 -0
  55. package/docs/benchmarks/end-to-end-latency/baseline.md +21 -0
  56. package/docs/benchmarks/end-to-end-latency/investigation.md +128 -0
  57. package/docs/benchmarks/end-to-end-latency/ios-smoke.json +84 -0
  58. package/docs/benchmarks/end-to-end-latency/ios-smoke.md +9 -0
  59. package/docs/benchmarks/end-to-end-latency/smoke.json +19601 -0
  60. package/docs/benchmarks/end-to-end-latency/smoke.md +21 -0
  61. package/docs/specs/031-ios-system-traces/plan.md +28 -0
  62. package/docs/specs/033-device-readiness-blockers/android-evidence.json +437 -0
  63. package/docs/specs/033-device-readiness-blockers/android-physical-evidence.json +28 -0
  64. package/docs/specs/033-device-readiness-blockers/android-physical-power-evidence.json +29 -0
  65. package/docs/specs/033-device-readiness-blockers/intent.md +41 -0
  66. package/docs/specs/033-device-readiness-blockers/ios-investigation.md +55 -0
  67. package/docs/specs/033-device-readiness-blockers/ios-probe-evidence.json +24 -0
  68. package/docs/specs/033-device-readiness-blockers/ios-tool-evidence.json +73 -0
  69. package/docs/specs/033-device-readiness-blockers/plan.md +249 -0
  70. package/docs/specs/033-device-readiness-blockers/spec.md +134 -0
  71. package/docs/specs/034-app-installation-status/intent.md +41 -0
  72. package/docs/specs/034-app-installation-status/native-evidence.json +654 -0
  73. package/docs/specs/034-app-installation-status/plan.md +73 -0
  74. package/docs/specs/034-app-installation-status/spec.md +114 -0
  75. package/docs/specs/035-compact-interaction-results/baseline.md +45 -0
  76. package/docs/specs/035-compact-interaction-results/intent.md +38 -0
  77. package/docs/specs/035-compact-interaction-results/plan.md +43 -0
  78. package/docs/specs/035-compact-interaction-results/spec.md +118 -0
  79. package/docs/specs/035-compact-interaction-results/verification.md +111 -0
  80. package/docs/specs/036-end-to-end-interaction-latency/android-snapshot-amendment.md +60 -0
  81. package/docs/specs/036-end-to-end-interaction-latency/android-snapshot-plan.md +32 -0
  82. package/docs/specs/036-end-to-end-interaction-latency/intent.md +37 -0
  83. package/docs/specs/036-end-to-end-interaction-latency/plan.md +59 -0
  84. package/docs/specs/036-end-to-end-interaction-latency/spec.md +126 -0
  85. package/docs/specs/036-end-to-end-interaction-latency/verification.md +87 -0
  86. package/docs/tools/TOOLS.md +1 -0
  87. package/docs/tools/compact-interactions.md +56 -0
  88. package/docs/tools/correlated-evidence.md +6 -0
  89. package/docs/tools/interact.md +17 -8
  90. package/docs/tools/manage.md +10 -2
  91. package/docs/tools/observe.md +42 -2
  92. package/docs/tools/system.md +6 -0
  93. package/package.json +1 -1
  94. package/src/contracts/device-readiness.ts +8 -0
  95. package/src/interact/waits/ui-change-wait.ts +7 -2
  96. package/src/interact/waits/ui-wait.ts +6 -3
  97. package/src/manage/index.ts +2 -0
  98. package/src/observe/device-readiness.ts +96 -0
  99. package/src/observe/evidence.ts +30 -1
  100. package/src/observe/ios-trace/sessions.ts +4 -2
  101. package/src/observe/readiness-service.ts +21 -9
  102. package/src/observe/readiness.ts +33 -0
  103. package/src/observe/screenshot-encoding.ts +4 -0
  104. package/src/observe/snapshot-collection.ts +7 -2
  105. package/src/server/common.ts +2 -2
  106. package/src/server/definitions/manage.ts +3 -2
  107. package/src/server/handlers/action-execution.ts +22 -14
  108. package/src/server/handlers/compact-interaction.ts +91 -0
  109. package/src/server/handlers/compact-state.ts +43 -0
  110. package/src/server/handlers/input.ts +2 -0
  111. package/src/server/handlers/interact.ts +2 -0
  112. package/src/server/handlers/interaction-diagnostics.ts +50 -0
  113. package/src/server/handlers/journey.ts +15 -17
  114. package/src/server/handlers/observe.ts +2 -1
  115. package/src/server/handlers/payload.ts +2 -1
  116. package/src/server/handlers/tool-handlers.ts +9 -5
  117. package/src/server/schemas/interaction-diagnostics.ts +10 -0
  118. package/src/server/tool-definitions.ts +8 -4
  119. package/src/server-core.ts +5 -2
  120. package/src/server.ts +1 -1
  121. package/src/system/android.ts +18 -11
  122. package/src/system/index.ts +2 -1
  123. package/src/types.ts +2 -0
  124. package/src/utils/android/utils.ts +8 -10
  125. package/src/utils/app-installation.ts +73 -0
  126. package/src/utils/benchmark-metrics.ts +42 -0
  127. package/src/utils/exec.ts +5 -0
  128. package/src/utils/ios/utils.ts +4 -10
  129. package/src/utils/resolve-device.ts +4 -2
  130. package/src/utils/timing.ts +3 -2
  131. package/test/device/automated/debugger/runtime.android.test.ts +5 -0
  132. package/test/device/automated/debugger/runtime.ios.test.ts +7 -1
  133. package/test/device/automated/interact/compact-results.smoke.ts +58 -0
  134. package/test/device/automated/latency/end-to-end-environment.ts +61 -0
  135. package/test/device/automated/latency/end-to-end-report.ts +90 -0
  136. package/test/device/automated/latency/end-to-end-session.ts +98 -0
  137. package/test/device/automated/latency/end-to-end.ts +149 -0
  138. package/test/device/automated/latency/owned-transport.ts +81 -0
  139. package/test/device/automated/latency/snapshot-pair.ts +143 -0
  140. package/test/device/automated/latency-ios/benchmark.ts +126 -0
  141. package/test/device/automated/observe/correlated-evidence.smoke.ts +7 -5
  142. package/test/device/automated/observe/device-readiness-cleanup.ts +14 -0
  143. package/test/device/automated/observe/device-readiness.android.smoke.ts +78 -0
  144. package/test/device/automated/observe/ios-system-trace.smoke.ts +2 -2
  145. package/test/device/automated/observe/system-trace.smoke.ts +2 -2
  146. package/test/fixtures/contracts/tool-definitions.json +51 -15
  147. package/test/fixtures/latency-journey-app/build.ts +3 -3
  148. package/test/unit/debugger/handle-guards.test.ts +2 -1
  149. package/test/unit/interact/ui-change-readiness-interruption.test.ts +37 -0
  150. package/test/unit/observe/capture_debug_snapshot.test.ts +66 -12
  151. package/test/unit/observe/device-readiness-cleanup.test.ts +24 -0
  152. package/test/unit/observe/device-readiness.test.ts +97 -0
  153. package/test/unit/observe/ios-trace-sessions.test.ts +23 -0
  154. package/test/unit/observe/readiness-retained-blockers.test.ts +40 -0
  155. package/test/unit/server/compact-interaction.test.ts +87 -0
  156. package/test/unit/server/compact-journey-evidence.test.ts +40 -0
  157. package/test/unit/server/compact-review-regressions.test.ts +78 -0
  158. package/test/unit/server/conditional_actions.test.ts +7 -3
  159. package/test/unit/server/correlated-evidence.test.ts +18 -6
  160. package/test/unit/server/end-to-end-report.test.ts +46 -0
  161. package/test/unit/server/input-device-readiness.test.ts +55 -0
  162. package/test/unit/server/interaction-diagnostics.test.ts +45 -0
  163. package/test/unit/server/owned-benchmark-transport.test.ts +32 -0
  164. package/test/unit/server/readiness-retained-deadline.test.ts +32 -0
  165. package/test/unit/server/readiness.test.ts +24 -1
  166. package/test/unit/server/run_journey.test.ts +2 -1
  167. package/test/unit/server/selector_tap_target.test.ts +2 -1
  168. package/test/unit/server/system-trace.test.ts +6 -4
  169. package/test/unit/utils/app-installation.test.ts +78 -0
  170. package/test/unit/utils/benchmark-metrics.test.ts +36 -0
  171. package/test/unit/utils/resolve_device.test.ts +11 -0
@@ -0,0 +1,654 @@
1
+ {
2
+ "build": "73a856fd4dae21a47249d4e0f5ed004912f09f79 + local issue98 changes",
3
+ "timestamp": "2026-11-05T20:45:43.987Z",
4
+ "calls": [
5
+ {
6
+ "tool": "list_devices",
7
+ "args": {
8
+ "platform": "android"
9
+ },
10
+ "result": {
11
+ "devices": [
12
+ {
13
+ "platform": "android",
14
+ "id": "adb-51181FDAP0031Y-gxy7FO._adb-tls-connect._tcp",
15
+ "osVersion": "17",
16
+ "model": "Pixel 9 Pro",
17
+ "simulator": false,
18
+ "appInstallation": {
19
+ "status": "unknown",
20
+ "appId": null,
21
+ "deviceId": "adb-51181FDAP0031Y-gxy7FO._adb-tls-connect._tcp",
22
+ "scope": "android-current-user",
23
+ "checkedAt": null,
24
+ "reason": "APP_ID_NOT_PROVIDED"
25
+ }
26
+ },
27
+ {
28
+ "platform": "android",
29
+ "id": "emulator-5554",
30
+ "osVersion": "16",
31
+ "model": "sdk_gphone64_arm64",
32
+ "simulator": true,
33
+ "appInstallation": {
34
+ "status": "unknown",
35
+ "appId": null,
36
+ "deviceId": "emulator-5554",
37
+ "scope": "android-current-user",
38
+ "checkedAt": null,
39
+ "reason": "APP_ID_NOT_PROVIDED"
40
+ }
41
+ }
42
+ ]
43
+ }
44
+ },
45
+ {
46
+ "tool": "list_devices",
47
+ "args": {
48
+ "platform": "android",
49
+ "appId": "com.ideamechanics.modul8.dev"
50
+ },
51
+ "result": {
52
+ "devices": [
53
+ {
54
+ "platform": "android",
55
+ "id": "adb-51181FDAP0031Y-gxy7FO._adb-tls-connect._tcp",
56
+ "osVersion": "17",
57
+ "model": "Pixel 9 Pro",
58
+ "simulator": false,
59
+ "appInstallation": {
60
+ "status": "installed",
61
+ "appId": "com.ideamechanics.modul8.dev",
62
+ "deviceId": "adb-51181FDAP0031Y-gxy7FO._adb-tls-connect._tcp",
63
+ "scope": "android-current-user",
64
+ "checkedAt": "2026-11-05T20:45:44.909Z"
65
+ },
66
+ "appInstalled": true
67
+ },
68
+ {
69
+ "platform": "android",
70
+ "id": "emulator-5554",
71
+ "osVersion": "16",
72
+ "model": "sdk_gphone64_arm64",
73
+ "simulator": true,
74
+ "appInstallation": {
75
+ "status": "installed",
76
+ "appId": "com.ideamechanics.modul8.dev",
77
+ "deviceId": "emulator-5554",
78
+ "scope": "android-current-user",
79
+ "checkedAt": "2026-11-05T20:45:44.810Z"
80
+ },
81
+ "appInstalled": true
82
+ }
83
+ ]
84
+ }
85
+ },
86
+ {
87
+ "tool": "list_devices",
88
+ "args": {
89
+ "platform": "android",
90
+ "appId": "invalid.nonexistent.issue98"
91
+ },
92
+ "result": {
93
+ "devices": [
94
+ {
95
+ "platform": "android",
96
+ "id": "adb-51181FDAP0031Y-gxy7FO._adb-tls-connect._tcp",
97
+ "osVersion": "17",
98
+ "model": "Pixel 9 Pro",
99
+ "simulator": false,
100
+ "appInstallation": {
101
+ "status": "absent",
102
+ "appId": "invalid.nonexistent.issue98",
103
+ "deviceId": "adb-51181FDAP0031Y-gxy7FO._adb-tls-connect._tcp",
104
+ "scope": "android-current-user",
105
+ "checkedAt": "2026-11-05T20:45:45.811Z"
106
+ },
107
+ "appInstalled": false
108
+ },
109
+ {
110
+ "platform": "android",
111
+ "id": "emulator-5554",
112
+ "osVersion": "16",
113
+ "model": "sdk_gphone64_arm64",
114
+ "simulator": true,
115
+ "appInstallation": {
116
+ "status": "absent",
117
+ "appId": "invalid.nonexistent.issue98",
118
+ "deviceId": "emulator-5554",
119
+ "scope": "android-current-user",
120
+ "checkedAt": "2026-11-05T20:45:45.829Z"
121
+ },
122
+ "appInstalled": false
123
+ }
124
+ ]
125
+ }
126
+ },
127
+ {
128
+ "tool": "list_devices",
129
+ "args": {
130
+ "platform": "ios",
131
+ "appId": "com.apple.mobilesafari"
132
+ },
133
+ "result": {
134
+ "devices": [
135
+ {
136
+ "platform": "ios",
137
+ "id": "F9243BAF-62A8-4990-8A99-17F527F56FDA",
138
+ "osVersion": "iOS 26.4",
139
+ "model": "iPhone 17 Pro",
140
+ "simulator": true,
141
+ "booted": true,
142
+ "appInstallation": {
143
+ "status": "installed",
144
+ "appId": "com.apple.mobilesafari",
145
+ "deviceId": "F9243BAF-62A8-4990-8A99-17F527F56FDA",
146
+ "scope": "ios-simulator",
147
+ "checkedAt": "2026-11-05T20:45:47.111Z"
148
+ },
149
+ "appInstalled": true
150
+ },
151
+ {
152
+ "platform": "ios",
153
+ "id": "F72108FF-C8D6-4C1E-980E-1AE5E5CCD27B",
154
+ "osVersion": "iOS 26.4",
155
+ "model": "iPhone Air",
156
+ "simulator": true,
157
+ "booted": false,
158
+ "appInstallation": {
159
+ "status": "unknown",
160
+ "appId": "com.apple.mobilesafari",
161
+ "deviceId": "F72108FF-C8D6-4C1E-980E-1AE5E5CCD27B",
162
+ "scope": "ios-simulator",
163
+ "checkedAt": null,
164
+ "reason": "DEVICE_UNAVAILABLE"
165
+ }
166
+ },
167
+ {
168
+ "platform": "ios",
169
+ "id": "F00DC533-007F-4AB1-BFBD-C7E06884BE57",
170
+ "osVersion": "iOS 27.2.iPhone19.4",
171
+ "model": "iPhone Duo",
172
+ "simulator": true,
173
+ "booted": false,
174
+ "appInstallation": {
175
+ "status": "unknown",
176
+ "appId": "com.apple.mobilesafari",
177
+ "deviceId": "F00DC533-007F-4AB1-BFBD-C7E06884BE57",
178
+ "scope": "ios-simulator",
179
+ "checkedAt": null,
180
+ "reason": "DEVICE_UNAVAILABLE"
181
+ }
182
+ },
183
+ {
184
+ "platform": "ios",
185
+ "id": "0D4B24EB-9323-4EF0-BF27-BA11CE336EC6",
186
+ "osVersion": "iOS 27.2",
187
+ "model": "iPhone 18 Pro",
188
+ "simulator": true,
189
+ "booted": false,
190
+ "appInstallation": {
191
+ "status": "unknown",
192
+ "appId": "com.apple.mobilesafari",
193
+ "deviceId": "0D4B24EB-9323-4EF0-BF27-BA11CE336EC6",
194
+ "scope": "ios-simulator",
195
+ "checkedAt": null,
196
+ "reason": "DEVICE_UNAVAILABLE"
197
+ }
198
+ },
199
+ {
200
+ "platform": "ios",
201
+ "id": "F299B6B8-D62A-4FC7-99B9-8A7334279C09",
202
+ "osVersion": "iOS 27.2",
203
+ "model": "iPhone 18 Pro Max",
204
+ "simulator": true,
205
+ "booted": false,
206
+ "appInstallation": {
207
+ "status": "unknown",
208
+ "appId": "com.apple.mobilesafari",
209
+ "deviceId": "F299B6B8-D62A-4FC7-99B9-8A7334279C09",
210
+ "scope": "ios-simulator",
211
+ "checkedAt": null,
212
+ "reason": "DEVICE_UNAVAILABLE"
213
+ }
214
+ },
215
+ {
216
+ "platform": "ios",
217
+ "id": "A37DBE8B-AE8B-43A8-8BBB-73D1F3BF37D2",
218
+ "osVersion": "iOS 27.2",
219
+ "model": "iPhone 17e",
220
+ "simulator": true,
221
+ "booted": false,
222
+ "appInstallation": {
223
+ "status": "unknown",
224
+ "appId": "com.apple.mobilesafari",
225
+ "deviceId": "A37DBE8B-AE8B-43A8-8BBB-73D1F3BF37D2",
226
+ "scope": "ios-simulator",
227
+ "checkedAt": null,
228
+ "reason": "DEVICE_UNAVAILABLE"
229
+ }
230
+ },
231
+ {
232
+ "platform": "ios",
233
+ "id": "3C1CA052-BD42-4A44-BE1C-1D6BCF7B9108",
234
+ "osVersion": "iOS 27.2",
235
+ "model": "iPhone Air",
236
+ "simulator": true,
237
+ "booted": false,
238
+ "appInstallation": {
239
+ "status": "unknown",
240
+ "appId": "com.apple.mobilesafari",
241
+ "deviceId": "3C1CA052-BD42-4A44-BE1C-1D6BCF7B9108",
242
+ "scope": "ios-simulator",
243
+ "checkedAt": null,
244
+ "reason": "DEVICE_UNAVAILABLE"
245
+ }
246
+ },
247
+ {
248
+ "platform": "ios",
249
+ "id": "5C1C388C-8E7F-458F-B96F-38FA15721481",
250
+ "osVersion": "iOS 27.2",
251
+ "model": "iPhone 17",
252
+ "simulator": true,
253
+ "booted": false,
254
+ "appInstallation": {
255
+ "status": "unknown",
256
+ "appId": "com.apple.mobilesafari",
257
+ "deviceId": "5C1C388C-8E7F-458F-B96F-38FA15721481",
258
+ "scope": "ios-simulator",
259
+ "checkedAt": null,
260
+ "reason": "DEVICE_UNAVAILABLE"
261
+ }
262
+ },
263
+ {
264
+ "platform": "ios",
265
+ "id": "E7FAE6DC-7023-4EC6-B12D-4F9F92ABBF34",
266
+ "osVersion": "iOS 27.2",
267
+ "model": "iPad mini (A20 Pro)",
268
+ "simulator": true,
269
+ "booted": false,
270
+ "appInstallation": {
271
+ "status": "unknown",
272
+ "appId": "com.apple.mobilesafari",
273
+ "deviceId": "E7FAE6DC-7023-4EC6-B12D-4F9F92ABBF34",
274
+ "scope": "ios-simulator",
275
+ "checkedAt": null,
276
+ "reason": "DEVICE_UNAVAILABLE"
277
+ }
278
+ },
279
+ {
280
+ "platform": "ios",
281
+ "id": "6F002453-7EFB-445C-85E6-23057EEBA693",
282
+ "osVersion": "iOS 27.2",
283
+ "model": "iPad Pro 13-inch (M5)",
284
+ "simulator": true,
285
+ "booted": false,
286
+ "appInstallation": {
287
+ "status": "unknown",
288
+ "appId": "com.apple.mobilesafari",
289
+ "deviceId": "6F002453-7EFB-445C-85E6-23057EEBA693",
290
+ "scope": "ios-simulator",
291
+ "checkedAt": null,
292
+ "reason": "DEVICE_UNAVAILABLE"
293
+ }
294
+ },
295
+ {
296
+ "platform": "ios",
297
+ "id": "B9E62B7C-5674-4F76-8C37-5A3FDBE62957",
298
+ "osVersion": "iOS 27.2",
299
+ "model": "iPad Pro 11-inch (M5)",
300
+ "simulator": true,
301
+ "booted": false,
302
+ "appInstallation": {
303
+ "status": "unknown",
304
+ "appId": "com.apple.mobilesafari",
305
+ "deviceId": "B9E62B7C-5674-4F76-8C37-5A3FDBE62957",
306
+ "scope": "ios-simulator",
307
+ "checkedAt": null,
308
+ "reason": "DEVICE_UNAVAILABLE"
309
+ }
310
+ },
311
+ {
312
+ "platform": "ios",
313
+ "id": "5D6B5F36-F005-4AD9-A96E-19C629689392",
314
+ "osVersion": "iOS 27.2",
315
+ "model": "iPad Air 13-inch (M4)",
316
+ "simulator": true,
317
+ "booted": false,
318
+ "appInstallation": {
319
+ "status": "unknown",
320
+ "appId": "com.apple.mobilesafari",
321
+ "deviceId": "5D6B5F36-F005-4AD9-A96E-19C629689392",
322
+ "scope": "ios-simulator",
323
+ "checkedAt": null,
324
+ "reason": "DEVICE_UNAVAILABLE"
325
+ }
326
+ },
327
+ {
328
+ "platform": "ios",
329
+ "id": "415269D0-3612-4592-A374-F2C6A60007C6",
330
+ "osVersion": "iOS 27.2",
331
+ "model": "iPad Air 11-inch (M4)",
332
+ "simulator": true,
333
+ "booted": false,
334
+ "appInstallation": {
335
+ "status": "unknown",
336
+ "appId": "com.apple.mobilesafari",
337
+ "deviceId": "415269D0-3612-4592-A374-F2C6A60007C6",
338
+ "scope": "ios-simulator",
339
+ "checkedAt": null,
340
+ "reason": "DEVICE_UNAVAILABLE"
341
+ }
342
+ },
343
+ {
344
+ "platform": "ios",
345
+ "id": "097E95D6-E121-48E1-B6CB-47E8D58892D7",
346
+ "osVersion": "iOS 27.2",
347
+ "model": "iPad (A16)",
348
+ "simulator": true,
349
+ "booted": false,
350
+ "appInstallation": {
351
+ "status": "unknown",
352
+ "appId": "com.apple.mobilesafari",
353
+ "deviceId": "097E95D6-E121-48E1-B6CB-47E8D58892D7",
354
+ "scope": "ios-simulator",
355
+ "checkedAt": null,
356
+ "reason": "DEVICE_UNAVAILABLE"
357
+ }
358
+ }
359
+ ]
360
+ }
361
+ },
362
+ {
363
+ "tool": "list_devices",
364
+ "args": {
365
+ "platform": "ios",
366
+ "appId": "invalid.nonexistent.issue98"
367
+ },
368
+ "result": {
369
+ "devices": [
370
+ {
371
+ "platform": "ios",
372
+ "id": "F9243BAF-62A8-4990-8A99-17F527F56FDA",
373
+ "osVersion": "iOS 26.4",
374
+ "model": "iPhone 17 Pro",
375
+ "simulator": true,
376
+ "booted": true,
377
+ "appInstallation": {
378
+ "status": "absent",
379
+ "appId": "invalid.nonexistent.issue98",
380
+ "deviceId": "F9243BAF-62A8-4990-8A99-17F527F56FDA",
381
+ "scope": "ios-simulator",
382
+ "checkedAt": "2026-11-05T20:45:48.241Z"
383
+ },
384
+ "appInstalled": false
385
+ },
386
+ {
387
+ "platform": "ios",
388
+ "id": "F72108FF-C8D6-4C1E-980E-1AE5E5CCD27B",
389
+ "osVersion": "iOS 26.4",
390
+ "model": "iPhone Air",
391
+ "simulator": true,
392
+ "booted": false,
393
+ "appInstallation": {
394
+ "status": "unknown",
395
+ "appId": "invalid.nonexistent.issue98",
396
+ "deviceId": "F72108FF-C8D6-4C1E-980E-1AE5E5CCD27B",
397
+ "scope": "ios-simulator",
398
+ "checkedAt": null,
399
+ "reason": "DEVICE_UNAVAILABLE"
400
+ }
401
+ },
402
+ {
403
+ "platform": "ios",
404
+ "id": "F00DC533-007F-4AB1-BFBD-C7E06884BE57",
405
+ "osVersion": "iOS 27.2.iPhone19.4",
406
+ "model": "iPhone Duo",
407
+ "simulator": true,
408
+ "booted": false,
409
+ "appInstallation": {
410
+ "status": "unknown",
411
+ "appId": "invalid.nonexistent.issue98",
412
+ "deviceId": "F00DC533-007F-4AB1-BFBD-C7E06884BE57",
413
+ "scope": "ios-simulator",
414
+ "checkedAt": null,
415
+ "reason": "DEVICE_UNAVAILABLE"
416
+ }
417
+ },
418
+ {
419
+ "platform": "ios",
420
+ "id": "0D4B24EB-9323-4EF0-BF27-BA11CE336EC6",
421
+ "osVersion": "iOS 27.2",
422
+ "model": "iPhone 18 Pro",
423
+ "simulator": true,
424
+ "booted": false,
425
+ "appInstallation": {
426
+ "status": "unknown",
427
+ "appId": "invalid.nonexistent.issue98",
428
+ "deviceId": "0D4B24EB-9323-4EF0-BF27-BA11CE336EC6",
429
+ "scope": "ios-simulator",
430
+ "checkedAt": null,
431
+ "reason": "DEVICE_UNAVAILABLE"
432
+ }
433
+ },
434
+ {
435
+ "platform": "ios",
436
+ "id": "F299B6B8-D62A-4FC7-99B9-8A7334279C09",
437
+ "osVersion": "iOS 27.2",
438
+ "model": "iPhone 18 Pro Max",
439
+ "simulator": true,
440
+ "booted": false,
441
+ "appInstallation": {
442
+ "status": "unknown",
443
+ "appId": "invalid.nonexistent.issue98",
444
+ "deviceId": "F299B6B8-D62A-4FC7-99B9-8A7334279C09",
445
+ "scope": "ios-simulator",
446
+ "checkedAt": null,
447
+ "reason": "DEVICE_UNAVAILABLE"
448
+ }
449
+ },
450
+ {
451
+ "platform": "ios",
452
+ "id": "A37DBE8B-AE8B-43A8-8BBB-73D1F3BF37D2",
453
+ "osVersion": "iOS 27.2",
454
+ "model": "iPhone 17e",
455
+ "simulator": true,
456
+ "booted": false,
457
+ "appInstallation": {
458
+ "status": "unknown",
459
+ "appId": "invalid.nonexistent.issue98",
460
+ "deviceId": "A37DBE8B-AE8B-43A8-8BBB-73D1F3BF37D2",
461
+ "scope": "ios-simulator",
462
+ "checkedAt": null,
463
+ "reason": "DEVICE_UNAVAILABLE"
464
+ }
465
+ },
466
+ {
467
+ "platform": "ios",
468
+ "id": "3C1CA052-BD42-4A44-BE1C-1D6BCF7B9108",
469
+ "osVersion": "iOS 27.2",
470
+ "model": "iPhone Air",
471
+ "simulator": true,
472
+ "booted": false,
473
+ "appInstallation": {
474
+ "status": "unknown",
475
+ "appId": "invalid.nonexistent.issue98",
476
+ "deviceId": "3C1CA052-BD42-4A44-BE1C-1D6BCF7B9108",
477
+ "scope": "ios-simulator",
478
+ "checkedAt": null,
479
+ "reason": "DEVICE_UNAVAILABLE"
480
+ }
481
+ },
482
+ {
483
+ "platform": "ios",
484
+ "id": "5C1C388C-8E7F-458F-B96F-38FA15721481",
485
+ "osVersion": "iOS 27.2",
486
+ "model": "iPhone 17",
487
+ "simulator": true,
488
+ "booted": false,
489
+ "appInstallation": {
490
+ "status": "unknown",
491
+ "appId": "invalid.nonexistent.issue98",
492
+ "deviceId": "5C1C388C-8E7F-458F-B96F-38FA15721481",
493
+ "scope": "ios-simulator",
494
+ "checkedAt": null,
495
+ "reason": "DEVICE_UNAVAILABLE"
496
+ }
497
+ },
498
+ {
499
+ "platform": "ios",
500
+ "id": "E7FAE6DC-7023-4EC6-B12D-4F9F92ABBF34",
501
+ "osVersion": "iOS 27.2",
502
+ "model": "iPad mini (A20 Pro)",
503
+ "simulator": true,
504
+ "booted": false,
505
+ "appInstallation": {
506
+ "status": "unknown",
507
+ "appId": "invalid.nonexistent.issue98",
508
+ "deviceId": "E7FAE6DC-7023-4EC6-B12D-4F9F92ABBF34",
509
+ "scope": "ios-simulator",
510
+ "checkedAt": null,
511
+ "reason": "DEVICE_UNAVAILABLE"
512
+ }
513
+ },
514
+ {
515
+ "platform": "ios",
516
+ "id": "6F002453-7EFB-445C-85E6-23057EEBA693",
517
+ "osVersion": "iOS 27.2",
518
+ "model": "iPad Pro 13-inch (M5)",
519
+ "simulator": true,
520
+ "booted": false,
521
+ "appInstallation": {
522
+ "status": "unknown",
523
+ "appId": "invalid.nonexistent.issue98",
524
+ "deviceId": "6F002453-7EFB-445C-85E6-23057EEBA693",
525
+ "scope": "ios-simulator",
526
+ "checkedAt": null,
527
+ "reason": "DEVICE_UNAVAILABLE"
528
+ }
529
+ },
530
+ {
531
+ "platform": "ios",
532
+ "id": "B9E62B7C-5674-4F76-8C37-5A3FDBE62957",
533
+ "osVersion": "iOS 27.2",
534
+ "model": "iPad Pro 11-inch (M5)",
535
+ "simulator": true,
536
+ "booted": false,
537
+ "appInstallation": {
538
+ "status": "unknown",
539
+ "appId": "invalid.nonexistent.issue98",
540
+ "deviceId": "B9E62B7C-5674-4F76-8C37-5A3FDBE62957",
541
+ "scope": "ios-simulator",
542
+ "checkedAt": null,
543
+ "reason": "DEVICE_UNAVAILABLE"
544
+ }
545
+ },
546
+ {
547
+ "platform": "ios",
548
+ "id": "5D6B5F36-F005-4AD9-A96E-19C629689392",
549
+ "osVersion": "iOS 27.2",
550
+ "model": "iPad Air 13-inch (M4)",
551
+ "simulator": true,
552
+ "booted": false,
553
+ "appInstallation": {
554
+ "status": "unknown",
555
+ "appId": "invalid.nonexistent.issue98",
556
+ "deviceId": "5D6B5F36-F005-4AD9-A96E-19C629689392",
557
+ "scope": "ios-simulator",
558
+ "checkedAt": null,
559
+ "reason": "DEVICE_UNAVAILABLE"
560
+ }
561
+ },
562
+ {
563
+ "platform": "ios",
564
+ "id": "415269D0-3612-4592-A374-F2C6A60007C6",
565
+ "osVersion": "iOS 27.2",
566
+ "model": "iPad Air 11-inch (M4)",
567
+ "simulator": true,
568
+ "booted": false,
569
+ "appInstallation": {
570
+ "status": "unknown",
571
+ "appId": "invalid.nonexistent.issue98",
572
+ "deviceId": "415269D0-3612-4592-A374-F2C6A60007C6",
573
+ "scope": "ios-simulator",
574
+ "checkedAt": null,
575
+ "reason": "DEVICE_UNAVAILABLE"
576
+ }
577
+ },
578
+ {
579
+ "platform": "ios",
580
+ "id": "097E95D6-E121-48E1-B6CB-47E8D58892D7",
581
+ "osVersion": "iOS 27.2",
582
+ "model": "iPad (A16)",
583
+ "simulator": true,
584
+ "booted": false,
585
+ "appInstallation": {
586
+ "status": "unknown",
587
+ "appId": "invalid.nonexistent.issue98",
588
+ "deviceId": "097E95D6-E121-48E1-B6CB-47E8D58892D7",
589
+ "scope": "ios-simulator",
590
+ "checkedAt": null,
591
+ "reason": "DEVICE_UNAVAILABLE"
592
+ }
593
+ }
594
+ ]
595
+ }
596
+ },
597
+ {
598
+ "tool": "get_system_status",
599
+ "result": {
600
+ "appInstallations": [
601
+ {
602
+ "status": "installed",
603
+ "appId": "com.ideamechanics.modul8.dev",
604
+ "deviceId": "adb-51181FDAP0031Y-gxy7FO._adb-tls-connect._tcp",
605
+ "scope": "android-current-user",
606
+ "checkedAt": "2026-11-05T20:45:48.680Z"
607
+ },
608
+ {
609
+ "status": "installed",
610
+ "appId": "com.ideamechanics.modul8.dev",
611
+ "deviceId": "emulator-5554",
612
+ "scope": "android-current-user",
613
+ "checkedAt": "2026-11-05T20:45:48.627Z"
614
+ }
615
+ ]
616
+ }
617
+ }
618
+ ],
619
+ "baseline": {
620
+ "source": "git show HEAD:src/utils/android/utils.ts; temporary module removed after execution",
621
+ "devices": [
622
+ {
623
+ "platform": "android",
624
+ "id": "adb-51181FDAP0031Y-gxy7FO._adb-tls-connect._tcp",
625
+ "osVersion": "17",
626
+ "model": "Pixel 9 Pro",
627
+ "simulator": false,
628
+ "appInstalled": false
629
+ },
630
+ {
631
+ "platform": "android",
632
+ "id": "emulator-5554",
633
+ "osVersion": "16",
634
+ "model": "sdk_gphone64_arm64",
635
+ "simulator": true,
636
+ "appInstalled": false
637
+ }
638
+ ],
639
+ "installedRunningObservation": {
640
+ "deviceId": "emulator-5554",
641
+ "appId": "com.ideamechanics.modul8.dev",
642
+ "pid": 4064,
643
+ "note": "Read with adb shell pidof before the device suite; confirms a process, not foreground visibility."
644
+ }
645
+ },
646
+ "cleanup": "Booted simulator restored to Shutdown after device suite. Device suite leaves Settings foreground; no app data or device security settings changed.",
647
+ "limits": "Original reported agent request is unavailable; reproduced the missing-app-context failure path. Native CHECK_FAILED/timeout paths covered with fake tooling; physical iOS installation unsupported.",
648
+ "buildArtifacts": {
649
+ "dist/server.js": "0b6c1b9f070bf3fe00fe149ac0cf3128740304b1671ca7a8e4579e3f74966104",
650
+ "dist/utils/app-installation.js": "b45fbf770da706e4f2052c61caee29770e3e85fcff2eacf0607ab8ef5fb62b13",
651
+ "dist/utils/resolve-device.js": "90d1fe581cb165d9412572b1918954010b380b82c931670e37c6862960a6d841"
652
+ },
653
+ "assertions": "PASS: expected per-device statuses, identities, legacy boolean omission and multiple-device system aggregation checked against final MCP results."
654
+ }