mobile-debug-mcp 0.33.0 → 0.35.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 (448) hide show
  1. package/.agents/skills/mcp-builder/SKILL.md +44 -64
  2. package/.agents/skills/mcp-builder/references/build-flags.md +44 -43
  3. package/.agents/skills/mcp-builder/references/diagnostics-schema.md +4 -1
  4. package/.agents/skills/mcp-builder/references/toolchain-details.md +49 -62
  5. package/.agents/skills/spec-review/references/spec-review-checklist.md +7 -0
  6. package/.agents/skills/test-authoring/SKILL.md +7 -6
  7. package/.agents/skills/test-authoring/references/repo-test-layout.md +3 -1
  8. package/.agents/skills/test-authoring/references/test-authoring-workflow.md +16 -7
  9. package/.agents/skills/test-authoring/references/test-quality-checklist.md +2 -1
  10. package/.github/copilot-instructions.md +14 -36
  11. package/.github/workflows/ci.yml +23 -2
  12. package/AGENTS.md +12 -3
  13. package/CONTRIBUTING.md +79 -0
  14. package/README.md +158 -124
  15. package/agent-plugin/.claude-plugin/plugin.json +2 -2
  16. package/agent-plugin/.codex-plugin/plugin.json +1 -1
  17. package/agent-plugin/.cursor-plugin/plugin.json +2 -2
  18. package/agent-plugin/.mcp.json +1 -1
  19. package/agent-plugin/README.md +20 -6
  20. package/agent-plugin/mcp.json +1 -1
  21. package/agent-plugin/plugin.json +1 -1
  22. package/agent-plugin/skills/mobile-debug-mcp/SKILL.md +113 -4
  23. package/dist/contracts/execution-controls.js +24 -0
  24. package/dist/contracts/selector.js +8 -0
  25. package/dist/contracts/target.js +15 -0
  26. package/dist/contracts/ui.js +1 -0
  27. package/dist/debugger/android.js +79 -0
  28. package/dist/debugger/diagnostics.js +54 -0
  29. package/dist/debugger/guard.js +30 -0
  30. package/dist/debugger/protocol.js +33 -0
  31. package/dist/debugger/sessions.js +304 -0
  32. package/dist/debugger/worker.js +176 -0
  33. package/dist/interact/adjustment/adjustment-context.js +41 -0
  34. package/dist/interact/adjustment/adjustment-gestures.js +55 -0
  35. package/dist/interact/adjustment/adjustment-plan.js +18 -0
  36. package/dist/interact/adjustment/adjustment-resolution.js +127 -0
  37. package/dist/interact/adjustment/adjustment-result.js +19 -0
  38. package/dist/interact/adjustment/adjustment-semantic.js +64 -0
  39. package/dist/interact/adjustment/adjustment-verification.js +35 -0
  40. package/dist/interact/adjustment/adjustment.js +52 -0
  41. package/dist/interact/adjustment/control-geometry.js +87 -0
  42. package/dist/interact/adjustment/control-values.js +136 -0
  43. package/dist/interact/adjustment/slider-labels.js +84 -0
  44. package/dist/interact/assertions/screen-assertion.js +37 -0
  45. package/dist/interact/assertions/state-assertion-context.js +35 -0
  46. package/dist/interact/assertions/state-assertion.js +76 -0
  47. package/dist/interact/assertions/state-comparison.js +141 -0
  48. package/dist/interact/assertions/visibility-assertion.js +34 -0
  49. package/dist/interact/conditional-action.js +12 -7
  50. package/dist/interact/index.js +65 -3074
  51. package/dist/interact/input-service.js +1 -0
  52. package/dist/interact/interaction-trace.js +21 -0
  53. package/dist/interact/model.js +1 -0
  54. package/dist/interact/observation.js +1 -0
  55. package/dist/interact/targeting/candidate-ancestor.js +58 -0
  56. package/dist/interact/targeting/candidate-result.js +23 -0
  57. package/dist/interact/targeting/candidate-scoring.js +50 -0
  58. package/dist/interact/targeting/element-helpers.js +216 -0
  59. package/dist/interact/targeting/find-element.js +65 -0
  60. package/dist/interact/targeting/nearby-control.js +56 -0
  61. package/dist/interact/targeting/resolved-elements.js +21 -0
  62. package/dist/interact/targeting/tap-target.js +17 -0
  63. package/dist/interact/targeting/target-scope.js +104 -0
  64. package/dist/interact/waits/legacy-log-wait.js +38 -0
  65. package/dist/interact/waits/legacy-wait-observations.js +103 -0
  66. package/dist/interact/waits/legacy-wait-state.js +34 -0
  67. package/dist/interact/waits/legacy-wait.js +48 -0
  68. package/dist/interact/waits/screen-wait.js +49 -0
  69. package/dist/interact/waits/ui-change-helpers.js +157 -0
  70. package/dist/interact/waits/ui-change-state.js +18 -0
  71. package/dist/interact/waits/ui-change-wait.js +77 -0
  72. package/dist/interact/waits/ui-wait-condition.js +56 -0
  73. package/dist/interact/waits/ui-wait-state.js +38 -0
  74. package/dist/interact/waits/ui-wait.js +106 -0
  75. package/dist/manage/android.js +55 -51
  76. package/dist/manage/index.js +38 -75
  77. package/dist/manage/ios/build-types.js +1 -0
  78. package/dist/manage/ios/build.js +210 -0
  79. package/dist/manage/ios/project-discovery.js +29 -0
  80. package/dist/manage/ios/scheme.js +18 -0
  81. package/dist/manage/ios.js +42 -256
  82. package/dist/observe/android/context.js +1 -0
  83. package/dist/observe/android/current-screen.js +55 -0
  84. package/dist/observe/android/fingerprint.js +13 -0
  85. package/dist/observe/android/log-stream.js +132 -0
  86. package/dist/observe/android/logs.js +107 -0
  87. package/dist/observe/android/screenshot.js +70 -0
  88. package/dist/observe/android/ui-tree.js +107 -0
  89. package/dist/observe/android.js +16 -520
  90. package/dist/observe/evidence.js +122 -76
  91. package/dist/observe/index.js +16 -263
  92. package/dist/observe/ios/context.js +16 -0
  93. package/dist/observe/ios/fingerprint.js +12 -0
  94. package/dist/observe/ios/log-stream.js +105 -0
  95. package/dist/observe/ios/logs.js +168 -0
  96. package/dist/observe/ios/screenshot.js +22 -0
  97. package/dist/observe/ios/ui-elements.js +241 -0
  98. package/dist/observe/ios/ui-tree.js +137 -0
  99. package/dist/observe/ios.js +17 -715
  100. package/dist/observe/logs/model.js +1 -0
  101. package/dist/{network → observe/network}/index.js +2 -2
  102. package/dist/observe/readiness-service.js +13 -2
  103. package/dist/observe/readiness.js +44 -18
  104. package/dist/observe/screenshot-encoding.js +41 -0
  105. package/dist/observe/snapshot-collection.js +79 -0
  106. package/dist/observe/snapshot-logs.js +30 -0
  107. package/dist/observe/snapshot-metadata.js +43 -31
  108. package/dist/observe/snapshot-semantic.js +115 -0
  109. package/dist/observe/system-trace-android.js +135 -0
  110. package/dist/observe/system-trace.js +294 -0
  111. package/dist/runtime/action-results.js +270 -0
  112. package/dist/runtime/clock.js +4 -0
  113. package/dist/server/common.js +1 -256
  114. package/dist/server/definitions/assert.js +162 -0
  115. package/dist/server/definitions/diagnostic.js +118 -0
  116. package/dist/server/definitions/input.js +274 -0
  117. package/dist/server/definitions/manage.js +194 -0
  118. package/dist/server/definitions/observe.js +149 -0
  119. package/dist/server/definitions/target.js +138 -0
  120. package/dist/server/definitions/wait.js +105 -0
  121. package/dist/server/handlers/action-execution.js +163 -0
  122. package/dist/server/handlers/correlation.js +23 -0
  123. package/dist/server/handlers/debugger-handlers.js +48 -0
  124. package/dist/server/handlers/debugger-response.js +9 -0
  125. package/dist/server/handlers/diagnostic.js +69 -0
  126. package/dist/server/handlers/handler-types.js +1 -0
  127. package/dist/server/handlers/input.js +154 -0
  128. package/dist/server/handlers/interact.js +113 -0
  129. package/dist/server/handlers/journey-assertions.js +35 -0
  130. package/dist/server/handlers/journey.js +147 -0
  131. package/dist/server/handlers/manage.js +119 -0
  132. package/dist/server/handlers/observe.js +95 -0
  133. package/dist/server/handlers/payload.js +4 -0
  134. package/dist/server/handlers/tool-handlers.js +160 -0
  135. package/dist/server/schemas/condition-schema.js +2 -0
  136. package/dist/server/schemas/debugger-schema.js +47 -0
  137. package/dist/server/{journey-schema.js → schemas/journey-schema.js} +8 -22
  138. package/dist/server/schemas/system-trace-schema.js +17 -0
  139. package/dist/server/tool-definitions.js +62 -1134
  140. package/dist/server-core.js +4 -4
  141. package/dist/server.js +34 -0
  142. package/dist/system/android-status.js +101 -0
  143. package/dist/system/android.js +37 -27
  144. package/dist/system/index.js +13 -438
  145. package/dist/system/ios-status.js +132 -0
  146. package/dist/system/ios.js +11 -8
  147. package/dist/system/model.js +1 -0
  148. package/dist/system/probes.js +105 -0
  149. package/dist/system/status-summary.js +43 -0
  150. package/dist/system/unsupported-status.js +52 -0
  151. package/dist/utils/android/commands.js +89 -0
  152. package/dist/utils/android/gradle.js +139 -0
  153. package/dist/utils/android/logs.js +103 -0
  154. package/dist/utils/android/ui-tree.js +233 -0
  155. package/dist/utils/android/utils.js +6 -564
  156. package/dist/utils/cli/idb/idb-helper.js +4 -6
  157. package/dist/utils/cli/idb/install-idb.js +13 -9
  158. package/dist/utils/cli/ios/preflight-ios.js +42 -38
  159. package/dist/utils/exec.js +2 -0
  160. package/dist/utils/ios/utils.js +45 -46
  161. package/dist/utils/java.js +75 -57
  162. package/dist/utils/operation-budget.js +2 -0
  163. package/dist/utils/resolve-device.js +6 -2
  164. package/dist/utils/ui/index.js +26 -26
  165. package/docs/CHANGELOG.md +48 -0
  166. package/docs/README.md +38 -0
  167. package/docs/benchmarks/README.md +18 -0
  168. package/docs/benchmarks/interaction-latency/README.md +14 -0
  169. package/docs/benchmarks/interaction-latency/final.md +4 -1
  170. package/docs/benchmarks/interaction-latency/ios-validation.md +2 -0
  171. package/docs/benchmarks/ui-tree-performance/README.md +24 -16
  172. package/docs/benchmarks/ui-tree-performance/comparison.md +11 -10
  173. package/docs/code-structure.md +118 -0
  174. package/docs/specs/001-state-verification/spec.md +16 -14
  175. package/docs/specs/002-richer-element-identity/spec.md +12 -10
  176. package/docs/specs/003-wait-and-synchronization-reliability/spec.md +12 -10
  177. package/docs/specs/004-action-verification-routing/spec.md +3 -3
  178. package/docs/specs/005-unified-action-execution-and-verification-model/spec.md +2 -0
  179. package/docs/specs/006-runtime-action-instrumentation-and-binding-layer/spec.md +2 -0
  180. package/docs/specs/007-actionability-resolution-and-executable-target-selection/spec.md +3 -1
  181. package/docs/specs/008-adjustable-control-support-and-semantic-value-manipulation/spec.md +3 -4
  182. package/docs/specs/009-semantic-control-modeling-for-custom-and-composite-controls/spec.md +2 -0
  183. package/docs/specs/010-verification-stabilization-and-temporal-convergence/spec.md +2 -2
  184. package/docs/specs/011-recovery-and-replanning-for-failed-or-ambiguous-interaction-flows/spec.md +2 -2
  185. package/docs/specs/011.1-recovery-contract-types-and-runtime-wiring-spec/spec.md +2 -0
  186. package/docs/specs/012-action-trace-and-xecution-observability/spec.md +2 -3
  187. package/docs/specs/013-wait-and-synchronization-reliability/spec.md +19 -19
  188. package/docs/specs/014-actionability-resolution/spec.md +20 -18
  189. package/docs/specs/015-adjustable-control-support/spec.md +17 -15
  190. package/docs/specs/016-environment-tools/spec.md +20 -20
  191. package/docs/specs/018-interaction-latency-and-batched-journeys/spec.md +2 -0
  192. package/docs/specs/019-ui-tree-observation-performance/spec.md +3 -1
  193. package/docs/specs/020-conditional-actions/intent.md +5 -3
  194. package/docs/specs/020-conditional-actions/plan.md +8 -9
  195. package/docs/specs/020-conditional-actions/spec.md +4 -2
  196. package/docs/specs/021-app-readiness-signals/intent.md +4 -2
  197. package/docs/specs/021-app-readiness-signals/plan.md +7 -6
  198. package/docs/specs/021-app-readiness-signals/spec.md +3 -1
  199. package/docs/specs/022-correlated-evidence/intent.md +4 -4
  200. package/docs/specs/022-correlated-evidence/plan.md +10 -11
  201. package/docs/specs/022-correlated-evidence/spec.md +3 -1
  202. package/docs/specs/023-android-system-traces/device-evidence.json +38 -0
  203. package/docs/specs/023-android-system-traces/emulator-recheck.json +38 -0
  204. package/docs/specs/023-android-system-traces/intent.md +41 -0
  205. package/docs/specs/023-android-system-traces/plan.md +115 -0
  206. package/docs/specs/023-android-system-traces/spec.md +122 -0
  207. package/docs/specs/024-android-heap-dump-capture/intent.md +41 -0
  208. package/docs/specs/025-android-runtime-debugger/intent.md +41 -0
  209. package/docs/specs/025-android-runtime-debugger/plan.md +106 -0
  210. package/docs/specs/025-android-runtime-debugger/spec.md +183 -0
  211. package/docs/specs/026-code-structure-and-quality-gates/health-plan.md +88 -0
  212. package/docs/specs/026-code-structure-and-quality-gates/intent.md +47 -0
  213. package/docs/specs/026-code-structure-and-quality-gates/plan.md +191 -0
  214. package/docs/specs/026-code-structure-and-quality-gates/spec.md +138 -0
  215. package/docs/specs/026-code-structure-and-quality-gates/verification-final.json +200 -0
  216. package/docs/specs/026-code-structure-and-quality-gates/verification-thin-facade.json +154 -0
  217. package/docs/specs/026-code-structure-and-quality-gates/verification.json +136 -0
  218. package/docs/specs/027-debugger-failure-diagnostics/intent.md +43 -0
  219. package/docs/specs/027-debugger-failure-diagnostics/plan.md +86 -0
  220. package/docs/specs/027-debugger-failure-diagnostics/spec.md +133 -0
  221. package/docs/specs/028-compact-debugger-responses/intent.md +41 -0
  222. package/docs/specs/028-compact-debugger-responses/plan.md +112 -0
  223. package/docs/specs/028-compact-debugger-responses/spec.md +108 -0
  224. package/docs/specs/029-kotlin-locals-validation/report.md +119 -0
  225. package/docs/specs/030-android-coroutine-validation/evidence.json +475 -0
  226. package/docs/specs/030-android-coroutine-validation/intent.md +47 -0
  227. package/docs/specs/030-android-coroutine-validation/plan.md +147 -0
  228. package/docs/specs/030-android-coroutine-validation/report.md +240 -0
  229. package/docs/specs/030-android-coroutine-validation/spec.md +107 -0
  230. package/docs/tools/TOOLS.md +31 -16
  231. package/docs/tools/{evidence.md → correlated-evidence.md} +14 -3
  232. package/docs/tools/debugger.md +180 -0
  233. package/docs/tools/interact.md +42 -20
  234. package/docs/tools/manage.md +25 -44
  235. package/docs/tools/observe.md +64 -25
  236. package/docs/tools/system-traces.md +134 -0
  237. package/docs/tools/system.md +12 -5
  238. package/package.json +11 -8
  239. package/scripts/architecture-graph.mjs +69 -0
  240. package/scripts/check-architecture.mjs +47 -0
  241. package/scripts/code-quality-baseline.json +1 -0
  242. package/scripts/code-quality.mjs +161 -0
  243. package/src/contracts/execution-controls.ts +26 -0
  244. package/src/contracts/selector.ts +17 -0
  245. package/src/contracts/target.ts +19 -0
  246. package/src/contracts/ui.ts +94 -0
  247. package/src/debugger/android.ts +66 -0
  248. package/src/debugger/diagnostics.ts +43 -0
  249. package/src/debugger/guard.ts +31 -0
  250. package/src/debugger/java/DebuggerWorker.java +166 -0
  251. package/src/debugger/protocol.ts +37 -0
  252. package/src/debugger/sessions.ts +327 -0
  253. package/src/debugger/worker.ts +135 -0
  254. package/src/interact/adjustment/adjustment-context.ts +83 -0
  255. package/src/interact/adjustment/adjustment-gestures.ts +48 -0
  256. package/src/interact/adjustment/adjustment-plan.ts +23 -0
  257. package/src/interact/adjustment/adjustment-resolution.ts +104 -0
  258. package/src/interact/adjustment/adjustment-result.ts +34 -0
  259. package/src/interact/adjustment/adjustment-semantic.ts +53 -0
  260. package/src/interact/adjustment/adjustment-verification.ts +60 -0
  261. package/src/interact/adjustment/adjustment.ts +49 -0
  262. package/src/interact/adjustment/control-geometry.ts +120 -0
  263. package/src/interact/adjustment/control-values.ts +141 -0
  264. package/src/interact/adjustment/slider-labels.ts +84 -0
  265. package/src/interact/assertions/screen-assertion.ts +39 -0
  266. package/src/interact/assertions/state-assertion-context.ts +48 -0
  267. package/src/interact/assertions/state-assertion.ts +64 -0
  268. package/src/interact/assertions/state-comparison.ts +168 -0
  269. package/src/interact/assertions/visibility-assertion.ts +41 -0
  270. package/src/interact/conditional-action.ts +18 -12
  271. package/src/interact/index.ts +76 -3491
  272. package/src/interact/input-service.ts +11 -0
  273. package/src/interact/interaction-trace.ts +36 -0
  274. package/src/interact/model.ts +109 -0
  275. package/src/interact/observation.ts +7 -0
  276. package/src/interact/targeting/candidate-ancestor.ts +49 -0
  277. package/src/interact/targeting/candidate-result.ts +24 -0
  278. package/src/interact/targeting/candidate-scoring.ts +42 -0
  279. package/src/interact/targeting/element-helpers.ts +243 -0
  280. package/src/interact/targeting/find-element.ts +47 -0
  281. package/src/interact/targeting/nearby-control.ts +46 -0
  282. package/src/interact/targeting/resolved-elements.ts +20 -0
  283. package/src/interact/targeting/tap-target.ts +22 -0
  284. package/src/interact/targeting/target-scope.ts +121 -0
  285. package/src/interact/waits/legacy-log-wait.ts +30 -0
  286. package/src/interact/waits/legacy-wait-observations.ts +55 -0
  287. package/src/interact/waits/legacy-wait-state.ts +48 -0
  288. package/src/interact/waits/legacy-wait.ts +34 -0
  289. package/src/interact/waits/screen-wait.ts +37 -0
  290. package/src/interact/waits/ui-change-helpers.ts +184 -0
  291. package/src/interact/waits/ui-change-state.ts +26 -0
  292. package/src/interact/waits/ui-change-wait.ts +59 -0
  293. package/src/interact/waits/ui-wait-condition.ts +52 -0
  294. package/src/interact/waits/ui-wait-state.ts +55 -0
  295. package/src/interact/waits/ui-wait.ts +84 -0
  296. package/src/manage/android.ts +56 -50
  297. package/src/manage/index.ts +63 -93
  298. package/src/manage/ios/build-types.ts +14 -0
  299. package/src/manage/ios/build.ts +230 -0
  300. package/src/manage/ios/project-discovery.ts +26 -0
  301. package/src/manage/ios/scheme.ts +16 -0
  302. package/src/manage/ios.ts +65 -298
  303. package/src/observe/android/context.ts +1 -0
  304. package/src/observe/android/current-screen.ts +63 -0
  305. package/src/observe/android/fingerprint.ts +13 -0
  306. package/src/observe/android/log-stream.ts +127 -0
  307. package/src/observe/android/logs.ts +110 -0
  308. package/src/observe/android/screenshot.ts +79 -0
  309. package/src/observe/android/ui-tree.ts +113 -0
  310. package/src/observe/android.ts +17 -531
  311. package/src/observe/evidence.ts +130 -71
  312. package/src/observe/index.ts +24 -286
  313. package/src/observe/ios/context.ts +22 -0
  314. package/src/observe/ios/fingerprint.ts +12 -0
  315. package/src/observe/ios/log-stream.ts +103 -0
  316. package/src/observe/ios/logs.ts +179 -0
  317. package/src/observe/ios/screenshot.ts +26 -0
  318. package/src/observe/ios/ui-elements.ts +266 -0
  319. package/src/observe/ios/ui-tree.ts +143 -0
  320. package/src/observe/ios.ts +18 -749
  321. package/src/observe/logs/model.ts +11 -0
  322. package/src/{network → observe/network}/index.ts +2 -2
  323. package/src/observe/readiness-service.ts +10 -3
  324. package/src/observe/readiness.ts +49 -22
  325. package/src/observe/screenshot-encoding.ts +32 -0
  326. package/src/observe/snapshot-collection.ts +69 -0
  327. package/src/observe/snapshot-logs.ts +26 -0
  328. package/src/observe/snapshot-metadata.ts +51 -31
  329. package/src/observe/snapshot-semantic.ts +153 -0
  330. package/src/observe/system-trace-android.ts +133 -0
  331. package/src/observe/system-trace.ts +227 -0
  332. package/src/runtime/action-results.ts +376 -0
  333. package/src/runtime/clock.ts +9 -0
  334. package/src/server/common.ts +9 -359
  335. package/src/server/definitions/assert.ts +164 -0
  336. package/src/server/definitions/diagnostic.ts +120 -0
  337. package/src/server/definitions/input.ts +276 -0
  338. package/src/server/definitions/manage.ts +196 -0
  339. package/src/server/definitions/observe.ts +151 -0
  340. package/src/server/definitions/target.ts +140 -0
  341. package/src/server/definitions/wait.ts +107 -0
  342. package/src/server/handlers/action-execution.ts +164 -0
  343. package/src/server/handlers/correlation.ts +20 -0
  344. package/src/server/handlers/debugger-handlers.ts +39 -0
  345. package/src/server/handlers/debugger-response.ts +7 -0
  346. package/src/server/handlers/diagnostic.ts +79 -0
  347. package/src/server/handlers/handler-types.ts +7 -0
  348. package/src/server/handlers/input.ts +173 -0
  349. package/src/server/handlers/interact.ts +135 -0
  350. package/src/server/handlers/journey-assertions.ts +39 -0
  351. package/src/server/handlers/journey.ts +132 -0
  352. package/src/server/handlers/manage.ts +141 -0
  353. package/src/server/handlers/observe.ts +116 -0
  354. package/src/server/handlers/payload.ts +36 -0
  355. package/src/server/handlers/tool-handlers.ts +159 -0
  356. package/src/server/schemas/condition-schema.ts +2 -0
  357. package/src/server/schemas/debugger-schema.ts +43 -0
  358. package/src/server/{journey-schema.ts → schemas/journey-schema.ts} +8 -22
  359. package/src/server/schemas/system-trace-schema.ts +17 -0
  360. package/src/server/tool-definitions.ts +69 -1140
  361. package/src/server-core.ts +4 -4
  362. package/src/server.ts +25 -1
  363. package/src/system/android-status.ts +124 -0
  364. package/src/system/android.ts +33 -21
  365. package/src/system/index.ts +21 -523
  366. package/src/system/ios-status.ts +147 -0
  367. package/src/system/ios.ts +14 -10
  368. package/src/system/model.ts +41 -0
  369. package/src/system/probes.ts +114 -0
  370. package/src/system/status-summary.ts +47 -0
  371. package/src/system/unsupported-status.ts +55 -0
  372. package/src/types.ts +16 -106
  373. package/src/utils/android/commands.ts +81 -0
  374. package/src/utils/android/gradle.ts +132 -0
  375. package/src/utils/android/logs.ts +103 -0
  376. package/src/utils/android/ui-tree.ts +239 -0
  377. package/src/utils/android/utils.ts +16 -556
  378. package/src/utils/cli/idb/check-idb.ts +4 -4
  379. package/src/utils/cli/idb/idb-helper.ts +6 -8
  380. package/src/utils/cli/idb/install-idb.ts +15 -9
  381. package/src/utils/cli/ios/preflight-ios.ts +39 -31
  382. package/src/utils/cli/ios/run-ios-ui-tree-tap.ts +4 -4
  383. package/src/utils/exec.ts +2 -0
  384. package/src/utils/ios/utils.ts +57 -61
  385. package/src/utils/java.ts +71 -51
  386. package/src/utils/operation-budget.ts +2 -0
  387. package/src/utils/resolve-device.ts +11 -6
  388. package/src/utils/ui/index.ts +28 -28
  389. package/test/device/automated/debugger/coroutine-lifecycle.ts +27 -0
  390. package/test/device/automated/debugger/coroutine-support.ts +140 -0
  391. package/test/device/automated/debugger/coroutine.android.test.ts +169 -0
  392. package/test/device/automated/debugger/kotlin.android.test.ts +127 -0
  393. package/test/device/automated/debugger/runtime.android.test.ts +219 -0
  394. package/test/device/automated/interact/interaction.android.test.ts +56 -0
  395. package/test/device/automated/observe/system-trace.smoke.ts +104 -0
  396. package/test/device/manual/interact/modul8_selector_tap.manual.ts +1 -1
  397. package/test/fixtures/contracts/tool-definitions.json +3536 -0
  398. package/test/fixtures/coroutine-app/MainActivity.kt +100 -0
  399. package/test/fixtures/coroutine-app/README.md +48 -0
  400. package/test/fixtures/coroutine-app/build.ts +35 -0
  401. package/test/fixtures/debugger-app/MainActivity.java +67 -0
  402. package/test/fixtures/debugger-app/MainActivity.kt +32 -0
  403. package/test/fixtures/debugger-app/NoLocals.java +7 -0
  404. package/test/fixtures/debugger-app/README.md +65 -0
  405. package/test/fixtures/debugger-app/build.ts +39 -0
  406. package/test/fixtures/latency-journey-app/README.md +2 -0
  407. package/test/fixtures/readiness-app/README.md +2 -0
  408. package/test/helpers/perfetto.ts +59 -0
  409. package/test/unit/debugger/coroutine-lifecycle.test.ts +43 -0
  410. package/test/unit/debugger/diagnostic-sessions.test.ts +67 -0
  411. package/test/unit/debugger/diagnostics.test.ts +80 -0
  412. package/test/unit/debugger/guards.test.ts +50 -0
  413. package/test/unit/debugger/native.test.ts +33 -0
  414. package/test/unit/debugger/preparation.test.ts +32 -0
  415. package/test/unit/debugger/protocol.test.ts +15 -0
  416. package/test/unit/debugger/sessions.test.ts +83 -0
  417. package/test/unit/interact/adjustment_service.test.ts +42 -0
  418. package/test/unit/interact/adjustment_verification.test.ts +35 -0
  419. package/test/unit/interact/clock_dependencies.test.ts +63 -0
  420. package/test/unit/interact/element_helpers.test.ts +19 -0
  421. package/test/unit/interact/legacy_wait_service.test.ts +17 -0
  422. package/test/unit/interact/state_comparison.test.ts +20 -0
  423. package/test/unit/interact/target_scope.test.ts +35 -0
  424. package/test/unit/network/get_network_activity.test.ts +1 -1
  425. package/test/unit/observe/readiness.test.ts +3 -1
  426. package/test/unit/observe/screenshot-encoding.test.ts +30 -0
  427. package/test/unit/observe/snapshot-logs.test.ts +14 -0
  428. package/test/unit/observe/system-trace-android.test.ts +52 -0
  429. package/test/unit/observe/system-trace.test.ts +166 -0
  430. package/test/unit/quality/architecture.test.ts +60 -0
  431. package/test/unit/quality/code-quality.test.ts +58 -0
  432. package/test/unit/quality/interaction_boundaries.test.ts +24 -0
  433. package/test/unit/server/conditional_actions.test.ts +1 -1
  434. package/test/unit/server/conditional_schema.test.ts +2 -2
  435. package/test/unit/server/debugger-response.test.ts +63 -0
  436. package/test/unit/server/system-trace.test.ts +64 -0
  437. package/test/unit/server/tool_definitions_parity.test.ts +8 -0
  438. package/dist/server/tool-handlers.js +0 -893
  439. package/docs/ROADMAP.md +0 -646
  440. package/docs/benchmarks/ui-tree-performance/bridge-probe.json +0 -29
  441. package/docs/benchmarks/ui-tree-performance/initial-baseline.json +0 -59560
  442. package/docs/specs/baseline-spec-v0.md +0 -312
  443. package/docs/specs/mcp-tooling-spec-v1.md +0 -446
  444. package/src/server/tool-handlers.ts +0 -923
  445. /package/dist/{server/condition-schema.js → contracts/condition.js} +0 -0
  446. /package/dist/server/{readiness-schema.js → schemas/readiness-schema.js} +0 -0
  447. /package/src/{server/condition-schema.ts → contracts/condition.ts} +0 -0
  448. /package/src/server/{readiness-schema.ts → schemas/readiness-schema.ts} +0 -0
