mobile-debug-mcp 0.34.0 → 0.36.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 (500) 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/.cursor-plugin/marketplace.json +1 -1
  11. package/.github/copilot-instructions.md +14 -36
  12. package/.github/workflows/ci.yml +4 -4
  13. package/AGENTS.md +12 -3
  14. package/CONTRIBUTING.md +79 -0
  15. package/README.md +218 -129
  16. package/agent-plugin/.antigravity-plugin/README.md +48 -0
  17. package/agent-plugin/.antigravity-plugin/plugin.json +18 -0
  18. package/agent-plugin/.claude-plugin/plugin.json +2 -2
  19. package/agent-plugin/.codex-plugin/plugin.json +1 -1
  20. package/agent-plugin/.cursor-plugin/plugin.json +2 -2
  21. package/agent-plugin/.mcp.json +1 -1
  22. package/agent-plugin/README.md +50 -11
  23. package/agent-plugin/cursor/.cursor-plugin/plugin.json +23 -0
  24. package/agent-plugin/cursor/LICENSE +201 -0
  25. package/agent-plugin/cursor/README.md +9 -0
  26. package/agent-plugin/cursor/skills/mobile-debug-mcp/SKILL.md +253 -0
  27. package/agent-plugin/mcp.json +1 -1
  28. package/agent-plugin/mcp_config.json +13 -0
  29. package/agent-plugin/plugin.json +1 -1
  30. package/agent-plugin/skills/mobile-debug-mcp/SKILL.md +62 -17
  31. package/dist/contracts/execution-controls.js +24 -0
  32. package/dist/contracts/selector.js +8 -0
  33. package/dist/contracts/target.js +15 -0
  34. package/dist/contracts/ui.js +1 -0
  35. package/dist/debugger/android.js +2 -1
  36. package/dist/debugger/diagnostics.js +54 -0
  37. package/dist/debugger/guard.js +4 -4
  38. package/dist/debugger/ios-worker.js +62 -0
  39. package/dist/debugger/ios.js +57 -0
  40. package/dist/debugger/protocol.js +33 -0
  41. package/dist/debugger/sessions.js +133 -74
  42. package/dist/debugger/worker.js +59 -46
  43. package/dist/interact/adjustment/adjustment-context.js +41 -0
  44. package/dist/interact/adjustment/adjustment-gestures.js +55 -0
  45. package/dist/interact/adjustment/adjustment-plan.js +18 -0
  46. package/dist/interact/adjustment/adjustment-resolution.js +127 -0
  47. package/dist/interact/adjustment/adjustment-result.js +19 -0
  48. package/dist/interact/adjustment/adjustment-semantic.js +64 -0
  49. package/dist/interact/adjustment/adjustment-verification.js +35 -0
  50. package/dist/interact/adjustment/adjustment.js +52 -0
  51. package/dist/interact/adjustment/control-geometry.js +87 -0
  52. package/dist/interact/adjustment/control-values.js +136 -0
  53. package/dist/interact/adjustment/slider-labels.js +84 -0
  54. package/dist/interact/assertions/screen-assertion.js +37 -0
  55. package/dist/interact/assertions/state-assertion-context.js +35 -0
  56. package/dist/interact/assertions/state-assertion.js +76 -0
  57. package/dist/interact/assertions/state-comparison.js +141 -0
  58. package/dist/interact/assertions/visibility-assertion.js +34 -0
  59. package/dist/interact/conditional-action.js +12 -7
  60. package/dist/interact/index.js +77 -3092
  61. package/dist/interact/input-service.js +1 -0
  62. package/dist/interact/interaction-trace.js +21 -0
  63. package/dist/interact/model.js +1 -0
  64. package/dist/interact/observation.js +1 -0
  65. package/dist/interact/targeting/candidate-ancestor.js +58 -0
  66. package/dist/interact/targeting/candidate-result.js +23 -0
  67. package/dist/interact/targeting/candidate-scoring.js +50 -0
  68. package/dist/interact/targeting/element-helpers.js +216 -0
  69. package/dist/interact/targeting/find-element.js +65 -0
  70. package/dist/interact/targeting/nearby-control.js +56 -0
  71. package/dist/interact/targeting/resolved-elements.js +21 -0
  72. package/dist/interact/targeting/tap-target.js +17 -0
  73. package/dist/interact/targeting/target-scope.js +104 -0
  74. package/dist/interact/waits/legacy-log-wait.js +38 -0
  75. package/dist/interact/waits/legacy-wait-observations.js +103 -0
  76. package/dist/interact/waits/legacy-wait-state.js +34 -0
  77. package/dist/interact/waits/legacy-wait.js +48 -0
  78. package/dist/interact/waits/screen-wait.js +49 -0
  79. package/dist/interact/waits/ui-change-helpers.js +157 -0
  80. package/dist/interact/waits/ui-change-state.js +18 -0
  81. package/dist/interact/waits/ui-change-wait.js +77 -0
  82. package/dist/interact/waits/ui-wait-condition.js +56 -0
  83. package/dist/interact/waits/ui-wait-state.js +38 -0
  84. package/dist/interact/waits/ui-wait.js +106 -0
  85. package/dist/manage/android.js +55 -51
  86. package/dist/manage/index.js +38 -75
  87. package/dist/manage/ios/build-types.js +1 -0
  88. package/dist/manage/ios/build.js +210 -0
  89. package/dist/manage/ios/project-discovery.js +29 -0
  90. package/dist/manage/ios/scheme.js +18 -0
  91. package/dist/manage/ios.js +44 -256
  92. package/dist/observe/android/context.js +1 -0
  93. package/dist/observe/android/current-screen.js +55 -0
  94. package/dist/observe/android/fingerprint.js +13 -0
  95. package/dist/observe/android/log-stream.js +132 -0
  96. package/dist/observe/android/logs.js +107 -0
  97. package/dist/observe/android/screenshot.js +70 -0
  98. package/dist/observe/android/ui-tree.js +107 -0
  99. package/dist/observe/android.js +16 -520
  100. package/dist/observe/evidence.js +114 -75
  101. package/dist/observe/index.js +16 -263
  102. package/dist/observe/ios/context.js +16 -0
  103. package/dist/observe/ios/fingerprint.js +12 -0
  104. package/dist/observe/ios/log-stream.js +105 -0
  105. package/dist/observe/ios/logs.js +168 -0
  106. package/dist/observe/ios/screenshot.js +22 -0
  107. package/dist/observe/ios/ui-elements.js +241 -0
  108. package/dist/observe/ios/ui-tree.js +137 -0
  109. package/dist/observe/ios-trace/artifact.js +63 -0
  110. package/dist/observe/ios-trace/capabilities.js +86 -0
  111. package/dist/observe/ios-trace/native.js +93 -0
  112. package/dist/observe/ios-trace/notification.js +35 -0
  113. package/dist/observe/ios-trace/process.js +98 -0
  114. package/dist/observe/ios-trace/sessions.js +244 -0
  115. package/dist/observe/ios.js +17 -715
  116. package/dist/observe/logs/model.js +1 -0
  117. package/dist/{network → observe/network}/index.js +2 -2
  118. package/dist/observe/readiness-service.js +5 -3
  119. package/dist/observe/readiness.js +33 -14
  120. package/dist/observe/screenshot-encoding.js +41 -0
  121. package/dist/observe/snapshot-collection.js +79 -0
  122. package/dist/observe/snapshot-logs.js +30 -0
  123. package/dist/observe/snapshot-metadata.js +43 -31
  124. package/dist/observe/snapshot-semantic.js +115 -0
  125. package/dist/observe/system-trace-error.js +7 -0
  126. package/dist/observe/system-trace-router.js +81 -0
  127. package/dist/observe/system-trace.js +26 -21
  128. package/dist/runtime/action-results.js +270 -0
  129. package/dist/runtime/clock.js +4 -0
  130. package/dist/server/common.js +1 -256
  131. package/dist/server/definitions/assert.js +162 -0
  132. package/dist/server/definitions/diagnostic.js +118 -0
  133. package/dist/server/definitions/input.js +274 -0
  134. package/dist/server/definitions/manage.js +194 -0
  135. package/dist/server/definitions/observe.js +149 -0
  136. package/dist/server/definitions/target.js +138 -0
  137. package/dist/server/definitions/wait.js +105 -0
  138. package/dist/server/handlers/action-execution.js +163 -0
  139. package/dist/server/handlers/correlation.js +23 -0
  140. package/dist/server/handlers/debugger-handlers.js +67 -0
  141. package/dist/server/handlers/debugger-response.js +9 -0
  142. package/dist/server/handlers/diagnostic.js +77 -0
  143. package/dist/server/handlers/handler-types.js +1 -0
  144. package/dist/server/handlers/input.js +154 -0
  145. package/dist/server/handlers/interact.js +113 -0
  146. package/dist/server/handlers/journey-assertions.js +35 -0
  147. package/dist/server/handlers/journey.js +147 -0
  148. package/dist/server/handlers/manage.js +119 -0
  149. package/dist/server/handlers/observe.js +95 -0
  150. package/dist/server/handlers/payload.js +4 -0
  151. package/dist/server/handlers/tool-handlers.js +170 -0
  152. package/dist/server/schemas/condition-schema.js +2 -0
  153. package/dist/server/{debugger-schema.js → schemas/debugger-schema.js} +20 -12
  154. package/dist/server/{journey-schema.js → schemas/journey-schema.js} +7 -22
  155. package/dist/server/schemas/system-trace-schema.js +22 -0
  156. package/dist/server/tool-definitions.js +58 -1135
  157. package/dist/server-core.js +2 -2
  158. package/dist/server.js +4 -4
  159. package/dist/system/android-status.js +101 -0
  160. package/dist/system/android.js +37 -27
  161. package/dist/system/index.js +13 -439
  162. package/dist/system/ios-status.js +132 -0
  163. package/dist/system/ios.js +11 -8
  164. package/dist/system/model.js +1 -0
  165. package/dist/system/probes.js +105 -0
  166. package/dist/system/status-summary.js +43 -0
  167. package/dist/system/unsupported-status.js +52 -0
  168. package/dist/utils/android/commands.js +89 -0
  169. package/dist/utils/android/gradle.js +139 -0
  170. package/dist/utils/android/logs.js +103 -0
  171. package/dist/utils/android/ui-tree.js +233 -0
  172. package/dist/utils/android/utils.js +6 -564
  173. package/dist/utils/cli/idb/idb-helper.js +4 -6
  174. package/dist/utils/cli/idb/install-idb.js +13 -9
  175. package/dist/utils/cli/ios/preflight-ios.js +42 -38
  176. package/dist/utils/ios/utils.js +48 -46
  177. package/dist/utils/java.js +65 -49
  178. package/dist/utils/resolve-device.js +4 -2
  179. package/dist/utils/ui/index.js +26 -26
  180. package/docs/CHANGELOG.md +67 -1
  181. package/docs/README.md +38 -0
  182. package/docs/agent-plugin-installation-verification.md +39 -0
  183. package/docs/benchmarks/README.md +18 -0
  184. package/docs/benchmarks/interaction-latency/README.md +14 -0
  185. package/docs/benchmarks/interaction-latency/final.md +4 -1
  186. package/docs/benchmarks/interaction-latency/ios-validation.md +2 -0
  187. package/docs/benchmarks/ui-tree-performance/README.md +24 -16
  188. package/docs/benchmarks/ui-tree-performance/comparison.md +11 -10
  189. package/docs/code-structure.md +120 -0
  190. package/docs/specs/001-state-verification/spec.md +16 -14
  191. package/docs/specs/002-richer-element-identity/spec.md +12 -10
  192. package/docs/specs/003-wait-and-synchronization-reliability/spec.md +12 -10
  193. package/docs/specs/004-action-verification-routing/spec.md +3 -3
  194. package/docs/specs/005-unified-action-execution-and-verification-model/spec.md +2 -0
  195. package/docs/specs/006-runtime-action-instrumentation-and-binding-layer/spec.md +2 -0
  196. package/docs/specs/007-actionability-resolution-and-executable-target-selection/spec.md +3 -1
  197. package/docs/specs/008-adjustable-control-support-and-semantic-value-manipulation/spec.md +3 -4
  198. package/docs/specs/009-semantic-control-modeling-for-custom-and-composite-controls/spec.md +2 -0
  199. package/docs/specs/010-verification-stabilization-and-temporal-convergence/spec.md +2 -2
  200. package/docs/specs/011-recovery-and-replanning-for-failed-or-ambiguous-interaction-flows/spec.md +2 -2
  201. package/docs/specs/011.1-recovery-contract-types-and-runtime-wiring-spec/spec.md +2 -0
  202. package/docs/specs/012-action-trace-and-xecution-observability/spec.md +2 -3
  203. package/docs/specs/013-wait-and-synchronization-reliability/spec.md +19 -19
  204. package/docs/specs/014-actionability-resolution/spec.md +20 -18
  205. package/docs/specs/015-adjustable-control-support/spec.md +17 -15
  206. package/docs/specs/016-environment-tools/spec.md +20 -20
  207. package/docs/specs/018-interaction-latency-and-batched-journeys/spec.md +2 -0
  208. package/docs/specs/019-ui-tree-observation-performance/spec.md +3 -1
  209. package/docs/specs/020-conditional-actions/intent.md +5 -3
  210. package/docs/specs/020-conditional-actions/plan.md +8 -9
  211. package/docs/specs/020-conditional-actions/spec.md +4 -2
  212. package/docs/specs/021-app-readiness-signals/intent.md +4 -2
  213. package/docs/specs/021-app-readiness-signals/plan.md +7 -6
  214. package/docs/specs/021-app-readiness-signals/spec.md +3 -1
  215. package/docs/specs/022-correlated-evidence/intent.md +4 -4
  216. package/docs/specs/022-correlated-evidence/plan.md +10 -11
  217. package/docs/specs/022-correlated-evidence/spec.md +3 -1
  218. package/docs/specs/023-android-system-traces/intent.md +3 -2
  219. package/docs/specs/023-android-system-traces/plan.md +5 -7
  220. package/docs/specs/023-android-system-traces/spec.md +3 -1
  221. package/docs/specs/024-android-heap-dump-capture/intent.md +3 -1
  222. package/docs/specs/025-android-runtime-debugger/intent.md +4 -3
  223. package/docs/specs/025-android-runtime-debugger/plan.md +3 -1
  224. package/docs/specs/025-android-runtime-debugger/spec.md +4 -3
  225. package/docs/specs/026-code-structure-and-quality-gates/health-plan.md +88 -0
  226. package/docs/specs/026-code-structure-and-quality-gates/intent.md +47 -0
  227. package/docs/specs/026-code-structure-and-quality-gates/plan.md +191 -0
  228. package/docs/specs/026-code-structure-and-quality-gates/spec.md +138 -0
  229. package/docs/specs/026-code-structure-and-quality-gates/verification-final.json +200 -0
  230. package/docs/specs/026-code-structure-and-quality-gates/verification-thin-facade.json +154 -0
  231. package/docs/specs/026-code-structure-and-quality-gates/verification.json +136 -0
  232. package/docs/specs/027-debugger-failure-diagnostics/intent.md +43 -0
  233. package/docs/specs/027-debugger-failure-diagnostics/plan.md +86 -0
  234. package/docs/specs/027-debugger-failure-diagnostics/spec.md +133 -0
  235. package/docs/specs/028-compact-debugger-responses/intent.md +41 -0
  236. package/docs/specs/028-compact-debugger-responses/plan.md +112 -0
  237. package/docs/specs/028-compact-debugger-responses/spec.md +108 -0
  238. package/docs/specs/029-kotlin-locals-validation/report.md +119 -0
  239. package/docs/specs/030-android-coroutine-validation/evidence.json +475 -0
  240. package/docs/specs/030-android-coroutine-validation/intent.md +47 -0
  241. package/docs/specs/030-android-coroutine-validation/plan.md +147 -0
  242. package/docs/specs/030-android-coroutine-validation/report.md +240 -0
  243. package/docs/specs/030-android-coroutine-validation/spec.md +107 -0
  244. package/docs/specs/031-ios-system-traces/intent.md +38 -0
  245. package/docs/specs/031-ios-system-traces/investigation.md +92 -0
  246. package/docs/specs/031-ios-system-traces/late-run-failure-evidence.json +32 -0
  247. package/docs/specs/031-ios-system-traces/plan.md +138 -0
  248. package/docs/specs/031-ios-system-traces/pr102-monitor-evidence.json +22 -0
  249. package/docs/specs/031-ios-system-traces/simulator-evidence.json +47 -0
  250. package/docs/specs/031-ios-system-traces/spec.md +135 -0
  251. package/docs/specs/032-ios-runtime-debugger/evidence.json +176 -0
  252. package/docs/specs/032-ios-runtime-debugger/intent.md +38 -0
  253. package/docs/specs/032-ios-runtime-debugger/plan.md +95 -0
  254. package/docs/specs/032-ios-runtime-debugger/report.md +205 -0
  255. package/docs/specs/032-ios-runtime-debugger/spec.md +153 -0
  256. package/docs/tools/TOOLS.md +31 -18
  257. package/docs/tools/{evidence.md → correlated-evidence.md} +9 -1
  258. package/docs/tools/debugger.md +120 -4
  259. package/docs/tools/interact.md +42 -20
  260. package/docs/tools/manage.md +25 -44
  261. package/docs/tools/observe.md +55 -23
  262. package/docs/tools/system-traces.md +89 -14
  263. package/docs/tools/system.md +12 -5
  264. package/package.json +12 -8
  265. package/scripts/agent-plugin.mjs +55 -5
  266. package/scripts/architecture-graph.mjs +69 -0
  267. package/scripts/check-architecture.mjs +47 -0
  268. package/scripts/code-quality-baseline.json +1 -0
  269. package/scripts/code-quality.mjs +161 -0
  270. package/src/contracts/execution-controls.ts +26 -0
  271. package/src/contracts/selector.ts +17 -0
  272. package/src/contracts/target.ts +19 -0
  273. package/src/contracts/ui.ts +94 -0
  274. package/src/debugger/android.ts +3 -2
  275. package/src/debugger/diagnostics.ts +43 -0
  276. package/src/debugger/guard.ts +10 -5
  277. package/src/debugger/ios-worker.ts +49 -0
  278. package/src/debugger/ios.ts +45 -0
  279. package/{worker → src/debugger/java}/DebuggerWorker.java +9 -3
  280. package/src/debugger/lldb/breakpoints.py +51 -0
  281. package/src/debugger/lldb/inspection.py +109 -0
  282. package/src/debugger/lldb/worker.py +203 -0
  283. package/src/debugger/protocol.ts +37 -0
  284. package/src/debugger/sessions.ts +326 -155
  285. package/src/debugger/worker.ts +57 -41
  286. package/src/interact/adjustment/adjustment-context.ts +83 -0
  287. package/src/interact/adjustment/adjustment-gestures.ts +48 -0
  288. package/src/interact/adjustment/adjustment-plan.ts +23 -0
  289. package/src/interact/adjustment/adjustment-resolution.ts +104 -0
  290. package/src/interact/adjustment/adjustment-result.ts +34 -0
  291. package/src/interact/adjustment/adjustment-semantic.ts +53 -0
  292. package/src/interact/adjustment/adjustment-verification.ts +60 -0
  293. package/src/interact/adjustment/adjustment.ts +49 -0
  294. package/src/interact/adjustment/control-geometry.ts +120 -0
  295. package/src/interact/adjustment/control-values.ts +141 -0
  296. package/src/interact/adjustment/slider-labels.ts +84 -0
  297. package/src/interact/assertions/screen-assertion.ts +39 -0
  298. package/src/interact/assertions/state-assertion-context.ts +48 -0
  299. package/src/interact/assertions/state-assertion.ts +64 -0
  300. package/src/interact/assertions/state-comparison.ts +168 -0
  301. package/src/interact/assertions/visibility-assertion.ts +41 -0
  302. package/src/interact/conditional-action.ts +18 -12
  303. package/src/interact/index.ts +89 -3494
  304. package/src/interact/input-service.ts +11 -0
  305. package/src/interact/interaction-trace.ts +36 -0
  306. package/src/interact/model.ts +109 -0
  307. package/src/interact/observation.ts +7 -0
  308. package/src/interact/targeting/candidate-ancestor.ts +49 -0
  309. package/src/interact/targeting/candidate-result.ts +24 -0
  310. package/src/interact/targeting/candidate-scoring.ts +42 -0
  311. package/src/interact/targeting/element-helpers.ts +243 -0
  312. package/src/interact/targeting/find-element.ts +47 -0
  313. package/src/interact/targeting/nearby-control.ts +46 -0
  314. package/src/interact/targeting/resolved-elements.ts +20 -0
  315. package/src/interact/targeting/tap-target.ts +22 -0
  316. package/src/interact/targeting/target-scope.ts +121 -0
  317. package/src/interact/waits/legacy-log-wait.ts +30 -0
  318. package/src/interact/waits/legacy-wait-observations.ts +55 -0
  319. package/src/interact/waits/legacy-wait-state.ts +48 -0
  320. package/src/interact/waits/legacy-wait.ts +34 -0
  321. package/src/interact/waits/screen-wait.ts +37 -0
  322. package/src/interact/waits/ui-change-helpers.ts +184 -0
  323. package/src/interact/waits/ui-change-state.ts +26 -0
  324. package/src/interact/waits/ui-change-wait.ts +59 -0
  325. package/src/interact/waits/ui-wait-condition.ts +52 -0
  326. package/src/interact/waits/ui-wait-state.ts +55 -0
  327. package/src/interact/waits/ui-wait.ts +84 -0
  328. package/src/manage/android.ts +56 -50
  329. package/src/manage/index.ts +63 -93
  330. package/src/manage/ios/build-types.ts +14 -0
  331. package/src/manage/ios/build.ts +230 -0
  332. package/src/manage/ios/project-discovery.ts +26 -0
  333. package/src/manage/ios/scheme.ts +16 -0
  334. package/src/manage/ios.ts +67 -298
  335. package/src/observe/android/context.ts +1 -0
  336. package/src/observe/android/current-screen.ts +63 -0
  337. package/src/observe/android/fingerprint.ts +13 -0
  338. package/src/observe/android/log-stream.ts +127 -0
  339. package/src/observe/android/logs.ts +110 -0
  340. package/src/observe/android/screenshot.ts +79 -0
  341. package/src/observe/android/ui-tree.ts +113 -0
  342. package/src/observe/android.ts +17 -531
  343. package/src/observe/evidence.ts +122 -70
  344. package/src/observe/index.ts +24 -286
  345. package/src/observe/ios/context.ts +22 -0
  346. package/src/observe/ios/fingerprint.ts +12 -0
  347. package/src/observe/ios/log-stream.ts +103 -0
  348. package/src/observe/ios/logs.ts +179 -0
  349. package/src/observe/ios/screenshot.ts +26 -0
  350. package/src/observe/ios/ui-elements.ts +266 -0
  351. package/src/observe/ios/ui-tree.ts +143 -0
  352. package/src/observe/ios-trace/artifact.ts +55 -0
  353. package/src/observe/ios-trace/capabilities.ts +74 -0
  354. package/src/observe/ios-trace/native.ts +72 -0
  355. package/src/observe/ios-trace/notification.ts +30 -0
  356. package/src/observe/ios-trace/process.ts +82 -0
  357. package/src/observe/ios-trace/sessions.ts +204 -0
  358. package/src/observe/ios.ts +18 -749
  359. package/src/observe/logs/model.ts +11 -0
  360. package/src/{network → observe/network}/index.ts +2 -2
  361. package/src/observe/readiness-service.ts +6 -4
  362. package/src/observe/readiness.ts +42 -21
  363. package/src/observe/screenshot-encoding.ts +32 -0
  364. package/src/observe/snapshot-collection.ts +69 -0
  365. package/src/observe/snapshot-logs.ts +26 -0
  366. package/src/observe/snapshot-metadata.ts +51 -31
  367. package/src/observe/snapshot-semantic.ts +153 -0
  368. package/src/observe/system-trace-error.ts +3 -0
  369. package/src/observe/system-trace-router.ts +61 -0
  370. package/src/observe/system-trace.ts +28 -19
  371. package/src/runtime/action-results.ts +376 -0
  372. package/src/runtime/clock.ts +9 -0
  373. package/src/server/common.ts +9 -359
  374. package/src/server/definitions/assert.ts +164 -0
  375. package/src/server/definitions/diagnostic.ts +120 -0
  376. package/src/server/definitions/input.ts +276 -0
  377. package/src/server/definitions/manage.ts +196 -0
  378. package/src/server/definitions/observe.ts +151 -0
  379. package/src/server/definitions/target.ts +140 -0
  380. package/src/server/definitions/wait.ts +107 -0
  381. package/src/server/handlers/action-execution.ts +164 -0
  382. package/src/server/handlers/correlation.ts +20 -0
  383. package/src/server/handlers/debugger-handlers.ts +58 -0
  384. package/src/server/handlers/debugger-response.ts +7 -0
  385. package/src/server/handlers/diagnostic.ts +86 -0
  386. package/src/server/handlers/handler-types.ts +7 -0
  387. package/src/server/handlers/input.ts +173 -0
  388. package/src/server/handlers/interact.ts +135 -0
  389. package/src/server/handlers/journey-assertions.ts +39 -0
  390. package/src/server/handlers/journey.ts +132 -0
  391. package/src/server/handlers/manage.ts +141 -0
  392. package/src/server/handlers/observe.ts +116 -0
  393. package/src/server/handlers/payload.ts +36 -0
  394. package/src/server/handlers/tool-handlers.ts +170 -0
  395. package/src/server/schemas/condition-schema.ts +2 -0
  396. package/src/server/schemas/debugger-schema.ts +46 -0
  397. package/src/server/{journey-schema.ts → schemas/journey-schema.ts} +7 -22
  398. package/src/server/schemas/system-trace-schema.ts +23 -0
  399. package/src/server/tool-definitions.ts +67 -1143
  400. package/src/server-core.ts +2 -2
  401. package/src/server.ts +4 -4
  402. package/src/system/android-status.ts +124 -0
  403. package/src/system/android.ts +33 -21
  404. package/src/system/index.ts +21 -525
  405. package/src/system/ios-status.ts +147 -0
  406. package/src/system/ios.ts +14 -10
  407. package/src/system/model.ts +41 -0
  408. package/src/system/probes.ts +114 -0
  409. package/src/system/status-summary.ts +47 -0
  410. package/src/system/unsupported-status.ts +55 -0
  411. package/src/types.ts +16 -106
  412. package/src/utils/android/commands.ts +81 -0
  413. package/src/utils/android/gradle.ts +132 -0
  414. package/src/utils/android/logs.ts +103 -0
  415. package/src/utils/android/ui-tree.ts +239 -0
  416. package/src/utils/android/utils.ts +16 -556
  417. package/src/utils/cli/idb/check-idb.ts +4 -4
  418. package/src/utils/cli/idb/idb-helper.ts +6 -8
  419. package/src/utils/cli/idb/install-idb.ts +15 -9
  420. package/src/utils/cli/ios/preflight-ios.ts +39 -31
  421. package/src/utils/cli/ios/run-ios-ui-tree-tap.ts +4 -4
  422. package/src/utils/ios/utils.ts +60 -61
  423. package/src/utils/java.ts +62 -43
  424. package/src/utils/resolve-device.ts +9 -6
  425. package/src/utils/ui/index.ts +28 -28
  426. package/test/device/automated/debugger/coroutine-lifecycle.ts +27 -0
  427. package/test/device/automated/debugger/coroutine-support.ts +140 -0
  428. package/test/device/automated/debugger/coroutine.android.test.ts +169 -0
  429. package/test/device/automated/debugger/kotlin.android.test.ts +127 -0
  430. package/test/device/automated/debugger/runtime.android.test.ts +19 -3
  431. package/test/device/automated/debugger/runtime.ios.test.ts +221 -0
  432. package/test/device/automated/interact/interaction.android.test.ts +56 -0
  433. package/test/device/automated/observe/ios-system-trace.smoke.ts +119 -0
  434. package/test/device/automated/observe/system-trace.smoke.ts +1 -1
  435. package/test/device/manual/interact/modul8_selector_tap.manual.ts +1 -1
  436. package/test/fixtures/contracts/tool-definitions.json +3696 -0
  437. package/test/fixtures/coroutine-app/MainActivity.kt +100 -0
  438. package/test/fixtures/coroutine-app/README.md +48 -0
  439. package/test/fixtures/coroutine-app/build.ts +35 -0
  440. package/test/fixtures/debugger-app/MainActivity.java +21 -0
  441. package/test/fixtures/debugger-app/MainActivity.kt +32 -0
  442. package/test/fixtures/debugger-app/README.md +52 -0
  443. package/test/fixtures/debugger-app/build.ts +25 -15
  444. package/test/fixtures/ios-debugger-app/Main.swift +95 -0
  445. package/test/fixtures/ios-debugger-app/README.md +27 -0
  446. package/test/fixtures/ios-debugger-app/build.ts +21 -0
  447. package/test/fixtures/latency-journey-app/README.md +2 -0
  448. package/test/fixtures/readiness-app/README.md +2 -0
  449. package/test/helpers/ios-trace-shutdown.ts +29 -0
  450. package/test/unit/debugger/coroutine-lifecycle.test.ts +43 -0
  451. package/test/unit/debugger/diagnostic-sessions.test.ts +67 -0
  452. package/test/unit/debugger/diagnostics.test.ts +80 -0
  453. package/test/unit/debugger/guards.test.ts +4 -0
  454. package/test/unit/debugger/handle-guards.test.ts +88 -0
  455. package/test/unit/debugger/ios-preparation.test.ts +57 -0
  456. package/test/unit/debugger/ios.test.ts +104 -0
  457. package/test/unit/debugger/lldb-worker.py +166 -0
  458. package/test/unit/debugger/lldb-worker.test.ts +10 -0
  459. package/test/unit/debugger/preparation.test.ts +32 -0
  460. package/test/unit/debugger/protocol.test.ts +15 -0
  461. package/test/unit/debugger/sessions.test.ts +1 -1
  462. package/test/unit/interact/adjustment_service.test.ts +42 -0
  463. package/test/unit/interact/adjustment_verification.test.ts +35 -0
  464. package/test/unit/interact/clock_dependencies.test.ts +63 -0
  465. package/test/unit/interact/element_helpers.test.ts +19 -0
  466. package/test/unit/interact/legacy_wait_service.test.ts +17 -0
  467. package/test/unit/interact/state_comparison.test.ts +20 -0
  468. package/test/unit/interact/target_scope.test.ts +35 -0
  469. package/test/unit/network/get_network_activity.test.ts +1 -1
  470. package/test/unit/observe/ios-trace-native.test.ts +90 -0
  471. package/test/unit/observe/ios-trace-sessions.test.ts +131 -0
  472. package/test/unit/observe/readiness.test.ts +1 -1
  473. package/test/unit/observe/screenshot-encoding.test.ts +30 -0
  474. package/test/unit/observe/snapshot-logs.test.ts +14 -0
  475. package/test/unit/observe/system-trace-router.test.ts +49 -0
  476. package/test/unit/quality/agent-plugin-export.test.ts +38 -0
  477. package/test/unit/quality/architecture.test.ts +60 -0
  478. package/test/unit/quality/code-quality.test.ts +58 -0
  479. package/test/unit/quality/interaction_boundaries.test.ts +24 -0
  480. package/test/unit/server/conditional_actions.test.ts +1 -1
  481. package/test/unit/server/conditional_schema.test.ts +2 -2
  482. package/test/unit/server/debugger-response.test.ts +63 -0
  483. package/test/unit/server/system-trace.test.ts +12 -3
  484. package/test/unit/server/tool_definitions_parity.test.ts +8 -0
  485. package/dist/server/debugger-handlers.js +0 -38
  486. package/dist/server/system-trace-schema.js +0 -17
  487. package/dist/server/tool-handlers.js +0 -1000
  488. package/docs/ROADMAP.md +0 -646
  489. package/docs/benchmarks/ui-tree-performance/bridge-probe.json +0 -29
  490. package/docs/benchmarks/ui-tree-performance/initial-baseline.json +0 -59560
  491. package/docs/specs/baseline-spec-v0.md +0 -312
  492. package/docs/specs/mcp-tooling-spec-v1.md +0 -446
  493. package/src/server/debugger-handlers.ts +0 -29
  494. package/src/server/debugger-schema.ts +0 -37
  495. package/src/server/system-trace-schema.ts +0 -17
  496. package/src/server/tool-handlers.ts +0 -1008
  497. /package/dist/{server/condition-schema.js → contracts/condition.js} +0 -0
  498. /package/dist/server/{readiness-schema.js → schemas/readiness-schema.js} +0 -0
  499. /package/src/{server/condition-schema.ts → contracts/condition.ts} +0 -0
  500. /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
