@metamask/device-mcp 0.1.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 (315) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/README.md +266 -0
  3. package/dist/backends/adb-backend.cjs +442 -0
  4. package/dist/backends/adb-backend.cjs.map +1 -0
  5. package/dist/backends/adb-backend.d.cts +35 -0
  6. package/dist/backends/adb-backend.d.cts.map +1 -0
  7. package/dist/backends/adb-backend.d.mts +35 -0
  8. package/dist/backends/adb-backend.d.mts.map +1 -0
  9. package/dist/backends/adb-backend.mjs +436 -0
  10. package/dist/backends/adb-backend.mjs.map +1 -0
  11. package/dist/backends/appium-backend.cjs +518 -0
  12. package/dist/backends/appium-backend.cjs.map +1 -0
  13. package/dist/backends/appium-backend.d.cts +36 -0
  14. package/dist/backends/appium-backend.d.cts.map +1 -0
  15. package/dist/backends/appium-backend.d.mts +36 -0
  16. package/dist/backends/appium-backend.d.mts.map +1 -0
  17. package/dist/backends/appium-backend.mjs +512 -0
  18. package/dist/backends/appium-backend.mjs.map +1 -0
  19. package/dist/backends/idb-backend.cjs +442 -0
  20. package/dist/backends/idb-backend.cjs.map +1 -0
  21. package/dist/backends/idb-backend.d.cts +35 -0
  22. package/dist/backends/idb-backend.d.cts.map +1 -0
  23. package/dist/backends/idb-backend.d.mts +35 -0
  24. package/dist/backends/idb-backend.d.mts.map +1 -0
  25. package/dist/backends/idb-backend.mjs +436 -0
  26. package/dist/backends/idb-backend.mjs.map +1 -0
  27. package/dist/backends/index.cjs +134 -0
  28. package/dist/backends/index.cjs.map +1 -0
  29. package/dist/backends/index.d.cts +16 -0
  30. package/dist/backends/index.d.cts.map +1 -0
  31. package/dist/backends/index.d.mts +16 -0
  32. package/dist/backends/index.d.mts.map +1 -0
  33. package/dist/backends/index.mjs +126 -0
  34. package/dist/backends/index.mjs.map +1 -0
  35. package/dist/backends/session-file.cjs +62 -0
  36. package/dist/backends/session-file.cjs.map +1 -0
  37. package/dist/backends/session-file.d.cts +24 -0
  38. package/dist/backends/session-file.d.cts.map +1 -0
  39. package/dist/backends/session-file.d.mts +24 -0
  40. package/dist/backends/session-file.d.mts.map +1 -0
  41. package/dist/backends/session-file.mjs +59 -0
  42. package/dist/backends/session-file.mjs.map +1 -0
  43. package/dist/backends/types.cjs +3 -0
  44. package/dist/backends/types.cjs.map +1 -0
  45. package/dist/backends/types.d.cts +93 -0
  46. package/dist/backends/types.d.cts.map +1 -0
  47. package/dist/backends/types.d.mts +93 -0
  48. package/dist/backends/types.d.mts.map +1 -0
  49. package/dist/backends/types.mjs +2 -0
  50. package/dist/backends/types.mjs.map +1 -0
  51. package/dist/backends/webdriver-client.cjs +167 -0
  52. package/dist/backends/webdriver-client.cjs.map +1 -0
  53. package/dist/backends/webdriver-client.d.cts +55 -0
  54. package/dist/backends/webdriver-client.d.cts.map +1 -0
  55. package/dist/backends/webdriver-client.d.mts +55 -0
  56. package/dist/backends/webdriver-client.d.mts.map +1 -0
  57. package/dist/backends/webdriver-client.mjs +162 -0
  58. package/dist/backends/webdriver-client.mjs.map +1 -0
  59. package/dist/cli/device-mcp.cjs +20 -0
  60. package/dist/cli/device-mcp.cjs.map +1 -0
  61. package/dist/cli/device-mcp.d.cts +3 -0
  62. package/dist/cli/device-mcp.d.cts.map +1 -0
  63. package/dist/cli/device-mcp.d.mts +3 -0
  64. package/dist/cli/device-mcp.d.mts.map +1 -0
  65. package/dist/cli/device-mcp.mjs +18 -0
  66. package/dist/cli/device-mcp.mjs.map +1 -0
  67. package/dist/index.cjs +9 -0
  68. package/dist/index.cjs.map +1 -0
  69. package/dist/index.d.cts +5 -0
  70. package/dist/index.d.cts.map +1 -0
  71. package/dist/index.d.mts +5 -0
  72. package/dist/index.d.mts.map +1 -0
  73. package/dist/index.mjs +3 -0
  74. package/dist/index.mjs.map +1 -0
  75. package/dist/server.cjs +43 -0
  76. package/dist/server.cjs.map +1 -0
  77. package/dist/server.d.cts +4 -0
  78. package/dist/server.d.cts.map +1 -0
  79. package/dist/server.d.mts +4 -0
  80. package/dist/server.d.mts.map +1 -0
  81. package/dist/server.mjs +40 -0
  82. package/dist/server.mjs.map +1 -0
  83. package/dist/tools/alert-text.cjs +25 -0
  84. package/dist/tools/alert-text.cjs.map +1 -0
  85. package/dist/tools/alert-text.d.cts +4 -0
  86. package/dist/tools/alert-text.d.cts.map +1 -0
  87. package/dist/tools/alert-text.d.mts +4 -0
  88. package/dist/tools/alert-text.d.mts.map +1 -0
  89. package/dist/tools/alert-text.mjs +22 -0
  90. package/dist/tools/alert-text.mjs.map +1 -0
  91. package/dist/tools/app-state.cjs +40 -0
  92. package/dist/tools/app-state.cjs.map +1 -0
  93. package/dist/tools/app-state.d.cts +4 -0
  94. package/dist/tools/app-state.d.cts.map +1 -0
  95. package/dist/tools/app-state.d.mts +4 -0
  96. package/dist/tools/app-state.d.mts.map +1 -0
  97. package/dist/tools/app-state.mjs +37 -0
  98. package/dist/tools/app-state.mjs.map +1 -0
  99. package/dist/tools/clipboard.cjs +42 -0
  100. package/dist/tools/clipboard.cjs.map +1 -0
  101. package/dist/tools/clipboard.d.cts +4 -0
  102. package/dist/tools/clipboard.d.cts.map +1 -0
  103. package/dist/tools/clipboard.d.mts +4 -0
  104. package/dist/tools/clipboard.d.mts.map +1 -0
  105. package/dist/tools/clipboard.mjs +39 -0
  106. package/dist/tools/clipboard.mjs.map +1 -0
  107. package/dist/tools/close-app.cjs +25 -0
  108. package/dist/tools/close-app.cjs.map +1 -0
  109. package/dist/tools/close-app.d.cts +4 -0
  110. package/dist/tools/close-app.d.cts.map +1 -0
  111. package/dist/tools/close-app.d.mts +4 -0
  112. package/dist/tools/close-app.d.mts.map +1 -0
  113. package/dist/tools/close-app.mjs +22 -0
  114. package/dist/tools/close-app.mjs.map +1 -0
  115. package/dist/tools/context.cjs +52 -0
  116. package/dist/tools/context.cjs.map +1 -0
  117. package/dist/tools/context.d.cts +4 -0
  118. package/dist/tools/context.d.cts.map +1 -0
  119. package/dist/tools/context.d.mts +4 -0
  120. package/dist/tools/context.d.mts.map +1 -0
  121. package/dist/tools/context.mjs +49 -0
  122. package/dist/tools/context.mjs.map +1 -0
  123. package/dist/tools/device-info.cjs +34 -0
  124. package/dist/tools/device-info.cjs.map +1 -0
  125. package/dist/tools/device-info.d.cts +4 -0
  126. package/dist/tools/device-info.d.cts.map +1 -0
  127. package/dist/tools/device-info.d.mts +4 -0
  128. package/dist/tools/device-info.d.mts.map +1 -0
  129. package/dist/tools/device-info.mjs +31 -0
  130. package/dist/tools/device-info.mjs.map +1 -0
  131. package/dist/tools/dismiss-alert.cjs +34 -0
  132. package/dist/tools/dismiss-alert.cjs.map +1 -0
  133. package/dist/tools/dismiss-alert.d.cts +4 -0
  134. package/dist/tools/dismiss-alert.d.cts.map +1 -0
  135. package/dist/tools/dismiss-alert.d.mts +4 -0
  136. package/dist/tools/dismiss-alert.d.mts.map +1 -0
  137. package/dist/tools/dismiss-alert.mjs +31 -0
  138. package/dist/tools/dismiss-alert.mjs.map +1 -0
  139. package/dist/tools/dismiss-keyboard.cjs +23 -0
  140. package/dist/tools/dismiss-keyboard.cjs.map +1 -0
  141. package/dist/tools/dismiss-keyboard.d.cts +4 -0
  142. package/dist/tools/dismiss-keyboard.d.cts.map +1 -0
  143. package/dist/tools/dismiss-keyboard.d.mts +4 -0
  144. package/dist/tools/dismiss-keyboard.d.mts.map +1 -0
  145. package/dist/tools/dismiss-keyboard.mjs +20 -0
  146. package/dist/tools/dismiss-keyboard.mjs.map +1 -0
  147. package/dist/tools/generate-locators.cjs +33 -0
  148. package/dist/tools/generate-locators.cjs.map +1 -0
  149. package/dist/tools/generate-locators.d.cts +4 -0
  150. package/dist/tools/generate-locators.d.cts.map +1 -0
  151. package/dist/tools/generate-locators.d.mts +4 -0
  152. package/dist/tools/generate-locators.d.mts.map +1 -0
  153. package/dist/tools/generate-locators.mjs +30 -0
  154. package/dist/tools/generate-locators.mjs.map +1 -0
  155. package/dist/tools/index.cjs +50 -0
  156. package/dist/tools/index.cjs.map +1 -0
  157. package/dist/tools/index.d.cts +24 -0
  158. package/dist/tools/index.d.cts.map +1 -0
  159. package/dist/tools/index.d.mts +24 -0
  160. package/dist/tools/index.d.mts.map +1 -0
  161. package/dist/tools/index.mjs +24 -0
  162. package/dist/tools/index.mjs.map +1 -0
  163. package/dist/tools/logs.cjs +48 -0
  164. package/dist/tools/logs.cjs.map +1 -0
  165. package/dist/tools/logs.d.cts +4 -0
  166. package/dist/tools/logs.d.cts.map +1 -0
  167. package/dist/tools/logs.d.mts +4 -0
  168. package/dist/tools/logs.d.mts.map +1 -0
  169. package/dist/tools/logs.mjs +45 -0
  170. package/dist/tools/logs.mjs.map +1 -0
  171. package/dist/tools/long-press.cjs +38 -0
  172. package/dist/tools/long-press.cjs.map +1 -0
  173. package/dist/tools/long-press.d.cts +4 -0
  174. package/dist/tools/long-press.d.cts.map +1 -0
  175. package/dist/tools/long-press.d.mts +4 -0
  176. package/dist/tools/long-press.d.mts.map +1 -0
  177. package/dist/tools/long-press.mjs +35 -0
  178. package/dist/tools/long-press.mjs.map +1 -0
  179. package/dist/tools/open-app.cjs +26 -0
  180. package/dist/tools/open-app.cjs.map +1 -0
  181. package/dist/tools/open-app.d.cts +4 -0
  182. package/dist/tools/open-app.d.cts.map +1 -0
  183. package/dist/tools/open-app.d.mts +4 -0
  184. package/dist/tools/open-app.d.mts.map +1 -0
  185. package/dist/tools/open-app.mjs +23 -0
  186. package/dist/tools/open-app.mjs.map +1 -0
  187. package/dist/tools/press-button.cjs +30 -0
  188. package/dist/tools/press-button.cjs.map +1 -0
  189. package/dist/tools/press-button.d.cts +4 -0
  190. package/dist/tools/press-button.d.cts.map +1 -0
  191. package/dist/tools/press-button.d.mts +4 -0
  192. package/dist/tools/press-button.d.mts.map +1 -0
  193. package/dist/tools/press-button.mjs +27 -0
  194. package/dist/tools/press-button.mjs.map +1 -0
  195. package/dist/tools/screen-recording.cjs +46 -0
  196. package/dist/tools/screen-recording.cjs.map +1 -0
  197. package/dist/tools/screen-recording.d.cts +4 -0
  198. package/dist/tools/screen-recording.d.cts.map +1 -0
  199. package/dist/tools/screen-recording.d.mts +4 -0
  200. package/dist/tools/screen-recording.d.mts.map +1 -0
  201. package/dist/tools/screen-recording.mjs +43 -0
  202. package/dist/tools/screen-recording.mjs.map +1 -0
  203. package/dist/tools/screenshot.cjs +42 -0
  204. package/dist/tools/screenshot.cjs.map +1 -0
  205. package/dist/tools/screenshot.d.cts +4 -0
  206. package/dist/tools/screenshot.d.cts.map +1 -0
  207. package/dist/tools/screenshot.d.mts +4 -0
  208. package/dist/tools/screenshot.d.mts.map +1 -0
  209. package/dist/tools/screenshot.mjs +39 -0
  210. package/dist/tools/screenshot.mjs.map +1 -0
  211. package/dist/tools/scroll-to-element.cjs +56 -0
  212. package/dist/tools/scroll-to-element.cjs.map +1 -0
  213. package/dist/tools/scroll-to-element.d.cts +4 -0
  214. package/dist/tools/scroll-to-element.d.cts.map +1 -0
  215. package/dist/tools/scroll-to-element.d.mts +4 -0
  216. package/dist/tools/scroll-to-element.d.mts.map +1 -0
  217. package/dist/tools/scroll-to-element.mjs +53 -0
  218. package/dist/tools/scroll-to-element.mjs.map +1 -0
  219. package/dist/tools/shared.cjs +11 -0
  220. package/dist/tools/shared.cjs.map +1 -0
  221. package/dist/tools/shared.d.cts +8 -0
  222. package/dist/tools/shared.d.cts.map +1 -0
  223. package/dist/tools/shared.d.mts +8 -0
  224. package/dist/tools/shared.d.mts.map +1 -0
  225. package/dist/tools/shared.mjs +8 -0
  226. package/dist/tools/shared.mjs.map +1 -0
  227. package/dist/tools/snapshot.cjs +37 -0
  228. package/dist/tools/snapshot.cjs.map +1 -0
  229. package/dist/tools/snapshot.d.cts +4 -0
  230. package/dist/tools/snapshot.d.cts.map +1 -0
  231. package/dist/tools/snapshot.d.mts +4 -0
  232. package/dist/tools/snapshot.d.mts.map +1 -0
  233. package/dist/tools/snapshot.mjs +34 -0
  234. package/dist/tools/snapshot.mjs.map +1 -0
  235. package/dist/tools/swipe.cjs +39 -0
  236. package/dist/tools/swipe.cjs.map +1 -0
  237. package/dist/tools/swipe.d.cts +4 -0
  238. package/dist/tools/swipe.d.cts.map +1 -0
  239. package/dist/tools/swipe.d.mts +4 -0
  240. package/dist/tools/swipe.d.mts.map +1 -0
  241. package/dist/tools/swipe.mjs +36 -0
  242. package/dist/tools/swipe.mjs.map +1 -0
  243. package/dist/tools/tap-coordinates.cjs +27 -0
  244. package/dist/tools/tap-coordinates.cjs.map +1 -0
  245. package/dist/tools/tap-coordinates.d.cts +4 -0
  246. package/dist/tools/tap-coordinates.d.cts.map +1 -0
  247. package/dist/tools/tap-coordinates.d.mts +4 -0
  248. package/dist/tools/tap-coordinates.d.mts.map +1 -0
  249. package/dist/tools/tap-coordinates.mjs +24 -0
  250. package/dist/tools/tap-coordinates.mjs.map +1 -0
  251. package/dist/tools/tap-element.cjs +46 -0
  252. package/dist/tools/tap-element.cjs.map +1 -0
  253. package/dist/tools/tap-element.d.cts +4 -0
  254. package/dist/tools/tap-element.d.cts.map +1 -0
  255. package/dist/tools/tap-element.d.mts +4 -0
  256. package/dist/tools/tap-element.d.mts.map +1 -0
  257. package/dist/tools/tap-element.mjs +43 -0
  258. package/dist/tools/tap-element.mjs.map +1 -0
  259. package/dist/tools/type-text.cjs +32 -0
  260. package/dist/tools/type-text.cjs.map +1 -0
  261. package/dist/tools/type-text.d.cts +4 -0
  262. package/dist/tools/type-text.d.cts.map +1 -0
  263. package/dist/tools/type-text.d.mts +4 -0
  264. package/dist/tools/type-text.d.mts.map +1 -0
  265. package/dist/tools/type-text.mjs +29 -0
  266. package/dist/tools/type-text.mjs.map +1 -0
  267. package/dist/tools/wait-for.cjs +51 -0
  268. package/dist/tools/wait-for.cjs.map +1 -0
  269. package/dist/tools/wait-for.d.cts +4 -0
  270. package/dist/tools/wait-for.d.cts.map +1 -0
  271. package/dist/tools/wait-for.d.mts +4 -0
  272. package/dist/tools/wait-for.d.mts.map +1 -0
  273. package/dist/tools/wait-for.mjs +48 -0
  274. package/dist/tools/wait-for.mjs.map +1 -0
  275. package/dist/tools/window-size.cjs +29 -0
  276. package/dist/tools/window-size.cjs.map +1 -0
  277. package/dist/tools/window-size.d.cts +4 -0
  278. package/dist/tools/window-size.d.cts.map +1 -0
  279. package/dist/tools/window-size.d.mts +4 -0
  280. package/dist/tools/window-size.d.mts.map +1 -0
  281. package/dist/tools/window-size.mjs +26 -0
  282. package/dist/tools/window-size.mjs.map +1 -0
  283. package/dist/utils/alert-labels.cjs +26 -0
  284. package/dist/utils/alert-labels.cjs.map +1 -0
  285. package/dist/utils/alert-labels.d.cts +3 -0
  286. package/dist/utils/alert-labels.d.cts.map +1 -0
  287. package/dist/utils/alert-labels.d.mts +3 -0
  288. package/dist/utils/alert-labels.d.mts.map +1 -0
  289. package/dist/utils/alert-labels.mjs +23 -0
  290. package/dist/utils/alert-labels.mjs.map +1 -0
  291. package/dist/utils/element.cjs +212 -0
  292. package/dist/utils/element.cjs.map +1 -0
  293. package/dist/utils/element.d.cts +24 -0
  294. package/dist/utils/element.d.cts.map +1 -0
  295. package/dist/utils/element.d.mts +24 -0
  296. package/dist/utils/element.d.mts.map +1 -0
  297. package/dist/utils/element.mjs +203 -0
  298. package/dist/utils/element.mjs.map +1 -0
  299. package/dist/utils/exec.cjs +57 -0
  300. package/dist/utils/exec.cjs.map +1 -0
  301. package/dist/utils/exec.d.cts +23 -0
  302. package/dist/utils/exec.d.cts.map +1 -0
  303. package/dist/utils/exec.d.mts +23 -0
  304. package/dist/utils/exec.d.mts.map +1 -0
  305. package/dist/utils/exec.mjs +52 -0
  306. package/dist/utils/exec.mjs.map +1 -0
  307. package/dist/utils/platform.cjs +93 -0
  308. package/dist/utils/platform.cjs.map +1 -0
  309. package/dist/utils/platform.d.cts +8 -0
  310. package/dist/utils/platform.d.cts.map +1 -0
  311. package/dist/utils/platform.d.mts +8 -0
  312. package/dist/utils/platform.d.mts.map +1 -0
  313. package/dist/utils/platform.mjs +90 -0
  314. package/dist/utils/platform.mjs.map +1 -0
  315. package/package.json +106 -0
