mobile-debug-mcp 0.34.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 (432) 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 +4 -4
  12. package/AGENTS.md +12 -3
  13. package/CONTRIBUTING.md +79 -0
  14. package/README.md +156 -129
  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 +16 -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 +27 -2
  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 +2 -1
  28. package/dist/debugger/diagnostics.js +54 -0
  29. package/dist/debugger/protocol.js +33 -0
  30. package/dist/debugger/sessions.js +104 -62
  31. package/dist/debugger/worker.js +53 -42
  32. package/dist/interact/adjustment/adjustment-context.js +41 -0
  33. package/dist/interact/adjustment/adjustment-gestures.js +55 -0
  34. package/dist/interact/adjustment/adjustment-plan.js +18 -0
  35. package/dist/interact/adjustment/adjustment-resolution.js +127 -0
  36. package/dist/interact/adjustment/adjustment-result.js +19 -0
  37. package/dist/interact/adjustment/adjustment-semantic.js +64 -0
  38. package/dist/interact/adjustment/adjustment-verification.js +35 -0
  39. package/dist/interact/adjustment/adjustment.js +52 -0
  40. package/dist/interact/adjustment/control-geometry.js +87 -0
  41. package/dist/interact/adjustment/control-values.js +136 -0
  42. package/dist/interact/adjustment/slider-labels.js +84 -0
  43. package/dist/interact/assertions/screen-assertion.js +37 -0
  44. package/dist/interact/assertions/state-assertion-context.js +35 -0
  45. package/dist/interact/assertions/state-assertion.js +76 -0
  46. package/dist/interact/assertions/state-comparison.js +141 -0
  47. package/dist/interact/assertions/visibility-assertion.js +34 -0
  48. package/dist/interact/conditional-action.js +12 -7
  49. package/dist/interact/index.js +65 -3090
  50. package/dist/interact/input-service.js +1 -0
  51. package/dist/interact/interaction-trace.js +21 -0
  52. package/dist/interact/model.js +1 -0
  53. package/dist/interact/observation.js +1 -0
  54. package/dist/interact/targeting/candidate-ancestor.js +58 -0
  55. package/dist/interact/targeting/candidate-result.js +23 -0
  56. package/dist/interact/targeting/candidate-scoring.js +50 -0
  57. package/dist/interact/targeting/element-helpers.js +216 -0
  58. package/dist/interact/targeting/find-element.js +65 -0
  59. package/dist/interact/targeting/nearby-control.js +56 -0
  60. package/dist/interact/targeting/resolved-elements.js +21 -0
  61. package/dist/interact/targeting/tap-target.js +17 -0
  62. package/dist/interact/targeting/target-scope.js +104 -0
  63. package/dist/interact/waits/legacy-log-wait.js +38 -0
  64. package/dist/interact/waits/legacy-wait-observations.js +103 -0
  65. package/dist/interact/waits/legacy-wait-state.js +34 -0
  66. package/dist/interact/waits/legacy-wait.js +48 -0
  67. package/dist/interact/waits/screen-wait.js +49 -0
  68. package/dist/interact/waits/ui-change-helpers.js +157 -0
  69. package/dist/interact/waits/ui-change-state.js +18 -0
  70. package/dist/interact/waits/ui-change-wait.js +77 -0
  71. package/dist/interact/waits/ui-wait-condition.js +56 -0
  72. package/dist/interact/waits/ui-wait-state.js +38 -0
  73. package/dist/interact/waits/ui-wait.js +106 -0
  74. package/dist/manage/android.js +55 -51
  75. package/dist/manage/index.js +38 -75
  76. package/dist/manage/ios/build-types.js +1 -0
  77. package/dist/manage/ios/build.js +210 -0
  78. package/dist/manage/ios/project-discovery.js +29 -0
  79. package/dist/manage/ios/scheme.js +18 -0
  80. package/dist/manage/ios.js +42 -256
  81. package/dist/observe/android/context.js +1 -0
  82. package/dist/observe/android/current-screen.js +55 -0
  83. package/dist/observe/android/fingerprint.js +13 -0
  84. package/dist/observe/android/log-stream.js +132 -0
  85. package/dist/observe/android/logs.js +107 -0
  86. package/dist/observe/android/screenshot.js +70 -0
  87. package/dist/observe/android/ui-tree.js +107 -0
  88. package/dist/observe/android.js +16 -520
  89. package/dist/observe/evidence.js +114 -75
  90. package/dist/observe/index.js +16 -263
  91. package/dist/observe/ios/context.js +16 -0
  92. package/dist/observe/ios/fingerprint.js +12 -0
  93. package/dist/observe/ios/log-stream.js +105 -0
  94. package/dist/observe/ios/logs.js +168 -0
  95. package/dist/observe/ios/screenshot.js +22 -0
  96. package/dist/observe/ios/ui-elements.js +241 -0
  97. package/dist/observe/ios/ui-tree.js +137 -0
  98. package/dist/observe/ios.js +17 -715
  99. package/dist/observe/logs/model.js +1 -0
  100. package/dist/{network → observe/network}/index.js +2 -2
  101. package/dist/observe/readiness-service.js +4 -2
  102. package/dist/observe/readiness.js +29 -10
  103. package/dist/observe/screenshot-encoding.js +41 -0
  104. package/dist/observe/snapshot-collection.js +79 -0
  105. package/dist/observe/snapshot-logs.js +30 -0
  106. package/dist/observe/snapshot-metadata.js +43 -31
  107. package/dist/observe/snapshot-semantic.js +115 -0
  108. package/dist/observe/system-trace.js +22 -13
  109. package/dist/runtime/action-results.js +270 -0
  110. package/dist/runtime/clock.js +4 -0
  111. package/dist/server/common.js +1 -256
  112. package/dist/server/definitions/assert.js +162 -0
  113. package/dist/server/definitions/diagnostic.js +118 -0
  114. package/dist/server/definitions/input.js +274 -0
  115. package/dist/server/definitions/manage.js +194 -0
  116. package/dist/server/definitions/observe.js +149 -0
  117. package/dist/server/definitions/target.js +138 -0
  118. package/dist/server/definitions/wait.js +105 -0
  119. package/dist/server/handlers/action-execution.js +163 -0
  120. package/dist/server/handlers/correlation.js +23 -0
  121. package/dist/server/{debugger-handlers.js → handlers/debugger-handlers.js} +22 -12
  122. package/dist/server/handlers/debugger-response.js +9 -0
  123. package/dist/server/handlers/diagnostic.js +69 -0
  124. package/dist/server/handlers/handler-types.js +1 -0
  125. package/dist/server/handlers/input.js +154 -0
  126. package/dist/server/handlers/interact.js +113 -0
  127. package/dist/server/handlers/journey-assertions.js +35 -0
  128. package/dist/server/handlers/journey.js +147 -0
  129. package/dist/server/handlers/manage.js +119 -0
  130. package/dist/server/handlers/observe.js +95 -0
  131. package/dist/server/handlers/payload.js +4 -0
  132. package/dist/server/handlers/tool-handlers.js +160 -0
  133. package/dist/server/schemas/condition-schema.js +2 -0
  134. package/dist/server/{debugger-schema.js → schemas/debugger-schema.js} +11 -6
  135. package/dist/server/{journey-schema.js → schemas/journey-schema.js} +7 -22
  136. package/dist/server/tool-definitions.js +58 -1135
  137. package/dist/server-core.js +2 -2
  138. package/dist/system/android-status.js +101 -0
  139. package/dist/system/android.js +37 -27
  140. package/dist/system/index.js +13 -439
  141. package/dist/system/ios-status.js +132 -0
  142. package/dist/system/ios.js +11 -8
  143. package/dist/system/model.js +1 -0
  144. package/dist/system/probes.js +105 -0
  145. package/dist/system/status-summary.js +43 -0
  146. package/dist/system/unsupported-status.js +52 -0
  147. package/dist/utils/android/commands.js +89 -0
  148. package/dist/utils/android/gradle.js +139 -0
  149. package/dist/utils/android/logs.js +103 -0
  150. package/dist/utils/android/ui-tree.js +233 -0
  151. package/dist/utils/android/utils.js +6 -564
  152. package/dist/utils/cli/idb/idb-helper.js +4 -6
  153. package/dist/utils/cli/idb/install-idb.js +13 -9
  154. package/dist/utils/cli/ios/preflight-ios.js +42 -38
  155. package/dist/utils/ios/utils.js +45 -46
  156. package/dist/utils/java.js +65 -49
  157. package/dist/utils/resolve-device.js +4 -2
  158. package/dist/utils/ui/index.js +26 -26
  159. package/docs/CHANGELOG.md +44 -0
  160. package/docs/README.md +38 -0
  161. package/docs/benchmarks/README.md +18 -0
  162. package/docs/benchmarks/interaction-latency/README.md +14 -0
  163. package/docs/benchmarks/interaction-latency/final.md +4 -1
  164. package/docs/benchmarks/interaction-latency/ios-validation.md +2 -0
  165. package/docs/benchmarks/ui-tree-performance/README.md +24 -16
  166. package/docs/benchmarks/ui-tree-performance/comparison.md +11 -10
  167. package/docs/code-structure.md +118 -0
  168. package/docs/specs/001-state-verification/spec.md +16 -14
  169. package/docs/specs/002-richer-element-identity/spec.md +12 -10
  170. package/docs/specs/003-wait-and-synchronization-reliability/spec.md +12 -10
  171. package/docs/specs/004-action-verification-routing/spec.md +3 -3
  172. package/docs/specs/005-unified-action-execution-and-verification-model/spec.md +2 -0
  173. package/docs/specs/006-runtime-action-instrumentation-and-binding-layer/spec.md +2 -0
  174. package/docs/specs/007-actionability-resolution-and-executable-target-selection/spec.md +3 -1
  175. package/docs/specs/008-adjustable-control-support-and-semantic-value-manipulation/spec.md +3 -4
  176. package/docs/specs/009-semantic-control-modeling-for-custom-and-composite-controls/spec.md +2 -0
  177. package/docs/specs/010-verification-stabilization-and-temporal-convergence/spec.md +2 -2
  178. package/docs/specs/011-recovery-and-replanning-for-failed-or-ambiguous-interaction-flows/spec.md +2 -2
  179. package/docs/specs/011.1-recovery-contract-types-and-runtime-wiring-spec/spec.md +2 -0
  180. package/docs/specs/012-action-trace-and-xecution-observability/spec.md +2 -3
  181. package/docs/specs/013-wait-and-synchronization-reliability/spec.md +19 -19
  182. package/docs/specs/014-actionability-resolution/spec.md +20 -18
  183. package/docs/specs/015-adjustable-control-support/spec.md +17 -15
  184. package/docs/specs/016-environment-tools/spec.md +20 -20
  185. package/docs/specs/018-interaction-latency-and-batched-journeys/spec.md +2 -0
  186. package/docs/specs/019-ui-tree-observation-performance/spec.md +3 -1
  187. package/docs/specs/020-conditional-actions/intent.md +5 -3
  188. package/docs/specs/020-conditional-actions/plan.md +8 -9
  189. package/docs/specs/020-conditional-actions/spec.md +4 -2
  190. package/docs/specs/021-app-readiness-signals/intent.md +4 -2
  191. package/docs/specs/021-app-readiness-signals/plan.md +7 -6
  192. package/docs/specs/021-app-readiness-signals/spec.md +3 -1
  193. package/docs/specs/022-correlated-evidence/intent.md +4 -4
  194. package/docs/specs/022-correlated-evidence/plan.md +10 -11
  195. package/docs/specs/022-correlated-evidence/spec.md +3 -1
  196. package/docs/specs/023-android-system-traces/intent.md +3 -2
  197. package/docs/specs/023-android-system-traces/plan.md +5 -7
  198. package/docs/specs/023-android-system-traces/spec.md +3 -1
  199. package/docs/specs/024-android-heap-dump-capture/intent.md +3 -1
  200. package/docs/specs/025-android-runtime-debugger/intent.md +4 -3
  201. package/docs/specs/025-android-runtime-debugger/plan.md +3 -1
  202. package/docs/specs/025-android-runtime-debugger/spec.md +4 -3
  203. package/docs/specs/026-code-structure-and-quality-gates/health-plan.md +88 -0
  204. package/docs/specs/026-code-structure-and-quality-gates/intent.md +47 -0
  205. package/docs/specs/026-code-structure-and-quality-gates/plan.md +191 -0
  206. package/docs/specs/026-code-structure-and-quality-gates/spec.md +138 -0
  207. package/docs/specs/026-code-structure-and-quality-gates/verification-final.json +200 -0
  208. package/docs/specs/026-code-structure-and-quality-gates/verification-thin-facade.json +154 -0
  209. package/docs/specs/026-code-structure-and-quality-gates/verification.json +136 -0
  210. package/docs/specs/027-debugger-failure-diagnostics/intent.md +43 -0
  211. package/docs/specs/027-debugger-failure-diagnostics/plan.md +86 -0
  212. package/docs/specs/027-debugger-failure-diagnostics/spec.md +133 -0
  213. package/docs/specs/028-compact-debugger-responses/intent.md +41 -0
  214. package/docs/specs/028-compact-debugger-responses/plan.md +112 -0
  215. package/docs/specs/028-compact-debugger-responses/spec.md +108 -0
  216. package/docs/specs/029-kotlin-locals-validation/report.md +119 -0
  217. package/docs/specs/030-android-coroutine-validation/evidence.json +475 -0
  218. package/docs/specs/030-android-coroutine-validation/intent.md +47 -0
  219. package/docs/specs/030-android-coroutine-validation/plan.md +147 -0
  220. package/docs/specs/030-android-coroutine-validation/report.md +240 -0
  221. package/docs/specs/030-android-coroutine-validation/spec.md +107 -0
  222. package/docs/tools/TOOLS.md +31 -18
  223. package/docs/tools/{evidence.md → correlated-evidence.md} +9 -1
  224. package/docs/tools/debugger.md +76 -0
  225. package/docs/tools/interact.md +42 -20
  226. package/docs/tools/manage.md +25 -44
  227. package/docs/tools/observe.md +55 -23
  228. package/docs/tools/system-traces.md +9 -1
  229. package/docs/tools/system.md +12 -5
  230. package/package.json +11 -8
  231. package/scripts/architecture-graph.mjs +69 -0
  232. package/scripts/check-architecture.mjs +47 -0
  233. package/scripts/code-quality-baseline.json +1 -0
  234. package/scripts/code-quality.mjs +161 -0
  235. package/src/contracts/execution-controls.ts +26 -0
  236. package/src/contracts/selector.ts +17 -0
  237. package/src/contracts/target.ts +19 -0
  238. package/src/contracts/ui.ts +94 -0
  239. package/src/debugger/android.ts +2 -1
  240. package/src/debugger/diagnostics.ts +43 -0
  241. package/src/debugger/guard.ts +6 -1
  242. package/{worker → src/debugger/java}/DebuggerWorker.java +9 -3
  243. package/src/debugger/protocol.ts +37 -0
  244. package/src/debugger/sessions.ts +314 -155
  245. package/src/debugger/worker.ts +51 -38
  246. package/src/interact/adjustment/adjustment-context.ts +83 -0
  247. package/src/interact/adjustment/adjustment-gestures.ts +48 -0
  248. package/src/interact/adjustment/adjustment-plan.ts +23 -0
  249. package/src/interact/adjustment/adjustment-resolution.ts +104 -0
  250. package/src/interact/adjustment/adjustment-result.ts +34 -0
  251. package/src/interact/adjustment/adjustment-semantic.ts +53 -0
  252. package/src/interact/adjustment/adjustment-verification.ts +60 -0
  253. package/src/interact/adjustment/adjustment.ts +49 -0
  254. package/src/interact/adjustment/control-geometry.ts +120 -0
  255. package/src/interact/adjustment/control-values.ts +141 -0
  256. package/src/interact/adjustment/slider-labels.ts +84 -0
  257. package/src/interact/assertions/screen-assertion.ts +39 -0
  258. package/src/interact/assertions/state-assertion-context.ts +48 -0
  259. package/src/interact/assertions/state-assertion.ts +64 -0
  260. package/src/interact/assertions/state-comparison.ts +168 -0
  261. package/src/interact/assertions/visibility-assertion.ts +41 -0
  262. package/src/interact/conditional-action.ts +18 -12
  263. package/src/interact/index.ts +76 -3492
  264. package/src/interact/input-service.ts +11 -0
  265. package/src/interact/interaction-trace.ts +36 -0
  266. package/src/interact/model.ts +109 -0
  267. package/src/interact/observation.ts +7 -0
  268. package/src/interact/targeting/candidate-ancestor.ts +49 -0
  269. package/src/interact/targeting/candidate-result.ts +24 -0
  270. package/src/interact/targeting/candidate-scoring.ts +42 -0
  271. package/src/interact/targeting/element-helpers.ts +243 -0
  272. package/src/interact/targeting/find-element.ts +47 -0
  273. package/src/interact/targeting/nearby-control.ts +46 -0
  274. package/src/interact/targeting/resolved-elements.ts +20 -0
  275. package/src/interact/targeting/tap-target.ts +22 -0
  276. package/src/interact/targeting/target-scope.ts +121 -0
  277. package/src/interact/waits/legacy-log-wait.ts +30 -0
  278. package/src/interact/waits/legacy-wait-observations.ts +55 -0
  279. package/src/interact/waits/legacy-wait-state.ts +48 -0
  280. package/src/interact/waits/legacy-wait.ts +34 -0
  281. package/src/interact/waits/screen-wait.ts +37 -0
  282. package/src/interact/waits/ui-change-helpers.ts +184 -0
  283. package/src/interact/waits/ui-change-state.ts +26 -0
  284. package/src/interact/waits/ui-change-wait.ts +59 -0
  285. package/src/interact/waits/ui-wait-condition.ts +52 -0
  286. package/src/interact/waits/ui-wait-state.ts +55 -0
  287. package/src/interact/waits/ui-wait.ts +84 -0
  288. package/src/manage/android.ts +56 -50
  289. package/src/manage/index.ts +63 -93
  290. package/src/manage/ios/build-types.ts +14 -0
  291. package/src/manage/ios/build.ts +230 -0
  292. package/src/manage/ios/project-discovery.ts +26 -0
  293. package/src/manage/ios/scheme.ts +16 -0
  294. package/src/manage/ios.ts +65 -298
  295. package/src/observe/android/context.ts +1 -0
  296. package/src/observe/android/current-screen.ts +63 -0
  297. package/src/observe/android/fingerprint.ts +13 -0
  298. package/src/observe/android/log-stream.ts +127 -0
  299. package/src/observe/android/logs.ts +110 -0
  300. package/src/observe/android/screenshot.ts +79 -0
  301. package/src/observe/android/ui-tree.ts +113 -0
  302. package/src/observe/android.ts +17 -531
  303. package/src/observe/evidence.ts +122 -70
  304. package/src/observe/index.ts +24 -286
  305. package/src/observe/ios/context.ts +22 -0
  306. package/src/observe/ios/fingerprint.ts +12 -0
  307. package/src/observe/ios/log-stream.ts +103 -0
  308. package/src/observe/ios/logs.ts +179 -0
  309. package/src/observe/ios/screenshot.ts +26 -0
  310. package/src/observe/ios/ui-elements.ts +266 -0
  311. package/src/observe/ios/ui-tree.ts +143 -0
  312. package/src/observe/ios.ts +18 -749
  313. package/src/observe/logs/model.ts +11 -0
  314. package/src/{network → observe/network}/index.ts +2 -2
  315. package/src/observe/readiness-service.ts +5 -3
  316. package/src/observe/readiness.ts +39 -18
  317. package/src/observe/screenshot-encoding.ts +32 -0
  318. package/src/observe/snapshot-collection.ts +69 -0
  319. package/src/observe/snapshot-logs.ts +26 -0
  320. package/src/observe/snapshot-metadata.ts +51 -31
  321. package/src/observe/snapshot-semantic.ts +153 -0
  322. package/src/observe/system-trace.ts +24 -15
  323. package/src/runtime/action-results.ts +376 -0
  324. package/src/runtime/clock.ts +9 -0
  325. package/src/server/common.ts +9 -359
  326. package/src/server/definitions/assert.ts +164 -0
  327. package/src/server/definitions/diagnostic.ts +120 -0
  328. package/src/server/definitions/input.ts +276 -0
  329. package/src/server/definitions/manage.ts +196 -0
  330. package/src/server/definitions/observe.ts +151 -0
  331. package/src/server/definitions/target.ts +140 -0
  332. package/src/server/definitions/wait.ts +107 -0
  333. package/src/server/handlers/action-execution.ts +164 -0
  334. package/src/server/handlers/correlation.ts +20 -0
  335. package/src/server/handlers/debugger-handlers.ts +39 -0
  336. package/src/server/handlers/debugger-response.ts +7 -0
  337. package/src/server/handlers/diagnostic.ts +79 -0
  338. package/src/server/handlers/handler-types.ts +7 -0
  339. package/src/server/handlers/input.ts +173 -0
  340. package/src/server/handlers/interact.ts +135 -0
  341. package/src/server/handlers/journey-assertions.ts +39 -0
  342. package/src/server/handlers/journey.ts +132 -0
  343. package/src/server/handlers/manage.ts +141 -0
  344. package/src/server/handlers/observe.ts +116 -0
  345. package/src/server/handlers/payload.ts +36 -0
  346. package/src/server/handlers/tool-handlers.ts +159 -0
  347. package/src/server/schemas/condition-schema.ts +2 -0
  348. package/src/server/{debugger-schema.ts → schemas/debugger-schema.ts} +13 -7
  349. package/src/server/{journey-schema.ts → schemas/journey-schema.ts} +7 -22
  350. package/src/server/{system-trace-schema.ts → schemas/system-trace-schema.ts} +3 -3
  351. package/src/server/tool-definitions.ts +67 -1143
  352. package/src/server-core.ts +2 -2
  353. package/src/server.ts +1 -1
  354. package/src/system/android-status.ts +124 -0
  355. package/src/system/android.ts +33 -21
  356. package/src/system/index.ts +21 -525
  357. package/src/system/ios-status.ts +147 -0
  358. package/src/system/ios.ts +14 -10
  359. package/src/system/model.ts +41 -0
  360. package/src/system/probes.ts +114 -0
  361. package/src/system/status-summary.ts +47 -0
  362. package/src/system/unsupported-status.ts +55 -0
  363. package/src/types.ts +16 -106
  364. package/src/utils/android/commands.ts +81 -0
  365. package/src/utils/android/gradle.ts +132 -0
  366. package/src/utils/android/logs.ts +103 -0
  367. package/src/utils/android/ui-tree.ts +239 -0
  368. package/src/utils/android/utils.ts +16 -556
  369. package/src/utils/cli/idb/check-idb.ts +4 -4
  370. package/src/utils/cli/idb/idb-helper.ts +6 -8
  371. package/src/utils/cli/idb/install-idb.ts +15 -9
  372. package/src/utils/cli/ios/preflight-ios.ts +39 -31
  373. package/src/utils/cli/ios/run-ios-ui-tree-tap.ts +4 -4
  374. package/src/utils/ios/utils.ts +57 -61
  375. package/src/utils/java.ts +62 -43
  376. package/src/utils/resolve-device.ts +9 -6
  377. package/src/utils/ui/index.ts +28 -28
  378. package/test/device/automated/debugger/coroutine-lifecycle.ts +27 -0
  379. package/test/device/automated/debugger/coroutine-support.ts +140 -0
  380. package/test/device/automated/debugger/coroutine.android.test.ts +169 -0
  381. package/test/device/automated/debugger/kotlin.android.test.ts +127 -0
  382. package/test/device/automated/debugger/runtime.android.test.ts +19 -3
  383. package/test/device/automated/interact/interaction.android.test.ts +56 -0
  384. package/test/device/automated/observe/system-trace.smoke.ts +1 -1
  385. package/test/device/manual/interact/modul8_selector_tap.manual.ts +1 -1
  386. package/test/fixtures/contracts/tool-definitions.json +3536 -0
  387. package/test/fixtures/coroutine-app/MainActivity.kt +100 -0
  388. package/test/fixtures/coroutine-app/README.md +48 -0
  389. package/test/fixtures/coroutine-app/build.ts +35 -0
  390. package/test/fixtures/debugger-app/MainActivity.java +21 -0
  391. package/test/fixtures/debugger-app/MainActivity.kt +32 -0
  392. package/test/fixtures/debugger-app/README.md +52 -0
  393. package/test/fixtures/debugger-app/build.ts +25 -15
  394. package/test/fixtures/latency-journey-app/README.md +2 -0
  395. package/test/fixtures/readiness-app/README.md +2 -0
  396. package/test/unit/debugger/coroutine-lifecycle.test.ts +43 -0
  397. package/test/unit/debugger/diagnostic-sessions.test.ts +67 -0
  398. package/test/unit/debugger/diagnostics.test.ts +80 -0
  399. package/test/unit/debugger/guards.test.ts +4 -0
  400. package/test/unit/debugger/preparation.test.ts +32 -0
  401. package/test/unit/debugger/protocol.test.ts +15 -0
  402. package/test/unit/debugger/sessions.test.ts +1 -1
  403. package/test/unit/interact/adjustment_service.test.ts +42 -0
  404. package/test/unit/interact/adjustment_verification.test.ts +35 -0
  405. package/test/unit/interact/clock_dependencies.test.ts +63 -0
  406. package/test/unit/interact/element_helpers.test.ts +19 -0
  407. package/test/unit/interact/legacy_wait_service.test.ts +17 -0
  408. package/test/unit/interact/state_comparison.test.ts +20 -0
  409. package/test/unit/interact/target_scope.test.ts +35 -0
  410. package/test/unit/network/get_network_activity.test.ts +1 -1
  411. package/test/unit/observe/screenshot-encoding.test.ts +30 -0
  412. package/test/unit/observe/snapshot-logs.test.ts +14 -0
  413. package/test/unit/quality/architecture.test.ts +60 -0
  414. package/test/unit/quality/code-quality.test.ts +58 -0
  415. package/test/unit/quality/interaction_boundaries.test.ts +24 -0
  416. package/test/unit/server/conditional_actions.test.ts +1 -1
  417. package/test/unit/server/conditional_schema.test.ts +2 -2
  418. package/test/unit/server/debugger-response.test.ts +63 -0
  419. package/test/unit/server/tool_definitions_parity.test.ts +8 -0
  420. package/dist/server/tool-handlers.js +0 -1000
  421. package/docs/ROADMAP.md +0 -646
  422. package/docs/benchmarks/ui-tree-performance/bridge-probe.json +0 -29
  423. package/docs/benchmarks/ui-tree-performance/initial-baseline.json +0 -59560
  424. package/docs/specs/baseline-spec-v0.md +0 -312
  425. package/docs/specs/mcp-tooling-spec-v1.md +0 -446
  426. package/src/server/debugger-handlers.ts +0 -29
  427. package/src/server/tool-handlers.ts +0 -1008
  428. /package/dist/{server/condition-schema.js → contracts/condition.js} +0 -0
  429. /package/dist/server/{readiness-schema.js → schemas/readiness-schema.js} +0 -0
  430. /package/dist/server/{system-trace-schema.js → schemas/system-trace-schema.js} +0 -0
  431. /package/src/{server/condition-schema.ts → contracts/condition.ts} +0 -0
  432. /package/src/server/{readiness-schema.ts → schemas/readiness-schema.ts} +0 -0