@@ -1,23 +1,23 @@
1
- # Interact (UI actions, waits, and verification)
1
+ # Interaction
2
2
 
3
- This document covers deterministic UI resolution, actions, waits, and outcome verification.
3
+ [Documentation](../README.md) · [Tool reference](TOOLS.md)
4
4
 
5
- ## Verification pattern
5
+ Use these tools to select UI targets, perform actions, wait for transitions, and
6
+ verify the resulting state. See [interaction principles](TOOLS.md#interaction-principles)
7
+ for the distinction between execution, synchronization, and verification.
6
8
 
7
- For mutation actions, the intended agent loop is:
9
+ ## On this page
8
10
 
9
- **RESOLVE -> ACT -> WAIT (if needed) -> EXPECT**
11
+ - Find a target: [find_element](#find_element), [wait_for_ui](#wait_for_ui).
12
+ - Act on it: [basic input](#tap--swipe--type_text--press_back), [tap_element](#tap_element), [scroll_to_element](#scroll_to_element), [adjust_control](#adjust_control).
13
+ - Wait for change: [screen changes](#wait_for_screen_change), [UI changes](#wait_for_ui_change), [readiness-aware waits](#readiness-aware-waits).
14
+ - Verify the outcome: [screen](#expect_screen), [visible element](#expect_element_visible), [control state](#expect_state).
15
+ - Control execution: [conditional actions](#conditional-actions), [verification modes and journeys](#interaction-execution-controls-rfc-018).
16
+ - Investigate failures: [outcome classification and network activity](#classify_action_outcome--get_network_activity), [evidence correlation](correlated-evidence.md).
10
17
 
11
- Role split:
12
-
13
- - `wait_for_*` = resolution and synchronization
14
- - `expect_*` = final outcome verification
15
-
16
- Important:
17
-
18
- - `wait_for_*` tools must not be used as the final verification of action success when an applicable `expect_*` tool exists.
19
- - action tools report execution success, not outcome correctness.
20
- - `classify_action_outcome` should receive the runtime `action_type` when you want routing to distinguish local-state and side-effect actions.
18
+ When classifying a result, pass the runtime `action_type` to
19
+ `classify_action_outcome` so local-state changes and backend side effects can be
20
+ distinguished.
21
21
 
22
22
  ## Conditional actions
23
23
 
@@ -125,7 +125,7 @@ Example response:
125
125
  "target": { "selector": { "x": 100, "y": 200 }, "resolved": null },
126
126
  "success": true,
127
127
  "trace": {
128
- "action_id": "tap_element_1710000000002_3",
128
+ "action_id": "tap_1710000000000_1",
129
129
  "steps": [
130
130
  {
131
131
  "stage": "resolve",
@@ -292,6 +292,8 @@ Notes:
292
292
  - initial support is for slider-like controls that expose `value_range` or readable numeric value state
293
293
  - `expect_state` is the verification surface used to read back the resulting value
294
294
  - direct target placement is preferred; drag fallback is treated as degraded mode
295
+ - `maxAttempts` defaults to 5; omitted tolerance is 0 for discrete controls, or
296
+ the larger of half a step and 1% of the range for continuous controls
295
297
  - the tool returns `target_state`, `actual_state`, `within_tolerance`, `converged`, `attempts`, and `adjustment_mode`
296
298
 
297
299
  Input example:
@@ -458,7 +460,10 @@ Notes:
458
460
 
459
461
  ## tap_element
460
462
 
461
- Tap a previously resolved UI element using its `elementId`.
463
+ Tap a previously resolved `elementId`, or provide a `selector` to resolve and tap
464
+ in one call. Supply exactly one of these targets. Selector calls can use
465
+ `waitFor`; handle-based calls cannot. See [execution controls](#interaction-execution-controls-rfc-018)
466
+ for lookup budgets and selector options.
462
467
 
463
468
  Input:
464
469
 
@@ -734,8 +739,25 @@ the journey; remaining steps report `not_run`. Journey responses default to comp
734
739
  `defaults` supplies execution controls; step verification overrides the default.
735
740
  `captureOnFailure: true` includes a screenshot-free failure snapshot in debug mode.
736
741
 
737
- See [RFC 018](../specs/018-interaction-latency-and-batched-journeys/spec.md) for
738
- contracts and the device acceptance criteria.
742
+ Example `run_journey` request:
743
+
744
+ ```json
745
+ {
746
+ "platform": "android",
747
+ "deviceId": "emulator-5554",
748
+ "steps": [
749
+ { "id": "open-settings", "type": "tap", "selector": { "text": "Settings" } },
750
+ { "id": "verify-account", "type": "assert", "timeoutMs": 15000,
751
+ "assertion": { "kind": "element_visible", "selector": { "text": "Account" } } }
752
+ ]
753
+ }
754
+ ```
755
+
756
+ Replace the labels with elements from your own UI. Journey timeouts use camelCase
757
+ (`timeoutMs`, `pollIntervalMs`), unlike standalone UI wait/assertion fields
758
+ (`timeout_ms`, `poll_interval_ms`). See
759
+ [RFC 018](../specs/018-interaction-latency-and-batched-journeys/spec.md) for design
760
+ history and device acceptance criteria.
739
761
 
740
762
  ## Readiness-aware waits
741
763
 
@@ -768,4 +790,4 @@ for supported states and limits.
768
790
  ## Correlated evidence
769
791
 
770
792
  Actions and journeys expose identifiers and phase timestamps for linking later
771
- observations. See [correlated evidence](evidence.md) for scope and limitations.
793
+ observations. See [evidence correlation](correlated-evidence.md) for scope and limitations.
@@ -1,16 +1,21 @@
1
- # Manage (build & device management)
1
+ # App management
2
2
 
3
- This document covers tools that perform project builds, device selection, installation, and app lifecycle operations.
3
+ [Documentation](../README.md) · [Tool reference](TOOLS.md)
4
4
 
5
- For app launch and restart flows, agents should use:
5
+ Use these tools to select a device, build and install an app, and control its
6
+ lifecycle.
6
7
 
7
- **ACT -> WAIT (if needed) -> EXPECT**
8
+ After `start_app` or `restart_app`, [inspect the resulting UI](observe.md) and
9
+ [assert the expected screen or element](interact.md#expect_screen). If the app
10
+ is still loading, use a [readiness check](observe.md#app-readiness) or an
11
+ appropriate [UI wait](interact.md#wait_for_ui) before continuing.
8
12
 
9
- For example:
13
+ ## On this page
10
14
 
11
- 1. `start_app` or `restart_app`
12
- 2. optional `wait_for_screen_change`
13
- 3. `expect_screen` when the expected landing screen is known
15
+ - [List devices](#list_devices).
16
+ - [Build an app](#build_app).
17
+ - [Install an existing artifact](#install_app).
18
+ - [Launch, stop, restart, or reset an app](#start_app--terminate_app--restart_app--reset_app_data).
14
19
 
15
20
  ## list_devices
16
21
  Enumerate connected Android devices and iOS simulators.
@@ -51,50 +56,21 @@ Notes:
51
56
  - Requires `platform`, `projectType`, and `projectPath`.
52
57
  - Android builds prefer the project `gradlew` when present.
53
58
  - iOS builds honor environment-based Xcode destination and derived-data settings where configured.
54
- - Android setup typically needs `ADB_PATH` or `ANDROID_SDK_ROOT`/`ANDROID_HOME`, plus `GRADLE_JAVA_HOME` or `JAVA_HOME` for Gradle-backed builds.
59
+ - Standard toolchains are discovered automatically. Use [path overrides](../../README.md#environment-setup) when discovery needs help. Gradle-backed builds require a suitable Java installation.
55
60
  - iOS setup typically needs `XCRUN_PATH` and `MCP_IDB_PATH` or `IDB_PATH` when `idb` is not on `PATH`.
56
61
 
57
62
  ---
58
63
 
59
- ## build_and_install (buildAndInstallHandler)
60
- Orchestrates build then install and returns streamed NDJSON events plus a final result object.
61
-
62
- This is a documented repository helper, not part of the main public MCP tool list in `toolDefinitions`.
63
-
64
- Input:
65
-
66
- ```json
67
- { "projectPath": "/path/to/project", "platform": "android", "deviceId": "emulator-5554", "projectType": "kmp" }
68
- ```
69
-
70
- NDJSON events (example stream):
71
-
72
- ```json
73
- {"type":"build","status":"started","platform":"android"}
74
- {"type":"build","status":"finished","artifactPath":"/path/to/app.apk"}
75
- {"type":"install","status":"started","artifactPath":"/path/to/app.apk","deviceId":"emulator-5554"}
76
- {"type":"install","status":"finished","artifactPath":"/path/to/app.apk","device":{"platform":"android","id":"emulator-5554"}}
77
- ```
78
-
79
- Final result:
80
-
81
- ```json
82
- { "success": true, "artifactPath": "/path/to/app.apk", "device": { "platform": "android", "id": "emulator-5554" }, "output": "Performing Streamed Install\nSuccess" }
83
- ```
84
-
85
- Notes:
86
- - If `projectType` === `kmp`, the handler prefers Android by default. Set `platform` explicitly to override.
87
- - If `MCP_DISABLE_AUTODETECT=1`, callers MUST provide `platform` or `projectType`.
88
-
89
- ---
90
-
91
64
  ## install_app
92
- Install an app onto a connected device or simulator.
65
+ Install a built artifact, or build and install from a project directory.
66
+ `platform`, `projectType`, and `appPath` are required. `projectType` is one of
67
+ `native`, `kmp`, `react-native`, or `flutter`; acceptance of a project type does
68
+ not establish tested support for every framework.
93
69
 
94
70
  Input:
95
71
 
96
72
  ```json
97
- { "platform": "android", "appPath": "/path/to/app.apk", "deviceId": "emulator-5554" }
73
+ { "platform": "android", "projectType": "native", "appPath": "/path/to/app.apk", "deviceId": "emulator-5554" }
98
74
  ```
99
75
 
100
76
  Response:
@@ -155,4 +131,9 @@ Notes:
155
131
  - Use `details.observed_app` as the quick decision signal for what the tool actually saw after launch.
156
132
  - Android launch feedback usually includes package/activity matching; iOS launch feedback includes launch output and PID when available.
157
133
  - When the landing screen is known, use `expect_screen` as the final verification step.
158
- - If launch timing is uncertain, insert `wait_for_screen_change` before `expect_screen`.
134
+ - If launch timing is uncertain, use a UI wait or readiness check before the final assertion.
135
+
136
+ `terminate_app`, `restart_app`, and `reset_app_data` also require `platform` and
137
+ `appId`, with optional `deviceId`. Resetting app data removes application state;
138
+ use it only when a clean app state is intended. Execution controls apply to
139
+ `start_app` and `restart_app`; see [verification modes](interact.md#interaction-execution-controls-rfc-018).
@@ -1,28 +1,33 @@
1
- # Observe (logs, screenshots, UI trees)
1
+ # Observation
2
2
 
3
- Tools that retrieve device state, logs, screenshots, fingerprints, and UI hierarchies.
3
+ [Documentation](../README.md) · [Tool reference](TOOLS.md)
4
4
 
5
- These tools are primarily for:
5
+ Use observations to understand the current UI and investigate unexpected behaviour.
6
+ Screenshots show layout; UI trees expose labels, identifiers, and control state.
7
+ Logs and debug snapshots provide context when the UI does not explain a failure.
8
+ Use [interaction assertions](interact.md#expect_element_visible) to establish an
9
+ expected outcome.
6
10
 
7
- - building context before an action
8
- - supporting synchronization
9
- - diagnostics when verification fails
11
+ ## On this page
10
12
 
11
- They are **not** the primary success signal when an applicable `expect_*` tool exists.
13
+ - Inspect the UI: [screenshot](#capture_screenshot), [UI tree](#get_ui_tree), [current screen](#get_current_screen), [fingerprint](#get_screen_fingerprint).
14
+ - Investigate a failure: [logs](#get_logs), [debug snapshot](#capture_debug_snapshot), [log streams](#start_log_stream--read_log_stream--stop_log_stream).
15
+ - Check whether the UI has settled: [app readiness](#app-readiness).
12
16
 
13
- Covered observations support optional `actionRef` and return acquisition/freshness
14
- metadata; see [correlated evidence](evidence.md).
17
+ To connect an observation to a specific action, use [evidence
18
+ correlation](correlated-evidence.md). For Android performance questions, collect a
19
+ [system trace](system-traces.md) around the interaction.
15
20
 
16
21
  ## get_logs
17
22
 
18
- Fetch recent logs as structured entries optimized for AI agents.
23
+ Fetch recent logs as structured entries for diagnosis.
19
24
 
20
25
  Use logs as a debugging aid only. Prefer `expect_*` for verification, and use logs after verification fails or when an error is suspected.
21
26
 
22
27
  Input (example):
23
28
 
24
29
  ```json
25
- { "platform": "android|ios", "appId": "com.example.app", "deviceId": "emulator-5554", "pid": 1234, "tag": "MyTag", "level": "ERROR", "contains": "timeout", "since_seconds": 60, "limit": 50 }
30
+ { "platform": "android", "appId": "com.example.app", "deviceId": "emulator-5554", "pid": 1234, "tag": "MyTag", "level": "ERROR", "contains": "timeout", "since_seconds": 60, "limit": 50 }
26
31
  ```
27
32
 
28
33
  Defaults:
@@ -83,10 +88,10 @@ Input:
83
88
  { "platform": "android", "deviceId": "emulator-5554" }
84
89
  ```
85
90
 
86
- Response (example):
91
+ Response (selected fields):
87
92
 
88
93
  ```json
89
- { "device": { "platform": "android", "id": "emulator-5554" }, "screen": "", "resolution": { "width": 1080, "height": 2400 }, "snapshot_revision": 12, "captured_at_ms": 1710000000123, "loading_state": { "active": true, "signal": "spinner", "source": "ui_tree" }, "elements": [ { "text": "Sign in", "type": "android.widget.Button", "resourceId": "com.example:id/signin", "clickable": true, "bounds": [0,0,100,50], "state": { "enabled": true }, "stable_id": "com.example:id/signin", "role": "button", "test_tag": "com.example:id/signin", "selector": { "value": "com.example:id/signin", "confidence": { "score": 1, "reason": "resource_id" } }, "semantic": { "is_clickable": true, "is_container": false } } ] }
94
+ { "device": { "platform": "android", "id": "emulator-5554" }, "screen": "", "resolution": { "width": 1080, "height": 2400 }, "snapshot_session_id": "example-server-session", "snapshot_revision": 12, "captured_at_ms": 1710000000123, "loading_state": { "active": true, "signal": "spinner", "source": "ui_tree" }, "elements": [ { "text": "Sign in", "type": "android.widget.Button", "resourceId": "com.example:id/signin", "clickable": true, "bounds": [0,0,100,50], "state": { "enabled": true }, "stable_id": "com.example:id/signin", "role": "button", "test_tag": "com.example:id/signin", "selector": { "value": "com.example:id/signin", "confidence": { "score": 1, "reason": "resource_id" } }, "semantic": { "is_clickable": true, "is_container": false } } ] }
90
95
  ```
91
96
 
92
97
  Notes:
@@ -130,8 +135,9 @@ Input:
130
135
  {
131
136
  "reason": "optional string describing why snapshot is taken",
132
137
  "includeLogs": true,
138
+ "includeScreenshot": true,
133
139
  "logLines": 200,
134
- "platform": "android | ios",
140
+ "platform": "android",
135
141
  "appId": "optional package/bundle id to scope logs",
136
142
  "deviceId": "optional device serial/udid",
137
143
  "sessionId": "optional log stream session id to prefer"
@@ -149,17 +155,17 @@ Behavior:
149
155
  - `semantic` is optional, derived from `raw`, and intended for planning only.
150
156
  - `raw` now includes `snapshot_revision`, `captured_at_ms`, and `loading_state` when detectable.
151
157
 
152
- Response (example):
158
+ Response (selected fields):
153
159
 
154
160
  ```json
155
161
  {
156
162
  "raw": {
157
- "timestamp": 1710000000,
163
+ "timestamp": 1710000000000,
158
164
  "reason": "Crash after tapping checkout",
159
165
  "activity": "CheckoutActivity",
160
166
  "fingerprint": "abc123",
161
167
  "screenshot": "<base64 PNG string>",
162
- "ui_tree": { ... },
168
+ "ui_tree": { "elements": [] },
163
169
  "logs": [ { "timestamp": "2024-03-09T12:00:00.000Z", "level": "ERROR", "tag": "CheckoutViewModel", "pid": 1234, "message": "NullPointerException at CheckoutViewModel" } ]
164
170
  },
165
171
  "semantic": {
@@ -211,12 +217,41 @@ Guidance:
211
217
  ---
212
218
 
213
219
  ## start_log_stream / read_log_stream / stop_log_stream
214
- Start a background adb logcat stream and retrieve parsed NDJSON entries.
220
+ Start an app-scoped background stream on Android (`adb logcat`) or an iOS
221
+ simulator (`xcrun simctl ... log stream`). Start with `start_log_stream`:
215
222
 
216
- read_log_stream response example:
223
+ ```json
224
+ {
225
+ "platform": "android",
226
+ "deviceId": "emulator-5554",
227
+ "packageName": "com.example.app",
228
+ "sessionId": "app-diagnostics",
229
+ "level": "error"
230
+ }
231
+ ```
232
+
233
+ `packageName` is required and is also used for an iOS bundle ID. `platform`
234
+ defaults to Android. Android accepts `level`: `error` (default), `warn`, `info`,
235
+ or `debug`. The iOS adapter does not use that level argument. Omitted session IDs
236
+ use `default`; supply an explicit ID to keep diagnostic streams distinct.
237
+
238
+ Pass the same session ID to `read_log_stream` and, when finished,
239
+ `stop_log_stream`:
240
+
241
+ ```json
242
+ { "sessionId": "app-diagnostics" }
243
+ ```
244
+
245
+ Use distinct session IDs across platforms: when an ID exists only on iOS, read
246
+ and stop select iOS; otherwise they select Android. Reads retain the stream's device scope.
247
+ `read_log_stream` also accepts the optional [action reference](correlated-evidence.md)
248
+ for evidence correlation. A read returns accumulated entries and any available
249
+ crash summary; reading does not itself stop the background stream.
250
+
251
+ Example read response (selected fields):
217
252
 
218
253
  ```json
219
- { "entries": [ { "timestamp": "2026-03-20T...Z", "level": "ERROR", "tag": "AppTag", "pid": 1234, "message": "FATAL EXCEPTION" } ], "crash_summary": { "crash_detected": true } }
254
+ { "entries": [ { "timestamp": "2026-03-20T12:00:00Z", "level": "ERROR", "tag": "AppTag", "pid": 1234, "message": "FATAL EXCEPTION" } ], "crash_summary": { "crash_detected": true } }
220
255
  ```
221
256
 
222
257
  ## App readiness
@@ -240,7 +275,8 @@ Both return `success`, resolved `device`, `readiness`, `elapsed_ms`, and a
240
275
  or settled; wait succeeds only for settled. Codes are `READINESS_UNAVAILABLE`,
241
276
  `READINESS_TIMEOUT`, and `DEVICE_UNAVAILABLE`. Invalid/unknown inputs are rejected.
242
277
 
243
- `readiness.state` is loading, transitioning, settled, or unknown. Visible native
278
+ `readiness.state` is loading, transitioning, settled, unknown, or debugger_paused
279
+ for an owned Android debugger stop. Visible native
244
280
  progress indicators establish loading; exact Loading / Please wait labels
245
281
  (ignoring case, whitespace and trailing dots/ellipsis) are heuristic loading.
246
282
  Loading takes priority over unchanged trees. Two different valid signatures show
@@ -252,12 +288,15 @@ keywords such as a button named Progress are not sufficient loading evidence.
252
288
  The summary includes `basis` (observed/heuristic/insufficient), `scope: device_ui`,
253
289
  latest successful capture time and snapshot session/revision, sample
254
290
  count, `stable_for_ms`, up to eight signal-code evidence records, limitations,
255
- and capability flags. Evidence excludes UI text and full trees. Unresponsive and
256
- debugger-paused detection are explicitly unsupported on both platforms; neither
257
- slow hierarchy retrieval nor a deadline expiry proves either state.
291
+ and capability flags. Evidence excludes UI text and full trees. Managed Android
292
+ [debugger pauses](debugger.md) are reported from session evidence without acquiring
293
+ a UI tree; readiness waits fail with `DEBUGGER_PAUSED`. External-debugger and iOS
294
+ pause detection remain unsupported. Unresponsive detection is unsupported; neither
295
+ slow hierarchy retrieval nor a deadline expiry proves a pause or unresponsiveness.
258
296
 
259
297
  Tree responses (including compact and nested trees) add a single-sample readiness
260
- summary without extra reads. Such a summary reports loading or unknown; it does
298
+ summary without extra reads. It reports an owned debugger pause when known;
299
+ otherwise a single-sample summary reports loading or unknown; it does
261
300
  not inherit stability from an earlier request. Existing loading/delta fields and
262
301
  compact error evidence are preserved.
263
302
 
@@ -0,0 +1,134 @@
1
+ # Android system traces
2
+
3
+ [Documentation](../README.md) · [Tool reference](TOOLS.md)
4
+
5
+ Use system traces to collect scheduling and system annotations around a slow
6
+ interaction. Capture is optional, device-wide and Android-only; it does not
7
+ automatically diagnose performance problems. No root or Android CLI installation
8
+ is required. The device must provide Perfetto (Android API 29+), authorised ADB,
9
+ tracing services, required sched/input categories, readable process identity,
10
+ base64 decoding and writable `/data/misc/perfetto-traces` storage.
11
+
12
+ ## Tools
13
+
14
+ All inputs reject unknown fields. `platform` is `android` or `ios`; iOS is
15
+ unsupported and never starts capture. Optional `deviceId` uses existing device
16
+ resolution; supplying one is recommended when multiple devices are connected.
17
+
18
+ | Tool | Arguments | Result |
19
+ | --- | --- | --- |
20
+ | `get_system_trace_capabilities` | `platform`, `deviceId?` | `supported`, `backend`, resolved `device`, prerequisite booleans, reasons, enabled sources, unavailable categories, limitations. No recording. |
21
+ | `start_system_trace` | `platform`, `deviceId?`, `durationMs?` | Owned recording session after data-source acknowledgement. Duration is an integer 1,000–120,000 ms, default 30,000. |
22
+ | `get_system_trace_status` | `traceId` | Reconcile process/deadline and finalise ended recording. |
23
+ | `stop_system_trace` | `traceId` | Gracefully stop and retrieve local artifact; retry transfer/cleanup after failure. |
24
+ | `cancel_system_trace` | `traceId` | Stop and discard partial files. Already retrieved artifacts remain local. |
25
+
26
+ Trace control IDs are UUIDs and cannot redirect to another device. One capture
27
+ per device and four pending sessions per server are allowed. Pending failed
28
+ cleanup reserves its slot until resolved. Terminal records with complete cleanup
29
+ expire after 10 minutes or eviction beyond 100 records. Server restart invalidates
30
+ IDs. Repeated terminal operations return the stored outcome.
31
+
32
+ ## Capture workflow
33
+
34
+ Trace a reproducible slow or stalled interaction when existing UI timing/state
35
+ and logs leave a performance question unresolved. Check tool discovery first:
36
+ older installed servers may not expose these tools. Capability failure is a
37
+ reported limitation; it is not evidence that the app is frozen.
38
+
39
+ Establish the initial UI state and include an outcome assertion in the journey.
40
+ The launch-only example below demonstrates bracketing; it does not prove an app
41
+ outcome. Use a fresh screenshot or semantic assertion appropriate to the actual
42
+ screen. Settings, for example, may resume a subpage rather than show its main
43
+ title. Allow enough capture time for complete observations as well as inputs.
44
+
45
+ Always finalise an owned recording, including when a journey fails. Stop to keep
46
+ diagnostic evidence; cancel to discard it. Check both `state` and `cleanup`, and
47
+ use status/retry for an unresolved session before starting another capture.
48
+ Do not rely on automatic duration expiry as routine cleanup.
49
+
50
+ A useful report identifies the device, journey and assertion outcomes, trace ID,
51
+ linked correlation IDs, coverage, artifact path and cleanup outcome. `covered`
52
+ describes the capture session lifetime, not proof that every event survived the
53
+ ring buffer. Capture success and valid trace contents are separate from a
54
+ performance diagnosis. These tools do not return CPU summaries, frame metrics,
55
+ blocked-thread analysis or a root cause. Inspect the artifact with an available
56
+ analyser before making those claims; otherwise report analysis **unrun** and
57
+ provide the local artifact for follow-up. Host/device clocks remain unaligned.
58
+
59
+ ## Bracket a journey
60
+
61
+ 1. `get_system_trace_capabilities({"platform":"android","deviceId":"emulator-5554"})`
62
+ 2. `start_system_trace({"platform":"android","deviceId":"emulator-5554","durationMs":30000})`
63
+ 3. Use the returned `trace_id` as `systemTraceId`:
64
+
65
+ ```json
66
+ {
67
+ "platform": "android",
68
+ "deviceId": "emulator-5554",
69
+ "systemTraceId": "<trace_id>",
70
+ "steps": [
71
+ { "id": "launch", "type": "start_app", "appId": "com.android.settings", "verificationMode": "none" }
72
+ ]
73
+ }
74
+ ```
75
+
76
+ 4. `stop_system_trace({"traceId":"<trace_id>"})` returns `artifact.path` for local
77
+ inspection in Perfetto. Delete the file/directory when finished.
78
+
79
+ An invalid, inactive, foreign-server or different-device reference prevents all
80
+ journey steps. A failed journey leaves the capture available to stop or cancel;
81
+ journeys do not control its lifetime. Without `systemTraceId`, journey behaviour
82
+ and evidence remain unchanged. Linked journey/step evidence has
83
+ `trace_context: {"supported":true,"trace_id":"…","markers":[]}`. The journey
84
+ returns `system_trace` with `trace_id`, `coverage` (`covered` or `partial` if
85
+ capture ended during execution), and `clock_alignment:"unknown"`. Trace results
86
+ list linked `correlation_ids`. These are associations, not injected markers or
87
+ proof of causality; host intervals are not aligned with device trace clocks.
88
+
89
+ ## Session response and failures
90
+
91
+ JSON responses contain `trace_id`, process-scoped `session_id`, `device`,
92
+ `backend:"perfetto"`, `state` (starting/recording/stopping/completed/cancelled/failed),
93
+ nullable `reason` and `completion_reason`, host UTC capture bounds, nullable
94
+ `artifact`, `cleanup`, `correlation_ids`, `enabled_sources`, and
95
+ `unavailable_categories`. Capture bounds include command/acknowledgement latency.
96
+
97
+ `artifact` contains absolute `path`, `format:"perfetto"` and `size_bytes`.
98
+ `cleanup` contains `status` (pending/complete/failed) and `remaining_resources`.
99
+ Errors preserve known session metadata and set MCP `isError`. Argument/unknown-ID
100
+ errors return `{error:{tool,code,message}}` without a session. Codes include
101
+ `INVALID_ARGUMENT`, `UNSUPPORTED_PLATFORM`, `TRACE_UNSUPPORTED`, `TRACE_BUSY`,
102
+ `TRACE_NOT_FOUND`, `TRACE_START_FAILED`, `TRACE_STOP_FAILED`,
103
+ `TRACE_ARTIFACT_FAILED`, `ACTION_TIMEOUT`, and `TRACE_CANCELLED`.
104
+ Capability failures return ordinary `supported:false` responses with reasons.
105
+ Read state/cleanup independently: a successful artifact transfer can still have
106
+ failed device-file cleanup. Retry stop/status, or cancel to discard failed output.
107
+
108
+ ## Limits and privacy
109
+
110
+ The fixed preset requests sched, freq, idle, am, wm, gfx, view and input categories,
111
+ a 16 MiB ring buffer and a 32 MiB maximum output. Missing optional categories are
112
+ reported; missing sched/input rejects start. No arbitrary config, wildcard app
113
+ annotations, heap, screenshot or logcat sources are enabled. Device/system
114
+ annotations may still contain sensitive information; this is not app-private data.
115
+
116
+ Capture has a device-side duration limit and a server finalisation timer. Start
117
+ acknowledgement has a 35-second budget, graceful stop 10 seconds, and transfer
118
+ 30 seconds. Only the recorded PID/start-time/output-path owner can be signalled;
119
+ no kill-by-name cleanup. A device disconnect or uncertain stop reports failure,
120
+ never a successful artifact. Partial transfers are discarded; bounded device
121
+ output remains retryable. Successful transfers remove owned device files.
122
+
123
+ Host artifacts use unique restricted temporary directories and remain for
124
+ user-managed deletion. Nothing is uploaded or returned as base64. Normal server
125
+ shutdown attempts owned cleanup for up to 10 seconds. A server crash can leave
126
+ a uniquely named bounded device file for manual removal; restart performs no
127
+ broad cleanup sweep. Device suspend can extend Perfetto's own monotonic duration
128
+ limit; the server timer bounds wall-clock lifetime while the server is running.
129
+
130
+ ## Related guides
131
+
132
+ - [Interaction](interact.md#interaction-execution-controls-rfc-018): run the journey being measured.
133
+ - [Evidence correlation](correlated-evidence.md): interpret action and observation timing.
134
+ - [Android runtime debugger](debugger.md): inspect paused application state.
@@ -1,6 +1,11 @@
1
- # System (environment & health checks)
1
+ # Environment diagnostics
2
2
 
3
- Tools that provide a lightweight view of the local mobile debugging environment and surface issues early so agents can decide whether to proceed.
3
+ [Documentation](../README.md) · [Tool reference](TOOLS.md)
4
+
5
+ Check local toolchains and connected devices before building, installing, or
6
+ interacting with an app. If discovery cannot find a tool, configure the relevant
7
+ [path override](../../README.md#environment-setup), then check again. Once the
8
+ required platform is available, continue with [device selection](manage.md#list_devices).
4
9
 
5
10
  ## get_system_status
6
11
  A fast, non-throwing healthcheck that inspects key dependencies and connections required for mobile debugging.
@@ -11,7 +16,7 @@ Input:
11
16
  {}
12
17
  ```
13
18
 
14
- Response (example):
19
+ Response (selected fields):
15
20
 
16
21
  ```json
17
22
  {
@@ -63,13 +68,15 @@ Behavior notes:
63
68
  - Always returns structured JSON and never throws; any failures are surfaced in the `issues` array.
64
69
  - `status` gives a quick overall gate: `ready`, `degraded`, or `blocked`.
65
70
  - `summary.android`, `summary.ios`, and `summary.gradle` provide the fastest path to the actual blocker category.
66
- - Designed to be fast (<~1s probes where possible); startup callers may prefer a `fastMode` variant that only checks existence.
71
+ - The public tool accepts an empty input object; it exposes no `fastMode` option.
72
+ - Probes are best-effort and can take longer when native tooling is slow.
67
73
  - Useful to call at the start of an agent session to gate subsequent actions.
68
74
 
69
75
  Usage guidance:
70
76
  - Call before build/install flows to avoid wasted build attempts on misconfigured systems.
71
77
  - Call early in a session when device or toolchain availability is uncertain.
72
- - If `success: false`, attempt recovery steps or report issues to the user.
78
+ - `success: false` can reflect issues on a platform you are not using. Inspect the
79
+ relevant platform status and blockers before deciding whether to proceed.
73
80
 
74
81
  Recommended setup patterns:
75
82
  - Default: let the server discover tools automatically from standard locations and call `get_system_status` first to confirm what is available.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mobile-debug-mcp",
3
- "version": "0.33.0",
3
+ "version": "0.35.0",
4
4
  "description": "MCP server for mobile app debugging (Android + iOS), with focus on security and reliability",
5
5
  "type": "module",
6
6
  "bin": {
@@ -17,29 +17,32 @@
17
17
  "test:integration": "npm run test:device",
18
18
  "test:device": "npm run build && tsx test/device/index.ts",
19
19
  "test": "npm run test:unit",
20
- "lint": "eslint src test --quiet",
21
- "lint:fix": "eslint src test --fix",
20
+ "lint": "eslint src test --quiet && npm run check:quality && npm run check:architecture",
21
+ "lint:fix": "eslint src test --fix && npm run check:quality && npm run check:architecture",
22
22
  "sync:agent-plugin": "node scripts/agent-plugin.mjs --sync",
23
+ "check:quality": "node scripts/code-quality.mjs",
24
+ "check:architecture": "node scripts/check-architecture.mjs",
23
25
  "check:agent-plugin": "node scripts/agent-plugin.mjs --check",
24
26
  "verify": "npm run lint && npm run build && npm run test:unit && npm run check:agent-plugin"
25
27
  },
26
-
27
28
  "engines": {
28
- "node": ">=18"
29
+ "node": ">=22"
29
30
  },
30
31
  "dependencies": {
31
32
  "@modelcontextprotocol/sdk": "^1.0.0",
32
33
  "fast-xml-parser": "^5.5.1",
33
- "zod": "^3.22.4",
34
- "sharp": "^0.32.1"
34
+ "sharp": "^0.35.5",
35
+ "zod": "^4.6.7"
35
36
  },
36
37
  "devDependencies": {
37
38
  "@types/node": "^25.4.0",
38
39
  "@typescript-eslint/eslint-plugin": "^8.57.1",
39
40
  "@typescript-eslint/parser": "^8.57.1",
41
+ "archunit": "2.5.4",
40
42
  "eslint": "^9.39.4",
41
43
  "eslint-plugin-unused-imports": "^4.4.1",
42
- "tsx": "^4.21.0",
44
+ "minimist": "^1.2.8",
45
+ "tsx": "^4.23.15",
43
46
  "typescript": "^5.9.3"
44
47
  }
45
48
  }