@@ -0,0 +1,167 @@
1
+ "use strict";
2
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
3
+ if (kind === "m") throw new TypeError("Private method is not writable");
4
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
5
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
6
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
7
+ };
8
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
9
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
10
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
11
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
12
+ };
13
+ var _WebDriverClient_instances, _WebDriverClient_baseUrl, _WebDriverClient_sessionId, _WebDriverClient_headers, _WebDriverClient_get, _WebDriverClient_post, _WebDriverClient_delete, _WebDriverClient_unwrap;
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.WebDriverClient = void 0;
16
+ exports.createSession = createSession;
17
+ /**
18
+ * Minimal W3C WebDriver Protocol client using fetch.
19
+ * Covers the subset needed for device interaction: source, find, click,
20
+ * sendKeys, actions, and execute (mobile commands).
21
+ *
22
+ * @param baseUrl - Appium server URL (e.g. http://localhost:4723).
23
+ * @param sessionId - Active session ID.
24
+ * @param auth - Optional basic auth for cloud providers like BrowserStack.
25
+ */
26
+ class WebDriverClient {
27
+ constructor(baseUrl, sessionId, auth) {
28
+ _WebDriverClient_instances.add(this);
29
+ _WebDriverClient_baseUrl.set(this, void 0);
30
+ _WebDriverClient_sessionId.set(this, void 0);
31
+ _WebDriverClient_headers.set(this, void 0);
32
+ __classPrivateFieldSet(this, _WebDriverClient_baseUrl, baseUrl.replace(/\/+$/u, ''), "f");
33
+ __classPrivateFieldSet(this, _WebDriverClient_sessionId, sessionId, "f");
34
+ __classPrivateFieldSet(this, _WebDriverClient_headers, { 'Content-Type': 'application/json' }, "f");
35
+ if (auth) {
36
+ const encoded = Buffer.from(`${auth.user}:${auth.key}`).toString('base64');
37
+ __classPrivateFieldGet(this, _WebDriverClient_headers, "f").Authorization = `Basic ${encoded}`;
38
+ }
39
+ }
40
+ get sessionId() {
41
+ return __classPrivateFieldGet(this, _WebDriverClient_sessionId, "f");
42
+ }
43
+ async getPageSource() {
44
+ return __classPrivateFieldGet(this, _WebDriverClient_instances, "m", _WebDriverClient_get).call(this, `/source`);
45
+ }
46
+ async execute(script, args = []) {
47
+ return __classPrivateFieldGet(this, _WebDriverClient_instances, "m", _WebDriverClient_post).call(this, `/execute/sync`, { script, args });
48
+ }
49
+ async executeAsync(script, args = []) {
50
+ return __classPrivateFieldGet(this, _WebDriverClient_instances, "m", _WebDriverClient_post).call(this, `/execute/async`, { script, args });
51
+ }
52
+ async findElement(strategy, selector) {
53
+ return __classPrivateFieldGet(this, _WebDriverClient_instances, "m", _WebDriverClient_post).call(this, `/element`, { using: strategy, value: selector });
54
+ }
55
+ async findElements(strategy, selector) {
56
+ return __classPrivateFieldGet(this, _WebDriverClient_instances, "m", _WebDriverClient_post).call(this, `/elements`, { using: strategy, value: selector });
57
+ }
58
+ async elementClick(elementId) {
59
+ await __classPrivateFieldGet(this, _WebDriverClient_instances, "m", _WebDriverClient_post).call(this, `/element/${elementId}/click`, {});
60
+ }
61
+ async elementSendKeys(elementId, text) {
62
+ await __classPrivateFieldGet(this, _WebDriverClient_instances, "m", _WebDriverClient_post).call(this, `/element/${elementId}/value`, { text });
63
+ }
64
+ async elementClear(elementId) {
65
+ await __classPrivateFieldGet(this, _WebDriverClient_instances, "m", _WebDriverClient_post).call(this, `/element/${elementId}/clear`, {});
66
+ }
67
+ async getElementAttribute(elementId, name) {
68
+ return __classPrivateFieldGet(this, _WebDriverClient_instances, "m", _WebDriverClient_get).call(this, `/element/${elementId}/attribute/${name}`);
69
+ }
70
+ async getElementRect(elementId) {
71
+ return __classPrivateFieldGet(this, _WebDriverClient_instances, "m", _WebDriverClient_get).call(this, `/element/${elementId}/rect`);
72
+ }
73
+ async performActions(actions) {
74
+ await __classPrivateFieldGet(this, _WebDriverClient_instances, "m", _WebDriverClient_post).call(this, `/actions`, { actions });
75
+ }
76
+ async releaseActions() {
77
+ await __classPrivateFieldGet(this, _WebDriverClient_instances, "m", _WebDriverClient_delete).call(this, `/actions`);
78
+ }
79
+ async getStatus() {
80
+ const response = await fetch(`${__classPrivateFieldGet(this, _WebDriverClient_baseUrl, "f")}/status`, {
81
+ headers: __classPrivateFieldGet(this, _WebDriverClient_headers, "f"),
82
+ });
83
+ const body = (await response.json());
84
+ return body.value;
85
+ }
86
+ async getSessionDetails() {
87
+ return __classPrivateFieldGet(this, _WebDriverClient_instances, "m", _WebDriverClient_get).call(this, ``);
88
+ }
89
+ async queryAppState(bundleId) {
90
+ return this.execute('mobile: queryAppState', [{ bundleId }]);
91
+ }
92
+ async getCurrentActivity() {
93
+ return this.execute('mobile: getCurrentActivity', []);
94
+ }
95
+ async updateSettings(settings) {
96
+ await __classPrivateFieldGet(this, _WebDriverClient_instances, "m", _WebDriverClient_post).call(this, `/appium/settings`, { settings });
97
+ }
98
+ async getContexts() {
99
+ return __classPrivateFieldGet(this, _WebDriverClient_instances, "m", _WebDriverClient_get).call(this, `/contexts`);
100
+ }
101
+ async setCurrentContext(name) {
102
+ await __classPrivateFieldGet(this, _WebDriverClient_instances, "m", _WebDriverClient_post).call(this, `/context`, { name });
103
+ }
104
+ async getWindowRect() {
105
+ return __classPrivateFieldGet(this, _WebDriverClient_instances, "m", _WebDriverClient_get).call(this, `/window/rect`);
106
+ }
107
+ }
108
+ exports.WebDriverClient = WebDriverClient;
109
+ _WebDriverClient_baseUrl = new WeakMap(), _WebDriverClient_sessionId = new WeakMap(), _WebDriverClient_headers = new WeakMap(), _WebDriverClient_instances = new WeakSet(), _WebDriverClient_get = async function _WebDriverClient_get(path) {
110
+ const url = `${__classPrivateFieldGet(this, _WebDriverClient_baseUrl, "f")}/session/${__classPrivateFieldGet(this, _WebDriverClient_sessionId, "f")}${path}`;
111
+ const response = await fetch(url, { headers: __classPrivateFieldGet(this, _WebDriverClient_headers, "f") });
112
+ return __classPrivateFieldGet(this, _WebDriverClient_instances, "m", _WebDriverClient_unwrap).call(this, response, 'GET', path);
113
+ }, _WebDriverClient_post = async function _WebDriverClient_post(path, body) {
114
+ const url = `${__classPrivateFieldGet(this, _WebDriverClient_baseUrl, "f")}/session/${__classPrivateFieldGet(this, _WebDriverClient_sessionId, "f")}${path}`;
115
+ const response = await fetch(url, {
116
+ method: 'POST',
117
+ headers: __classPrivateFieldGet(this, _WebDriverClient_headers, "f"),
118
+ body: JSON.stringify(body),
119
+ });
120
+ return __classPrivateFieldGet(this, _WebDriverClient_instances, "m", _WebDriverClient_unwrap).call(this, response, 'POST', path);
121
+ }, _WebDriverClient_delete = async function _WebDriverClient_delete(path) {
122
+ const url = `${__classPrivateFieldGet(this, _WebDriverClient_baseUrl, "f")}/session/${__classPrivateFieldGet(this, _WebDriverClient_sessionId, "f")}${path}`;
123
+ const response = await fetch(url, {
124
+ method: 'DELETE',
125
+ headers: __classPrivateFieldGet(this, _WebDriverClient_headers, "f"),
126
+ });
127
+ if (!response.ok) {
128
+ const text = await response.text();
129
+ throw new Error(`DELETE ${path} failed (${response.status}): ${text}`);
130
+ }
131
+ }, _WebDriverClient_unwrap = async function _WebDriverClient_unwrap(response, method, path) {
132
+ const body = (await response.json());
133
+ if (!response.ok) {
134
+ const errorValue = body.value;
135
+ throw new Error(`${method} ${path} failed (${response.status}): ${errorValue?.message ?? JSON.stringify(body.value)}`);
136
+ }
137
+ return body.value;
138
+ };
139
+ async function createSession(baseUrl, capabilities, auth) {
140
+ const url = `${baseUrl.replace(/\/+$/u, '')}/session`;
141
+ const headers = {
142
+ 'Content-Type': 'application/json',
143
+ };
144
+ if (auth) {
145
+ const encoded = Buffer.from(`${auth.user}:${auth.key}`).toString('base64');
146
+ headers.Authorization = `Basic ${encoded}`;
147
+ }
148
+ const response = await fetch(url, {
149
+ method: 'POST',
150
+ headers,
151
+ body: JSON.stringify({
152
+ capabilities: {
153
+ alwaysMatch: capabilities,
154
+ },
155
+ }),
156
+ });
157
+ const body = (await response.json());
158
+ if (!response.ok) {
159
+ throw new Error(`Failed to create Appium session (${response.status}): ${JSON.stringify(body)}`);
160
+ }
161
+ const { sessionId } = body.value;
162
+ return {
163
+ sessionId,
164
+ client: new WebDriverClient(baseUrl, sessionId, auth),
165
+ };
166
+ }
167
+ //# sourceMappingURL=webdriver-client.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webdriver-client.cjs","sourceRoot":"","sources":["../../src/backends/webdriver-client.ts"],"names":[],"mappings":"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","sourcesContent":["type AuthConfig = { user: string; key: string };\n\n// WebDriver protocol element ref — JSONWP uses 'ELEMENT', W3C uses a long UUID key\ntype WebDriverElement = Record<string, string>;\n\n/**\n * Minimal W3C WebDriver Protocol client using fetch.\n * Covers the subset needed for device interaction: source, find, click,\n * sendKeys, actions, and execute (mobile commands).\n *\n * @param baseUrl - Appium server URL (e.g. http://localhost:4723).\n * @param sessionId - Active session ID.\n * @param auth - Optional basic auth for cloud providers like BrowserStack.\n */\nexport class WebDriverClient {\n readonly #baseUrl: string;\n\n readonly #sessionId: string;\n\n readonly #headers: Record<string, string>;\n\n constructor(baseUrl: string, sessionId: string, auth?: AuthConfig) {\n this.#baseUrl = baseUrl.replace(/\\/+$/u, '');\n this.#sessionId = sessionId;\n this.#headers = { 'Content-Type': 'application/json' };\n\n if (auth) {\n const encoded = Buffer.from(`${auth.user}:${auth.key}`).toString(\n 'base64',\n );\n this.#headers.Authorization = `Basic ${encoded}`;\n }\n }\n\n get sessionId(): string {\n return this.#sessionId;\n }\n\n async getPageSource(): Promise<string> {\n return this.#get<string>(`/source`);\n }\n\n async execute<Type>(script: string, args: unknown[] = []): Promise<Type> {\n return this.#post<Type>(`/execute/sync`, { script, args });\n }\n\n async executeAsync<Type>(\n script: string,\n args: unknown[] = [],\n ): Promise<Type> {\n return this.#post<Type>(`/execute/async`, { script, args });\n }\n\n async findElement(\n strategy: string,\n selector: string,\n ): Promise<WebDriverElement> {\n return this.#post(`/element`, { using: strategy, value: selector });\n }\n\n async findElements(\n strategy: string,\n selector: string,\n ): Promise<WebDriverElement[]> {\n return this.#post(`/elements`, { using: strategy, value: selector });\n }\n\n async elementClick(elementId: string): Promise<void> {\n await this.#post(`/element/${elementId}/click`, {});\n }\n\n async elementSendKeys(elementId: string, text: string): Promise<void> {\n await this.#post(`/element/${elementId}/value`, { text });\n }\n\n async elementClear(elementId: string): Promise<void> {\n await this.#post(`/element/${elementId}/clear`, {});\n }\n\n async getElementAttribute(\n elementId: string,\n name: string,\n ): Promise<string | null> {\n return this.#get(`/element/${elementId}/attribute/${name}`);\n }\n\n async getElementRect(\n elementId: string,\n ): Promise<{ x: number; y: number; width: number; height: number }> {\n return this.#get(`/element/${elementId}/rect`);\n }\n\n async performActions(actions: unknown[]): Promise<void> {\n await this.#post(`/actions`, { actions });\n }\n\n async releaseActions(): Promise<void> {\n await this.#delete(`/actions`);\n }\n\n async getStatus(): Promise<Record<string, unknown>> {\n const response = await fetch(`${this.#baseUrl}/status`, {\n headers: this.#headers,\n });\n const body = (await response.json()) as { value: Record<string, unknown> };\n return body.value;\n }\n\n async getSessionDetails(): Promise<Record<string, unknown>> {\n return this.#get(``);\n }\n\n async queryAppState(bundleId: string): Promise<number> {\n return this.execute<number>('mobile: queryAppState', [{ bundleId }]);\n }\n\n async getCurrentActivity(): Promise<string> {\n return this.execute<string>('mobile: getCurrentActivity', []);\n }\n\n async updateSettings(settings: Record<string, unknown>): Promise<void> {\n await this.#post(`/appium/settings`, { settings });\n }\n\n async getContexts(): Promise<string[]> {\n return this.#get<string[]>(`/contexts`);\n }\n\n async setCurrentContext(name: string): Promise<void> {\n await this.#post(`/context`, { name });\n }\n\n async getWindowRect(): Promise<{\n x: number;\n y: number;\n width: number;\n height: number;\n }> {\n return this.#get(`/window/rect`);\n }\n\n async #get<Type>(path: string): Promise<Type> {\n const url = `${this.#baseUrl}/session/${this.#sessionId}${path}`;\n const response = await fetch(url, { headers: this.#headers });\n return this.#unwrap<Type>(response, 'GET', path);\n }\n\n async #post<Type>(path: string, body: unknown): Promise<Type> {\n const url = `${this.#baseUrl}/session/${this.#sessionId}${path}`;\n const response = await fetch(url, {\n method: 'POST',\n headers: this.#headers,\n body: JSON.stringify(body),\n });\n return this.#unwrap<Type>(response, 'POST', path);\n }\n\n async #delete(path: string): Promise<void> {\n const url = `${this.#baseUrl}/session/${this.#sessionId}${path}`;\n const response = await fetch(url, {\n method: 'DELETE',\n headers: this.#headers,\n });\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`DELETE ${path} failed (${response.status}): ${text}`);\n }\n }\n\n async #unwrap<Type>(\n response: Response,\n method: string,\n path: string,\n ): Promise<Type> {\n const body = (await response.json()) as {\n value: Type | { error: string; message: string };\n };\n\n if (!response.ok) {\n const errorValue = body.value as { error?: string; message?: string };\n throw new Error(\n `${method} ${path} failed (${response.status}): ${errorValue?.message ?? JSON.stringify(body.value)}`,\n );\n }\n\n return body.value as Type;\n }\n}\n\nexport async function createSession(\n baseUrl: string,\n capabilities: Record<string, unknown>,\n auth?: AuthConfig,\n): Promise<{ sessionId: string; client: WebDriverClient }> {\n const url = `${baseUrl.replace(/\\/+$/u, '')}/session`;\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n if (auth) {\n const encoded = Buffer.from(`${auth.user}:${auth.key}`).toString('base64');\n headers.Authorization = `Basic ${encoded}`;\n }\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify({\n capabilities: {\n alwaysMatch: capabilities,\n },\n }),\n });\n\n const body = (await response.json()) as {\n value: { sessionId: string; capabilities: Record<string, unknown> };\n };\n\n if (!response.ok) {\n throw new Error(\n `Failed to create Appium session (${response.status}): ${JSON.stringify(body)}`,\n );\n }\n\n const { sessionId } = body.value;\n return {\n sessionId,\n client: new WebDriverClient(baseUrl, sessionId, auth),\n };\n}\n"]}
@@ -0,0 +1,55 @@
1
+ type AuthConfig = {
2
+ user: string;
3
+ key: string;
4
+ };
5
+ type WebDriverElement = Record<string, string>;
6
+ /**
7
+ * Minimal W3C WebDriver Protocol client using fetch.
8
+ * Covers the subset needed for device interaction: source, find, click,
9
+ * sendKeys, actions, and execute (mobile commands).
10
+ *
11
+ * @param baseUrl - Appium server URL (e.g. http://localhost:4723).
12
+ * @param sessionId - Active session ID.
13
+ * @param auth - Optional basic auth for cloud providers like BrowserStack.
14
+ */
15
+ export declare class WebDriverClient {
16
+ #private;
17
+ constructor(baseUrl: string, sessionId: string, auth?: AuthConfig);
18
+ get sessionId(): string;
19
+ getPageSource(): Promise<string>;
20
+ execute<Type>(script: string, args?: unknown[]): Promise<Type>;
21
+ executeAsync<Type>(script: string, args?: unknown[]): Promise<Type>;
22
+ findElement(strategy: string, selector: string): Promise<WebDriverElement>;
23
+ findElements(strategy: string, selector: string): Promise<WebDriverElement[]>;
24
+ elementClick(elementId: string): Promise<void>;
25
+ elementSendKeys(elementId: string, text: string): Promise<void>;
26
+ elementClear(elementId: string): Promise<void>;
27
+ getElementAttribute(elementId: string, name: string): Promise<string | null>;
28
+ getElementRect(elementId: string): Promise<{
29
+ x: number;
30
+ y: number;
31
+ width: number;
32
+ height: number;
33
+ }>;
34
+ performActions(actions: unknown[]): Promise<void>;
35
+ releaseActions(): Promise<void>;
36
+ getStatus(): Promise<Record<string, unknown>>;
37
+ getSessionDetails(): Promise<Record<string, unknown>>;
38
+ queryAppState(bundleId: string): Promise<number>;
39
+ getCurrentActivity(): Promise<string>;
40
+ updateSettings(settings: Record<string, unknown>): Promise<void>;
41
+ getContexts(): Promise<string[]>;
42
+ setCurrentContext(name: string): Promise<void>;
43
+ getWindowRect(): Promise<{
44
+ x: number;
45
+ y: number;
46
+ width: number;
47
+ height: number;
48
+ }>;
49
+ }
50
+ export declare function createSession(baseUrl: string, capabilities: Record<string, unknown>, auth?: AuthConfig): Promise<{
51
+ sessionId: string;
52
+ client: WebDriverClient;
53
+ }>;
54
+ export {};
55
+ //# sourceMappingURL=webdriver-client.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webdriver-client.d.cts","sourceRoot":"","sources":["../../src/backends/webdriver-client.ts"],"names":[],"mappings":"AAAA,KAAK,UAAU,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAGhD,KAAK,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAE/C;;;;;;;;GAQG;AACH,qBAAa,eAAe;;gBAOd,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,UAAU;IAajE,IAAI,SAAS,IAAI,MAAM,CAEtB;IAEK,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC;IAIhC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,OAAO,EAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlE,YAAY,CAAC,IAAI,EACrB,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,OAAO,EAAO,GACnB,OAAO,CAAC,IAAI,CAAC;IAIV,WAAW,CACf,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,gBAAgB,CAAC;IAItB,YAAY,CAChB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAIxB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9C,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/D,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9C,mBAAmB,CACvB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAInB,cAAc,CAClB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAI7D,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjD,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAI/B,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAQ7C,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAIrD,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIhD,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC;IAIrC,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhE,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAIhC,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9C,aAAa,IAAI,OAAO,CAAC;QAC7B,CAAC,EAAE,MAAM,CAAC;QACV,CAAC,EAAE,MAAM,CAAC;QACV,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CAkDH;AAED,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACrC,IAAI,CAAC,EAAE,UAAU,GAChB,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,eAAe,CAAA;CAAE,CAAC,CAoCzD"}
@@ -0,0 +1,55 @@
1
+ type AuthConfig = {
2
+ user: string;
3
+ key: string;
4
+ };
5
+ type WebDriverElement = Record<string, string>;
6
+ /**
7
+ * Minimal W3C WebDriver Protocol client using fetch.
8
+ * Covers the subset needed for device interaction: source, find, click,
9
+ * sendKeys, actions, and execute (mobile commands).
10
+ *
11
+ * @param baseUrl - Appium server URL (e.g. http://localhost:4723).
12
+ * @param sessionId - Active session ID.
13
+ * @param auth - Optional basic auth for cloud providers like BrowserStack.
14
+ */
15
+ export declare class WebDriverClient {
16
+ #private;
17
+ constructor(baseUrl: string, sessionId: string, auth?: AuthConfig);
18
+ get sessionId(): string;
19
+ getPageSource(): Promise<string>;
20
+ execute<Type>(script: string, args?: unknown[]): Promise<Type>;
21
+ executeAsync<Type>(script: string, args?: unknown[]): Promise<Type>;
22
+ findElement(strategy: string, selector: string): Promise<WebDriverElement>;
23
+ findElements(strategy: string, selector: string): Promise<WebDriverElement[]>;
24
+ elementClick(elementId: string): Promise<void>;
25
+ elementSendKeys(elementId: string, text: string): Promise<void>;
26
+ elementClear(elementId: string): Promise<void>;
27
+ getElementAttribute(elementId: string, name: string): Promise<string | null>;
28
+ getElementRect(elementId: string): Promise<{
29
+ x: number;
30
+ y: number;
31
+ width: number;
32
+ height: number;
33
+ }>;
34
+ performActions(actions: unknown[]): Promise<void>;
35
+ releaseActions(): Promise<void>;
36
+ getStatus(): Promise<Record<string, unknown>>;
37
+ getSessionDetails(): Promise<Record<string, unknown>>;
38
+ queryAppState(bundleId: string): Promise<number>;
39
+ getCurrentActivity(): Promise<string>;
40
+ updateSettings(settings: Record<string, unknown>): Promise<void>;
41
+ getContexts(): Promise<string[]>;
42
+ setCurrentContext(name: string): Promise<void>;
43
+ getWindowRect(): Promise<{
44
+ x: number;
45
+ y: number;
46
+ width: number;
47
+ height: number;
48
+ }>;
49
+ }
50
+ export declare function createSession(baseUrl: string, capabilities: Record<string, unknown>, auth?: AuthConfig): Promise<{
51
+ sessionId: string;
52
+ client: WebDriverClient;
53
+ }>;
54
+ export {};
55
+ //# sourceMappingURL=webdriver-client.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webdriver-client.d.mts","sourceRoot":"","sources":["../../src/backends/webdriver-client.ts"],"names":[],"mappings":"AAAA,KAAK,UAAU,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAGhD,KAAK,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAE/C;;;;;;;;GAQG;AACH,qBAAa,eAAe;;gBAOd,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,UAAU;IAajE,IAAI,SAAS,IAAI,MAAM,CAEtB;IAEK,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC;IAIhC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,OAAO,EAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlE,YAAY,CAAC,IAAI,EACrB,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,OAAO,EAAO,GACnB,OAAO,CAAC,IAAI,CAAC;IAIV,WAAW,CACf,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,gBAAgB,CAAC;IAItB,YAAY,CAChB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAIxB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9C,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/D,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9C,mBAAmB,CACvB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAInB,cAAc,CAClB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAI7D,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjD,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAI/B,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAQ7C,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAIrD,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIhD,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC;IAIrC,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhE,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAIhC,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9C,aAAa,IAAI,OAAO,CAAC;QAC7B,CAAC,EAAE,MAAM,CAAC;QACV,CAAC,EAAE,MAAM,CAAC;QACV,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CAkDH;AAED,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACrC,IAAI,CAAC,EAAE,UAAU,GAChB,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,eAAe,CAAA;CAAE,CAAC,CAoCzD"}
@@ -0,0 +1,162 @@
1
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
2
+ if (kind === "m") throw new TypeError("Private method is not writable");
3
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
4
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
5
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
6
+ };
7
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
8
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
9
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
10
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
+ };
12
+ var _WebDriverClient_instances, _WebDriverClient_baseUrl, _WebDriverClient_sessionId, _WebDriverClient_headers, _WebDriverClient_get, _WebDriverClient_post, _WebDriverClient_delete, _WebDriverClient_unwrap;
13
+ /**
14
+ * Minimal W3C WebDriver Protocol client using fetch.
15
+ * Covers the subset needed for device interaction: source, find, click,
16
+ * sendKeys, actions, and execute (mobile commands).
17
+ *
18
+ * @param baseUrl - Appium server URL (e.g. http://localhost:4723).
19
+ * @param sessionId - Active session ID.
20
+ * @param auth - Optional basic auth for cloud providers like BrowserStack.
21
+ */
22
+ export class WebDriverClient {
23
+ constructor(baseUrl, sessionId, auth) {
24
+ _WebDriverClient_instances.add(this);
25
+ _WebDriverClient_baseUrl.set(this, void 0);
26
+ _WebDriverClient_sessionId.set(this, void 0);
27
+ _WebDriverClient_headers.set(this, void 0);
28
+ __classPrivateFieldSet(this, _WebDriverClient_baseUrl, baseUrl.replace(/\/+$/u, ''), "f");
29
+ __classPrivateFieldSet(this, _WebDriverClient_sessionId, sessionId, "f");
30
+ __classPrivateFieldSet(this, _WebDriverClient_headers, { 'Content-Type': 'application/json' }, "f");
31
+ if (auth) {
32
+ const encoded = Buffer.from(`${auth.user}:${auth.key}`).toString('base64');
33
+ __classPrivateFieldGet(this, _WebDriverClient_headers, "f").Authorization = `Basic ${encoded}`;
34
+ }
35
+ }
36
+ get sessionId() {
37
+ return __classPrivateFieldGet(this, _WebDriverClient_sessionId, "f");
38
+ }
39
+ async getPageSource() {
40
+ return __classPrivateFieldGet(this, _WebDriverClient_instances, "m", _WebDriverClient_get).call(this, `/source`);
41
+ }
42
+ async execute(script, args = []) {
43
+ return __classPrivateFieldGet(this, _WebDriverClient_instances, "m", _WebDriverClient_post).call(this, `/execute/sync`, { script, args });
44
+ }
45
+ async executeAsync(script, args = []) {
46
+ return __classPrivateFieldGet(this, _WebDriverClient_instances, "m", _WebDriverClient_post).call(this, `/execute/async`, { script, args });
47
+ }
48
+ async findElement(strategy, selector) {
49
+ return __classPrivateFieldGet(this, _WebDriverClient_instances, "m", _WebDriverClient_post).call(this, `/element`, { using: strategy, value: selector });
50
+ }
51
+ async findElements(strategy, selector) {
52
+ return __classPrivateFieldGet(this, _WebDriverClient_instances, "m", _WebDriverClient_post).call(this, `/elements`, { using: strategy, value: selector });
53
+ }
54
+ async elementClick(elementId) {
55
+ await __classPrivateFieldGet(this, _WebDriverClient_instances, "m", _WebDriverClient_post).call(this, `/element/${elementId}/click`, {});
56
+ }
57
+ async elementSendKeys(elementId, text) {
58
+ await __classPrivateFieldGet(this, _WebDriverClient_instances, "m", _WebDriverClient_post).call(this, `/element/${elementId}/value`, { text });
59
+ }
60
+ async elementClear(elementId) {
61
+ await __classPrivateFieldGet(this, _WebDriverClient_instances, "m", _WebDriverClient_post).call(this, `/element/${elementId}/clear`, {});
62
+ }
63
+ async getElementAttribute(elementId, name) {
64
+ return __classPrivateFieldGet(this, _WebDriverClient_instances, "m", _WebDriverClient_get).call(this, `/element/${elementId}/attribute/${name}`);
65
+ }
66
+ async getElementRect(elementId) {
67
+ return __classPrivateFieldGet(this, _WebDriverClient_instances, "m", _WebDriverClient_get).call(this, `/element/${elementId}/rect`);
68
+ }
69
+ async performActions(actions) {
70
+ await __classPrivateFieldGet(this, _WebDriverClient_instances, "m", _WebDriverClient_post).call(this, `/actions`, { actions });
71
+ }
72
+ async releaseActions() {
73
+ await __classPrivateFieldGet(this, _WebDriverClient_instances, "m", _WebDriverClient_delete).call(this, `/actions`);
74
+ }
75
+ async getStatus() {
76
+ const response = await fetch(`${__classPrivateFieldGet(this, _WebDriverClient_baseUrl, "f")}/status`, {
77
+ headers: __classPrivateFieldGet(this, _WebDriverClient_headers, "f"),
78
+ });
79
+ const body = (await response.json());
80
+ return body.value;
81
+ }
82
+ async getSessionDetails() {
83
+ return __classPrivateFieldGet(this, _WebDriverClient_instances, "m", _WebDriverClient_get).call(this, ``);
84
+ }
85
+ async queryAppState(bundleId) {
86
+ return this.execute('mobile: queryAppState', [{ bundleId }]);
87
+ }
88
+ async getCurrentActivity() {
89
+ return this.execute('mobile: getCurrentActivity', []);
90
+ }
91
+ async updateSettings(settings) {
92
+ await __classPrivateFieldGet(this, _WebDriverClient_instances, "m", _WebDriverClient_post).call(this, `/appium/settings`, { settings });
93
+ }
94
+ async getContexts() {
95
+ return __classPrivateFieldGet(this, _WebDriverClient_instances, "m", _WebDriverClient_get).call(this, `/contexts`);
96
+ }
97
+ async setCurrentContext(name) {
98
+ await __classPrivateFieldGet(this, _WebDriverClient_instances, "m", _WebDriverClient_post).call(this, `/context`, { name });
99
+ }
100
+ async getWindowRect() {
101
+ return __classPrivateFieldGet(this, _WebDriverClient_instances, "m", _WebDriverClient_get).call(this, `/window/rect`);
102
+ }
103
+ }
104
+ _WebDriverClient_baseUrl = new WeakMap(), _WebDriverClient_sessionId = new WeakMap(), _WebDriverClient_headers = new WeakMap(), _WebDriverClient_instances = new WeakSet(), _WebDriverClient_get = async function _WebDriverClient_get(path) {
105
+ const url = `${__classPrivateFieldGet(this, _WebDriverClient_baseUrl, "f")}/session/${__classPrivateFieldGet(this, _WebDriverClient_sessionId, "f")}${path}`;
106
+ const response = await fetch(url, { headers: __classPrivateFieldGet(this, _WebDriverClient_headers, "f") });
107
+ return __classPrivateFieldGet(this, _WebDriverClient_instances, "m", _WebDriverClient_unwrap).call(this, response, 'GET', path);
108
+ }, _WebDriverClient_post = async function _WebDriverClient_post(path, body) {
109
+ const url = `${__classPrivateFieldGet(this, _WebDriverClient_baseUrl, "f")}/session/${__classPrivateFieldGet(this, _WebDriverClient_sessionId, "f")}${path}`;
110
+ const response = await fetch(url, {
111
+ method: 'POST',
112
+ headers: __classPrivateFieldGet(this, _WebDriverClient_headers, "f"),
113
+ body: JSON.stringify(body),
114
+ });
115
+ return __classPrivateFieldGet(this, _WebDriverClient_instances, "m", _WebDriverClient_unwrap).call(this, response, 'POST', path);
116
+ }, _WebDriverClient_delete = async function _WebDriverClient_delete(path) {
117
+ const url = `${__classPrivateFieldGet(this, _WebDriverClient_baseUrl, "f")}/session/${__classPrivateFieldGet(this, _WebDriverClient_sessionId, "f")}${path}`;
118
+ const response = await fetch(url, {
119
+ method: 'DELETE',
120
+ headers: __classPrivateFieldGet(this, _WebDriverClient_headers, "f"),
121
+ });
122
+ if (!response.ok) {
123
+ const text = await response.text();
124
+ throw new Error(`DELETE ${path} failed (${response.status}): ${text}`);
125
+ }
126
+ }, _WebDriverClient_unwrap = async function _WebDriverClient_unwrap(response, method, path) {
127
+ const body = (await response.json());
128
+ if (!response.ok) {
129
+ const errorValue = body.value;
130
+ throw new Error(`${method} ${path} failed (${response.status}): ${errorValue?.message ?? JSON.stringify(body.value)}`);
131
+ }
132
+ return body.value;
133
+ };
134
+ export async function createSession(baseUrl, capabilities, auth) {
135
+ const url = `${baseUrl.replace(/\/+$/u, '')}/session`;
136
+ const headers = {
137
+ 'Content-Type': 'application/json',
138
+ };
139
+ if (auth) {
140
+ const encoded = Buffer.from(`${auth.user}:${auth.key}`).toString('base64');
141
+ headers.Authorization = `Basic ${encoded}`;
142
+ }
143
+ const response = await fetch(url, {
144
+ method: 'POST',
145
+ headers,
146
+ body: JSON.stringify({
147
+ capabilities: {
148
+ alwaysMatch: capabilities,
149
+ },
150
+ }),
151
+ });
152
+ const body = (await response.json());
153
+ if (!response.ok) {
154
+ throw new Error(`Failed to create Appium session (${response.status}): ${JSON.stringify(body)}`);
155
+ }
156
+ const { sessionId } = body.value;
157
+ return {
158
+ sessionId,
159
+ client: new WebDriverClient(baseUrl, sessionId, auth),
160
+ };
161
+ }
162
+ //# sourceMappingURL=webdriver-client.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webdriver-client.mjs","sourceRoot":"","sources":["../../src/backends/webdriver-client.ts"],"names":[],"mappings":"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","sourcesContent":["type AuthConfig = { user: string; key: string };\n\n// WebDriver protocol element ref — JSONWP uses 'ELEMENT', W3C uses a long UUID key\ntype WebDriverElement = Record<string, string>;\n\n/**\n * Minimal W3C WebDriver Protocol client using fetch.\n * Covers the subset needed for device interaction: source, find, click,\n * sendKeys, actions, and execute (mobile commands).\n *\n * @param baseUrl - Appium server URL (e.g. http://localhost:4723).\n * @param sessionId - Active session ID.\n * @param auth - Optional basic auth for cloud providers like BrowserStack.\n */\nexport class WebDriverClient {\n readonly #baseUrl: string;\n\n readonly #sessionId: string;\n\n readonly #headers: Record<string, string>;\n\n constructor(baseUrl: string, sessionId: string, auth?: AuthConfig) {\n this.#baseUrl = baseUrl.replace(/\\/+$/u, '');\n this.#sessionId = sessionId;\n this.#headers = { 'Content-Type': 'application/json' };\n\n if (auth) {\n const encoded = Buffer.from(`${auth.user}:${auth.key}`).toString(\n 'base64',\n );\n this.#headers.Authorization = `Basic ${encoded}`;\n }\n }\n\n get sessionId(): string {\n return this.#sessionId;\n }\n\n async getPageSource(): Promise<string> {\n return this.#get<string>(`/source`);\n }\n\n async execute<Type>(script: string, args: unknown[] = []): Promise<Type> {\n return this.#post<Type>(`/execute/sync`, { script, args });\n }\n\n async executeAsync<Type>(\n script: string,\n args: unknown[] = [],\n ): Promise<Type> {\n return this.#post<Type>(`/execute/async`, { script, args });\n }\n\n async findElement(\n strategy: string,\n selector: string,\n ): Promise<WebDriverElement> {\n return this.#post(`/element`, { using: strategy, value: selector });\n }\n\n async findElements(\n strategy: string,\n selector: string,\n ): Promise<WebDriverElement[]> {\n return this.#post(`/elements`, { using: strategy, value: selector });\n }\n\n async elementClick(elementId: string): Promise<void> {\n await this.#post(`/element/${elementId}/click`, {});\n }\n\n async elementSendKeys(elementId: string, text: string): Promise<void> {\n await this.#post(`/element/${elementId}/value`, { text });\n }\n\n async elementClear(elementId: string): Promise<void> {\n await this.#post(`/element/${elementId}/clear`, {});\n }\n\n async getElementAttribute(\n elementId: string,\n name: string,\n ): Promise<string | null> {\n return this.#get(`/element/${elementId}/attribute/${name}`);\n }\n\n async getElementRect(\n elementId: string,\n ): Promise<{ x: number; y: number; width: number; height: number }> {\n return this.#get(`/element/${elementId}/rect`);\n }\n\n async performActions(actions: unknown[]): Promise<void> {\n await this.#post(`/actions`, { actions });\n }\n\n async releaseActions(): Promise<void> {\n await this.#delete(`/actions`);\n }\n\n async getStatus(): Promise<Record<string, unknown>> {\n const response = await fetch(`${this.#baseUrl}/status`, {\n headers: this.#headers,\n });\n const body = (await response.json()) as { value: Record<string, unknown> };\n return body.value;\n }\n\n async getSessionDetails(): Promise<Record<string, unknown>> {\n return this.#get(``);\n }\n\n async queryAppState(bundleId: string): Promise<number> {\n return this.execute<number>('mobile: queryAppState', [{ bundleId }]);\n }\n\n async getCurrentActivity(): Promise<string> {\n return this.execute<string>('mobile: getCurrentActivity', []);\n }\n\n async updateSettings(settings: Record<string, unknown>): Promise<void> {\n await this.#post(`/appium/settings`, { settings });\n }\n\n async getContexts(): Promise<string[]> {\n return this.#get<string[]>(`/contexts`);\n }\n\n async setCurrentContext(name: string): Promise<void> {\n await this.#post(`/context`, { name });\n }\n\n async getWindowRect(): Promise<{\n x: number;\n y: number;\n width: number;\n height: number;\n }> {\n return this.#get(`/window/rect`);\n }\n\n async #get<Type>(path: string): Promise<Type> {\n const url = `${this.#baseUrl}/session/${this.#sessionId}${path}`;\n const response = await fetch(url, { headers: this.#headers });\n return this.#unwrap<Type>(response, 'GET', path);\n }\n\n async #post<Type>(path: string, body: unknown): Promise<Type> {\n const url = `${this.#baseUrl}/session/${this.#sessionId}${path}`;\n const response = await fetch(url, {\n method: 'POST',\n headers: this.#headers,\n body: JSON.stringify(body),\n });\n return this.#unwrap<Type>(response, 'POST', path);\n }\n\n async #delete(path: string): Promise<void> {\n const url = `${this.#baseUrl}/session/${this.#sessionId}${path}`;\n const response = await fetch(url, {\n method: 'DELETE',\n headers: this.#headers,\n });\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`DELETE ${path} failed (${response.status}): ${text}`);\n }\n }\n\n async #unwrap<Type>(\n response: Response,\n method: string,\n path: string,\n ): Promise<Type> {\n const body = (await response.json()) as {\n value: Type | { error: string; message: string };\n };\n\n if (!response.ok) {\n const errorValue = body.value as { error?: string; message?: string };\n throw new Error(\n `${method} ${path} failed (${response.status}): ${errorValue?.message ?? JSON.stringify(body.value)}`,\n );\n }\n\n return body.value as Type;\n }\n}\n\nexport async function createSession(\n baseUrl: string,\n capabilities: Record<string, unknown>,\n auth?: AuthConfig,\n): Promise<{ sessionId: string; client: WebDriverClient }> {\n const url = `${baseUrl.replace(/\\/+$/u, '')}/session`;\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n if (auth) {\n const encoded = Buffer.from(`${auth.user}:${auth.key}`).toString('base64');\n headers.Authorization = `Basic ${encoded}`;\n }\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify({\n capabilities: {\n alwaysMatch: capabilities,\n },\n }),\n });\n\n const body = (await response.json()) as {\n value: { sessionId: string; capabilities: Record<string, unknown> };\n };\n\n if (!response.ok) {\n throw new Error(\n `Failed to create Appium session (${response.status}): ${JSON.stringify(body)}`,\n );\n }\n\n const { sessionId } = body.value;\n return {\n sessionId,\n client: new WebDriverClient(baseUrl, sessionId, auth),\n };\n}\n"]}
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
5
+ const index_js_1 = require("../backends/index.cjs");
6
+ const server_js_1 = require("../server.cjs");
7
+ async function main() {
8
+ const deviceId = process.env.DEVICE_ID;
9
+ console.error(`@metamask/device-mcp starting...${deviceId ? ` (DEVICE_ID=${deviceId})` : ' (auto-detect)'}`);
10
+ const backend = (0, index_js_1.createLazyBackend)(deviceId);
11
+ const server = (0, server_js_1.createMcpServer)(backend);
12
+ const transport = new stdio_js_1.StdioServerTransport();
13
+ await server.connect(transport);
14
+ console.error('@metamask/device-mcp ready on stdio');
15
+ }
16
+ main().catch((error) => {
17
+ console.error('Fatal:', error);
18
+ process.exit(1);
19
+ });
20
+ //# sourceMappingURL=device-mcp.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device-mcp.cjs","sourceRoot":"","sources":["../../src/cli/device-mcp.ts"],"names":[],"mappings":";;;AACA,wEAAiF;AAEjF,oDAAyD;AACzD,6CAA+C;AAE/C,KAAK,UAAU,IAAI;IACjB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;IAEvC,OAAO,CAAC,KAAK,CACX,mCAAmC,QAAQ,CAAC,CAAC,CAAC,eAAe,QAAQ,GAAG,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAC9F,CAAC;IAEF,MAAM,OAAO,GAAG,IAAA,4BAAiB,EAAC,QAAQ,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,IAAA,2BAAe,EAAC,OAAO,CAAC,CAAC;IACxC,MAAM,SAAS,GAAG,IAAI,+BAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;AACvD,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IAC9B,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC/B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC","sourcesContent":["#!/usr/bin/env node\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\n\nimport { createLazyBackend } from '../backends/index.js';\nimport { createMcpServer } from '../server.js';\n\nasync function main(): Promise<void> {\n const deviceId = process.env.DEVICE_ID;\n\n console.error(\n `@metamask/device-mcp starting...${deviceId ? ` (DEVICE_ID=${deviceId})` : ' (auto-detect)'}`,\n );\n\n const backend = createLazyBackend(deviceId);\n const server = createMcpServer(backend);\n const transport = new StdioServerTransport();\n await server.connect(transport);\n\n console.error('@metamask/device-mcp ready on stdio');\n}\n\nmain().catch((error: unknown) => {\n console.error('Fatal:', error);\n process.exit(1);\n});\n"]}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=device-mcp.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device-mcp.d.cts","sourceRoot":"","sources":["../../src/cli/device-mcp.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=device-mcp.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device-mcp.d.mts","sourceRoot":"","sources":["../../src/cli/device-mcp.ts"],"names":[],"mappings":""}
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env node
2
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
3
+ import { createLazyBackend } from "../backends/index.mjs";
4
+ import { createMcpServer } from "../server.mjs";
5
+ async function main() {
6
+ const deviceId = process.env.DEVICE_ID;
7
+ console.error(`@metamask/device-mcp starting...${deviceId ? ` (DEVICE_ID=${deviceId})` : ' (auto-detect)'}`);
8
+ const backend = createLazyBackend(deviceId);
9
+ const server = createMcpServer(backend);
10
+ const transport = new StdioServerTransport();
11
+ await server.connect(transport);
12
+ console.error('@metamask/device-mcp ready on stdio');
13
+ }
14
+ main().catch((error) => {
15
+ console.error('Fatal:', error);
16
+ process.exit(1);
17
+ });
18
+ //# sourceMappingURL=device-mcp.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device-mcp.mjs","sourceRoot":"","sources":["../../src/cli/device-mcp.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,oBAAoB,EAAE,kDAAkD;AAEjF,OAAO,EAAE,iBAAiB,EAAE,8BAA6B;AACzD,OAAO,EAAE,eAAe,EAAE,sBAAqB;AAE/C,KAAK,UAAU,IAAI;IACjB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;IAEvC,OAAO,CAAC,KAAK,CACX,mCAAmC,QAAQ,CAAC,CAAC,CAAC,eAAe,QAAQ,GAAG,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAC9F,CAAC;IAEF,MAAM,OAAO,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IACxC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;AACvD,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IAC9B,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC/B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC","sourcesContent":["#!/usr/bin/env node\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\n\nimport { createLazyBackend } from '../backends/index.js';\nimport { createMcpServer } from '../server.js';\n\nasync function main(): Promise<void> {\n const deviceId = process.env.DEVICE_ID;\n\n console.error(\n `@metamask/device-mcp starting...${deviceId ? ` (DEVICE_ID=${deviceId})` : ' (auto-detect)'}`,\n );\n\n const backend = createLazyBackend(deviceId);\n const server = createMcpServer(backend);\n const transport = new StdioServerTransport();\n await server.connect(transport);\n\n console.error('@metamask/device-mcp ready on stdio');\n}\n\nmain().catch((error: unknown) => {\n console.error('Fatal:', error);\n process.exit(1);\n});\n"]}
package/dist/index.cjs ADDED
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createMcpServer = exports.createLazyBackend = exports.createBackend = void 0;
4
+ var index_js_1 = require("./backends/index.cjs");
5
+ Object.defineProperty(exports, "createBackend", { enumerable: true, get: function () { return index_js_1.createBackend; } });
6
+ Object.defineProperty(exports, "createLazyBackend", { enumerable: true, get: function () { return index_js_1.createLazyBackend; } });
7
+ var server_js_1 = require("./server.cjs");
8
+ Object.defineProperty(exports, "createMcpServer", { enumerable: true, get: function () { return server_js_1.createMcpServer; } });
9
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,iDAAuE;AAA9D,yGAAA,aAAa,OAAA;AAAE,6GAAA,iBAAiB,OAAA;AACzC,0CAA8C;AAArC,4GAAA,eAAe,OAAA","sourcesContent":["export { createBackend, createLazyBackend } from './backends/index.js';\nexport { createMcpServer } from './server.js';\n\nexport type {\n DeviceBackend,\n DeviceButton,\n DeviceInfo,\n UIElement,\n ElementQuery,\n SnapshotResult,\n ScreenshotResult,\n LogsResult,\n TapResult,\n AppStateResult,\n Platform,\n WindowSize,\n} from './backends/types.js';\n\nexport type { SessionConfig } from './backends/session-file.js';\n"]}
@@ -0,0 +1,5 @@
1
+ export { createBackend, createLazyBackend } from "./backends/index.cjs";
2
+ export { createMcpServer } from "./server.cjs";
3
+ export type { DeviceBackend, DeviceButton, DeviceInfo, UIElement, ElementQuery, SnapshotResult, ScreenshotResult, LogsResult, TapResult, AppStateResult, Platform, WindowSize, } from "./backends/types.cjs";
4
+ export type { SessionConfig } from "./backends/session-file.cjs";
5
+ //# sourceMappingURL=index.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,6BAA4B;AACvE,OAAO,EAAE,eAAe,EAAE,qBAAoB;AAE9C,YAAY,EACV,aAAa,EACb,YAAY,EACZ,UAAU,EACV,SAAS,EACT,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,UAAU,EACV,SAAS,EACT,cAAc,EACd,QAAQ,EACR,UAAU,GACX,6BAA4B;AAE7B,YAAY,EAAE,aAAa,EAAE,oCAAmC"}
@@ -0,0 +1,5 @@
1
+ export { createBackend, createLazyBackend } from "./backends/index.mjs";
2
+ export { createMcpServer } from "./server.mjs";
3
+ export type { DeviceBackend, DeviceButton, DeviceInfo, UIElement, ElementQuery, SnapshotResult, ScreenshotResult, LogsResult, TapResult, AppStateResult, Platform, WindowSize, } from "./backends/types.mjs";
4
+ export type { SessionConfig } from "./backends/session-file.mjs";
5
+ //# sourceMappingURL=index.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,6BAA4B;AACvE,OAAO,EAAE,eAAe,EAAE,qBAAoB;AAE9C,YAAY,EACV,aAAa,EACb,YAAY,EACZ,UAAU,EACV,SAAS,EACT,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,UAAU,EACV,SAAS,EACT,cAAc,EACd,QAAQ,EACR,UAAU,GACX,6BAA4B;AAE7B,YAAY,EAAE,aAAa,EAAE,oCAAmC"}
package/dist/index.mjs ADDED
@@ -0,0 +1,3 @@
1
+ export { createBackend, createLazyBackend } from "./backends/index.mjs";
2
+ export { createMcpServer } from "./server.mjs";
3
+ //# sourceMappingURL=index.mjs.map