@@ -1,446 +0,0 @@
1
- # MCP Tooling Specification — Spec v1 (Refined)
2
-
3
- ## 1. Scope
4
-
5
- This specification defines the runtime contract for MCP tools used to interact with mobile applications.
6
-
7
- It standardizes:
8
-
9
- - action execution semantics
10
- - verification model
11
- - failure handling
12
- - response shape constraints
13
-
14
- This spec is incremental and aligned with the current implementation. It does not introduce new tools or require architectural redesign.
15
-
16
- ## 2. Core Model
17
-
18
- The system is based on a strict separation:
19
-
20
- - Action tools perform execution
21
- - Verification tools determine outcome
22
- - `wait_for_*` tools resolve and synchronize
23
- - Observation tools inspect state
24
-
25
- ## 3. Execution Model
26
-
27
- Canonical flow for verifiable interactions:
28
-
29
- `RESOLVE -> ACT -> WAIT (optional) -> EXPECT`
30
-
31
- This flow applies when outcome verification is required.
32
-
33
- It does not apply to:
34
-
35
- - pure inspection tools
36
- - observation-only flows
37
- - non-verifiable or exploratory actions
38
-
39
- Outcome-specific guidance:
40
-
41
- - visible navigation expected -> `wait_for_screen_change` (optional) -> `expect_screen`
42
- - local UI change expected -> `wait_for_ui` (optional) -> `expect_element_visible`
43
- - readable element state expected -> `wait_for_ui` (optional) -> `expect_state`
44
- - backend/API activity expected without a visible UI change -> compare `get_screen_fingerprint` before/after, then call `classify_action_outcome` with the runtime `action_type`; collect `get_network_activity` only if the result remains ambiguous
45
-
46
- For backend/API activity, `wait_for_screen_change` is not the right verification tool unless a visible transition is also expected.
47
-
48
- ## 4. Action Tools
49
-
50
- ### 4.1 Definition
51
-
52
- Action tools mutate application state.
53
-
54
- Includes:
55
- `start_app`, `restart_app`, `tap`, `tap_element`, `swipe`, `scroll_to_element`, `type_text`, `press_back`, `adjust_control`
56
-
57
- ### 4.2 Required Semantics
58
-
59
- - `success` MUST represent execution success only
60
- - execution success means the platform command was dispatched without error
61
- - `success` MUST NOT imply outcome success
62
-
63
- ### 4.3 Action Envelope
64
-
65
- MUST be returned in this structure:
66
-
67
- ```ts
68
- {
69
- action_id: string,
70
- timestamp: string,
71
- action_type: string,
72
- lifecycle_state?: 'pending_verification' | 'failed',
73
- source_module?: 'server' | 'interact',
74
- target: {
75
- selector: object,
76
- resolved: object | null
77
- },
78
- success: boolean,
79
- ui_fingerprint_before: string | null,
80
- ui_fingerprint_after: string | null,
81
- failure_code?: string,
82
- retryable?: boolean,
83
- trace: {
84
- action_id: string,
85
- steps: Array<{
86
- stage: 'resolve' | 'execute' | 'verify' | 'stabilize' | 'recover',
87
- timestamp: number,
88
- result: 'success' | 'failure' | 'retry',
89
- attempt_index: number,
90
- cycle_id?: number,
91
- metadata?: Record<string, unknown>
92
- }>,
93
- final_outcome: 'success' | 'failure',
94
- attempts: number
95
- },
96
- recovery?: {
97
- failure_class: string,
98
- runtime_code: string,
99
- recovery_strategy?: string,
100
- recovery_attempts: number,
101
- max_recovery_attempts: number,
102
- retry_depth: number,
103
- max_retry_depth: number,
104
- is_terminal: boolean,
105
- retry_allowed?: boolean
106
- },
107
- device?: DeviceInfo,
108
- details?: object
109
- }
110
- ```
111
-
112
- Rules:
113
-
114
- - `success` is at the top level, not nested
115
- - `target` contains only selection and resolution context
116
- - `lifecycle_state` reflects the post-dispatch runtime state
117
- - `source_module` identifies where the envelope was produced
118
- - fingerprints represent observed pre/post UI state on a best-effort basis
119
- - `failure_code` is optional but MUST be used when a structured mapping exists
120
- - `trace` is required and carries the observable execution path
121
- - `recovery` MAY be attached to failed actions to carry typed recovery metadata
122
-
123
- ### 4.4 Allowed Deviations
124
-
125
- Explicit temporary exceptions:
126
-
127
- - `install_app`, `terminate_app`, `reset_app_data` do not use this envelope
128
- - `scroll_to_element` may temporarily retain outcome-based success semantics
129
- - partial `failure_code` coverage is allowed
130
- - detail richness may vary across tools
131
-
132
- ## 5. Verification Tools
133
-
134
- ### 5.1 Definition
135
-
136
- Verification tools determine whether the intended outcome occurred.
137
-
138
- Primary:
139
-
140
- - `expect_screen`
141
- - `expect_element_visible`
142
- - `expect_state`
143
-
144
- ### 5.2 Required Semantics
145
-
146
- - MUST return `success` as a boolean
147
- - `success` MUST represent outcome truth
148
- - MUST be binary and deterministic
149
-
150
- Optional fields do not affect `success`:
151
- `observed`, `expected`, `comparison`, `reason`, `confidence`
152
-
153
- ### 5.3 Authoritative Role
154
-
155
- Verification tools are the only authoritative source of outcome truth.
156
-
157
- Action tools MUST NOT be used to infer outcome success.
158
-
159
- ### 5.4 Applicability Rules
160
-
161
- An `expect_*` tool is applicable when:
162
-
163
- - expected destination screen is known -> `expect_screen`
164
- - expected UI element state is known -> `expect_element_visible`
165
- - expected readable state property is known -> `expect_state`
166
- - outcome is explicitly defined or testable
167
-
168
- Rules:
169
-
170
- - `wait_for_*` MAY be used before `expect_*` for synchronization
171
- - `wait_for_*` MUST NOT replace `expect_*` when an applicable `expect_*` tool exists
172
- - when no applicable `expect_*` tool exists, `expect_*` MAY be skipped
173
-
174
- ## 6. wait_for_* Tools
175
-
176
- ### 6.1 Definition
177
-
178
- `wait_for_*` tools provide deterministic resolution and synchronization.
179
-
180
- Examples:
181
-
182
- - `wait_for_ui`
183
- - `wait_for_screen_change`
184
- - `wait_for_ui_change`
185
-
186
- ### 6.2 Rules
187
-
188
- - MAY resolve UI elements
189
- - MAY synchronize UI/system state
190
- - MUST NOT be treated as final verification when `expect_*` is applicable
191
-
192
- ### 6.3 Semantics
193
-
194
- - `success` indicates condition met or resolution succeeded
195
- - `success` does NOT indicate outcome correctness
196
-
197
- ### 6.4 `wait_for_ui_change`
198
-
199
- `wait_for_ui_change` synchronizes on observable in-place UI mutation.
200
-
201
- Inputs:
202
-
203
- - `platform?: "android" | "ios"`
204
- - `deviceId?: string`
205
- - `timeout_ms?: number`
206
- - `stability_window_ms?: number` (default: `300`)
207
- - `expected_change?: "hierarchy_diff" | "text_change" | "state_change"`
208
-
209
- Required semantics:
210
-
211
- - success means a qualifying UI mutation was observed and remained stable for a full `stability_window_ms`
212
- - stabilization MUST reset whenever a synchronization-relevant mutation is observed
213
- - the stabilization window MUST be measured from the most recent qualifying mutation
214
- - the implementation MUST treat as synchronization-relevant: element addition or removal, visibility changes, enabled-state changes, navigation transitions, text or content-description changes, subtree structure mutation, and semantic accessibility tree mutation
215
- - the implementation MUST NOT treat as synchronization-relevant: animation frame updates, layout-only jitter, opacity-only visual transitions, and non-semantic rendering updates
216
- - partial convergence MUST NOT be reported as success
217
- - timeout MAY return the last observed state, but MUST NOT report stable convergence
218
-
219
- Guidance:
220
-
221
- - prefer `wait_for_screen_change` for navigation transitions
222
- - prefer `wait_for_ui_change` for in-place updates and recomposition-style changes
223
- - follow with `expect_*` when the expected final state is known
224
-
225
- ## 7. Failure Semantics
226
-
227
- ### 7.1 Canonical Codes
228
-
229
- - `ELEMENT_NOT_FOUND`
230
- - `ELEMENT_NOT_INTERACTABLE`
231
- - `TIMEOUT`
232
- - `NAVIGATION_NO_CHANGE`
233
- - `AMBIGUOUS_TARGET`
234
- - `STALE_REFERENCE`
235
- - `UNKNOWN`
236
-
237
- ### 7.2 Rules
238
-
239
- - `failure_code` MUST be used when a structured mapping exists
240
- - `failure_code` MUST NOT be replaced by string errors
241
- - string errors MAY exist for diagnostics only
242
- - not all tools must emit all codes
243
-
244
- ### 7.3 Scope
245
-
246
- Applies to:
247
-
248
- - action tools
249
- - verification tools
250
- - `wait_for_ui`-style tools
251
-
252
- ## 8. Response Shape
253
-
254
- ### 8.1 Default
255
-
256
- All responses MUST be a single JSON text block.
257
-
258
- ### 8.2 Allowed Exceptions
259
-
260
- Multi-block responses are allowed only for:
261
-
262
- - `get_logs`
263
- - `capture_screenshot`
264
- - `build_and_install`
265
-
266
- ### 8.3 Errors
267
-
268
- All handler/runtime errors MUST be JSON-wrapped.
269
-
270
- String-only errors are not allowed, including fallback handler errors.
271
-
272
- Note: string diagnostics may still appear inside structured JSON payloads where explicitly defined by a tool.
273
-
274
- ## 9. Observation Tools (Extended Semantics)
275
-
276
- Observation tools inspect application state without mutating it.
277
-
278
- Examples:
279
-
280
- - `capture_debug_snapshot`
281
- - `get_screen_fingerprint`
282
- - `get_network_activity`
283
- - `get_logs`
284
-
285
- ### 9.1 Snapshot Response Model
286
-
287
- `capture_debug_snapshot` MUST return a dual-layer response:
288
-
289
- - `raw`: required object
290
- - `semantic`: optional object
291
-
292
- The raw layer is authoritative and MUST remain unchanged from the underlying observation data. It is the source of truth and MUST NOT be interpreted or rewritten.
293
-
294
- The semantic layer is derived, best-effort, and MUST be generated exclusively from the raw layer.
295
-
296
- Raw layer contents include:
297
-
298
- - UI hierarchy or accessibility tree
299
- - normalized readable element state where exposed by the platform
300
- - platform-native identity hints such as stable identifiers, roles, and test tags
301
- - semantic control metadata when derivable from the raw tree, including `semantic_role`, `supported_actions`, `adjustable`, and `state_shape`
302
- - snapshot metadata such as `snapshot_revision` and `captured_at_ms`
303
- - `loading_state` when a reliable loading signal is detectable
304
- - screenshot when available
305
- - element-level attributes
306
- - logs and fingerprint/activity observations
307
- - raw error fields when partial collection fails
308
-
309
- Semantic layer shape when present:
310
-
311
- ```ts
312
- {
313
- screen: string | null,
314
- signals: Record<string, string | number | boolean> | null,
315
- actions_available: string[] | null,
316
- confidence: number,
317
- warnings: string[]
318
- }
319
- ```
320
-
321
- Rules:
322
-
323
- - `confidence` MUST be between 0 and 1
324
- - `warnings` MUST be present when `semantic` is present
325
- - `semantic` MAY be omitted entirely when derivation is not reliable
326
- - `semantic` MUST be treated as unreliable if it conflicts with raw data
327
- - `actions_available` are hints only and MUST NOT be treated as guaranteed executable actions
328
-
329
- ### 9.2 Agent Usage Contract
330
-
331
- Agents SHOULD use `semantic` for primary decision-making when present.
332
-
333
- Agents MUST fall back to `raw` when:
334
-
335
- - `semantic` is missing
336
- - `confidence < 0.7`
337
- - `warnings` is non-empty
338
- - semantic output conflicts with expected state or raw data
339
-
340
- `semantic` is for planning only and MUST NOT be used for verification.
341
-
342
- ### 9.3 Relationship to Classification
343
-
344
- Semantic signals MAY be used as input to `classify_action_outcome`.
345
-
346
- Semantic output MUST NOT replace classification or verification.
347
-
348
- Classification remains a supplementary, post-action interpretation mechanism.
349
-
350
- ### 9.4 Semantic Control Metadata
351
-
352
- When present, semantic control metadata MAY include:
353
-
354
- ```ts
355
- {
356
- semantic_role?: 'slider' | 'stepper' | 'dropdown' | 'segmented_control' | 'custom_adjustable' | 'composite_control' | null,
357
- supported_actions?: string[] | null,
358
- adjustable?: boolean | null,
359
- state_shape?: 'continuous' | 'discrete' | 'semantic' | null
360
- }
361
- ```
362
-
363
- Rules:
364
-
365
- - semantic control metadata is derived and best-effort
366
- - raw platform roles and state remain authoritative on conflict
367
- - `adjustable` MAY be inferred from platform traits when no known role matches
368
- - `state_shape` MUST respect known control roles before value-based heuristics
369
- - `supported_actions` are hints only and MUST NOT be treated as guaranteed executable actions
370
-
371
- ## 10. Classification
372
-
373
- Tool: `classify_action_outcome`
374
-
375
- Rules:
376
-
377
- - MAY use UI, action, network, and log signals
378
- - MUST be deterministic
379
- - MUST NOT replace `expect_*` tools
380
- - MUST be treated as a supplementary signal only
381
- - SHOULD be used with `get_network_activity` only when the outcome is still ambiguous after routing by `action_type`
382
-
383
- It is not a verification mechanism.
384
-
385
- ## 11. Execution Patterns
386
-
387
- Canonical pattern:
388
-
389
- `wait_for_ui -> tap_element -> wait_for_screen_change (optional) -> expect_screen`
390
-
391
- For in-place UI mutations, agents SHOULD prefer:
392
-
393
- `wait_for_ui_change -> expect_element_visible / expect_state`
394
-
395
- Interpretation:
396
-
397
- - `tap_element.success` = executed
398
- - `wait_for_screen_change.success` = UI changed
399
- - `wait_for_ui_change.success` = in-place UI mutation observed and stable
400
- - `expect_screen.success` = correct outcome verified
401
-
402
- ## 12. Known Deviations
403
-
404
- Explicitly allowed:
405
-
406
- - `install_app`, `terminate_app`, `reset_app_data` not using envelope
407
- - `build_and_install` streaming NDJSON
408
- - platform-specific tools
409
- - partial failure coverage
410
- - `scroll_to_element` outcome-based success (temporary exception)
411
- - extended runtime fields in `list_devices`
412
-
413
- ## 13. Migration Rules
414
-
415
- Must change now:
416
-
417
- - uncaught errors must be JSON-wrapped
418
-
419
- Should align when touched:
420
-
421
- - `tap`, `swipe`, `type_text`, `press_back`
422
- - `start_app`, `restart_app`
423
- - `scroll_to_element`
424
- - `wait_for_ui`
425
- - `capture_debug_snapshot`
426
-
427
- No change required:
428
-
429
- - `tap_element`
430
- - `expect_screen`
431
- - `expect_element_visible`
432
- - `wait_for_screen_change`
433
-
434
- ## 14. Guiding Principles
435
-
436
- - Actions execute
437
- - Verification proves
438
- - Waiting synchronizes
439
- - Classification assists
440
-
441
- ## Final Definition
442
-
443
- Action success equals execution success.
444
- Outcome success equals verification success.
445
-
446
- Verification tools are authoritative when the expected outcome is defined.
@@ -1,29 +0,0 @@
1
- import { debuggerContracts } from './debugger-schema.js'
2
- import { debuggerSessions, debuggerCapabilities } from '../debugger/sessions.js'
3
- import { DebuggerError, withDebuggerBudget } from '../debugger/worker.js'
4
- import { wrapResponse, type ToolCallArgs } from './common.js'
5
- function failure(code: string, summary: Record<string, unknown> = {}) {
6
- return { ...wrapResponse({ debug_session_id: null, device: null, target: null, state: null,
7
- captured_at_ms: Date.now(), capabilities: debuggerCapabilities, limitations: [], cleanup: null,
8
- ...summary, success: false, error: { code, message: code, retryable: false } }), isError: true }
9
- }
10
- export async function handleDebugger(name: string, args: ToolCallArgs, signal?: AbortSignal) {
11
- const parsed = debuggerContracts[name].schema.safeParse(args)
12
- if (!parsed.success) return failure('INVALID_ARGUMENT')
13
- const a = parsed.data as Record<string, any>
14
- const command = debuggerContracts[name].command
15
- try {
16
- if (signal?.aborted) throw new DebuggerError('DEBUGGER_CANCELLED')
17
- const result = await withDebuggerBudget(a.timeoutMs, signal, async () => command === 'capabilities' ? await debuggerSessions.capabilities(a.deviceId, a.appId, a.processId) :
18
- command === 'attach' ? await debuggerSessions.attach(a.deviceId, a.appId, a.processId, a.timeoutMs) :
19
- await debuggerSessions.command(a.debugSessionId, command, { ...a, signal: command === 'events' ? signal : undefined }, a.timeoutMs))
20
- if (signal?.aborted && command === 'capabilities') throw new DebuggerError('DEBUGGER_CANCELLED')
21
- return { ...wrapResponse(result), ...(!result.success ? { isError: true } : {}) }
22
- } catch (e) {
23
- const code = e instanceof DebuggerError ? e.code : 'DEBUGGER_WORKER_FAILED'
24
- let summary: any = {}
25
- if (a.debugSessionId) { try { summary = debuggerSessions.summary(a.debugSessionId) } catch { /* Unknown session */ } }
26
- return failure(code, { debug_session_id: a.debugSessionId ?? null,
27
- device: a.deviceId ? { platform: 'android', id: a.deviceId } : null, ...summary })
28
- }
29
- }