- }
@@ -1,37 +0,0 @@
1
- import { z } from 'zod'
2
- const text = z.string().min(1).max(512)
3
- const integer = z.number().int().safe().positive()
4
- const timeout = z.number().int().min(100).max(30000)
5
- const target = { platform: z.literal('android'), deviceId: text, appId: text.regex(/^[A-Za-z][\w]*(?:\.[A-Za-z][\w]*)+$/), processId: integer.optional() }
6
- const session = { debugSessionId: text }
7
- const stop = { ...session, stopId: text }
8
- const specs = {
9
- get_debugger_capabilities: { fields: target, command: 'capabilities', description: 'Probe optional Android JDK/JDWP prerequisites and matching running debuggable processes; does not attach.' },
10
- attach_debugger: { fields: target, command: 'attach', description: 'Attach an owned Android JDI session. Requires an explicit device and debuggable app; choose processId when ambiguous. Stops suspend all app threads. Auto-detach: 60s paused, 5m idle, 30m total.' },
11
- get_debugger_state: { fields: session, command: 'state', description: 'Read debugger state, current stop and breakpoint/cleanup status.' },
12
- set_debugger_breakpoint: { fields: { ...session, className: text.regex(/^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*$/), line: integer }, command: 'set', description: 'Set an exact binary-class and executable-source-line breakpoint; unloaded classes remain pending. No silent line relocation.' },
13
- remove_debugger_breakpoint: { fields: { ...session, breakpointId: text }, command: 'remove', description: 'Remove an owned breakpoint; repeated removal succeeds.' },
14
- wait_for_debugger_event: { fields: { ...session, afterSequence: z.number().int().safe().min(0).optional() }, command: 'events', description: 'Wait for bounded debugger events after a sequence cursor. Empty timeout does not affect execution; overflow is explicit.' },
15
- get_debugger_stack: { fields: { ...stop, threadId: text, offset: z.number().int().min(0).max(999).optional(), limit: z.number().int().min(1).max(100).optional() }, command: 'stack', description: 'Read bounded stack frames for a stopped thread; IDs expire on resume.' },
16
- get_debugger_locals: { fields: { ...stop, frameId: text }, command: 'locals', description: 'Read at most 100 shallow locals. Sensitive values returned only on request; strings truncate at 256 characters. No evaluation or field traversal.' },
17
- step_debugger: { fields: { ...stop, threadId: text, kind: z.enum(['into', 'over', 'out']) }, command: 'step', description: 'Acknowledge one-shot line stepping and resume. Wait for a subsequent stop event separately.' },
18
- resume_debugger: { fields: stop, command: 'resume', description: 'Resume owned debugger suspension and immediately expire stopped references.' },
19
- detach_debugger: { fields: session, command: 'detach', description: 'Dispose the owned debugger connection, release owned suspension and remove its exact forward. Idempotent; retries incomplete cleanup.' }
20
- }
21
- // Derive JSON schemas and runtime validation from the same small Zod field vocabulary.
22
- function jsonField(schema: z.ZodTypeAny): any {
23
- if (schema instanceof z.ZodOptional) return jsonField(schema.unwrap())
24
- if (schema instanceof z.ZodLiteral) return { type: 'string', enum: [schema.value] }
25
- if (schema instanceof z.ZodEnum) return { type: 'string', enum: schema.options }
26
- if (schema instanceof z.ZodString) return { type: 'string', minLength: 1, maxLength: 512, ...Object.assign({}, ...schema._def.checks.filter(c => c.kind === 'regex').map(c => ({ pattern: (c as any).regex.source }))) }
27
- if (schema instanceof z.ZodNumber) return { type: 'integer', minimum: schema.minValue, maximum: schema.maxValue }
28
- throw new Error('Unsupported debugger field schema')
29
- }
30
- export const debuggerContracts = Object.fromEntries(Object.entries(specs).map(([name, spec]) => [name, {
31
- ...spec, schema: z.object({ ...spec.fields, timeoutMs: timeout.default(name === 'wait_for_debugger_event' ? 1000 : 10000) }).strict()
32
- }]))
33
- export const debuggerTools = Object.entries(debuggerContracts).map(([name, spec]) => ({ name, description: spec.description,
34
- inputSchema: { type: 'object', additionalProperties: false,
35
- required: Object.entries(spec.fields).filter(([, field]) => !field.isOptional()).map(([key]) => key),
36
- properties: { ...Object.fromEntries(Object.entries(spec.fields).map(([key, field]) => [key, jsonField(field)])), timeoutMs: { type: 'integer', minimum: 100, maximum: 30000, default: name === 'wait_for_debugger_event' ? 1000 : 10000 } } }
37
- }))
@@ -1,17 +0,0 @@
1
- import { z } from 'zod'
2
- const target = { platform: z.enum(['android', 'ios']), deviceId: z.string().min(1).optional() }
3
- export const traceTargetSchema = z.object(target).strict()
4
- export const traceStartSchema = z.object({ ...target, durationMs: z.number().int().min(1000).max(120000).default(30000) }).strict()
5
- export const traceControlSchema = z.object({ traceId: z.string().uuid() }).strict()
6
- const properties = { platform: { type: 'string', enum: ['android', 'ios'] }, deviceId: { type: 'string', minLength: 1 } }
7
- export const systemTraceTools = [
8
- { name: 'get_system_trace_capabilities', description: 'Probe Android Perfetto prerequisites without recording. Device-wide system tracing is optional; iOS is unsupported.',
9
- inputSchema: { type: 'object', additionalProperties: false, required: ['platform'], properties } },
10
- { name: 'start_system_trace', description: 'Start bounded Android Perfetto recording, returning an owned trace_id. Run an existing journey with systemTraceId, then stop to retrieve a local artifact or cancel to discard. Device-wide traces may contain sensitive system annotations; no upload.',
11
- inputSchema: { type: 'object', additionalProperties: false, required: ['platform'], properties: { ...properties, durationMs: { type: 'integer', minimum: 1000, maximum: 120000, default: 30000 } } } },
12
- ...['get_system_trace_status', 'stop_system_trace', 'cancel_system_trace'].map(name => ({ name,
13
- description: name === 'get_system_trace_status' ? 'Reconcile an owned trace and retrieve its state; finalise duration-completed capture.' :
14
- name === 'stop_system_trace' ? 'Stop owned capture gracefully and retrieve a local Perfetto artifact. Retry after a transfer/cleanup failure.' : 'Stop owned capture and discard partial files. Already completed local artifacts are retained.',
15
- inputSchema: { type: 'object', additionalProperties: false, required: ['traceId'], properties: { traceId: { type: 'string', format: 'uuid' } } }
16
- }))
17
- ]