@metamask/device-mcp 0.1.0 → 0.3.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 (156) hide show
  1. package/CHANGELOG.md +29 -14
  2. package/LICENSE +6 -0
  3. package/LICENSE.APACHE2 +201 -0
  4. package/LICENSE.MIT +21 -0
  5. package/README.md +114 -33
  6. package/dist/backends/adb-backend.cjs +21 -5
  7. package/dist/backends/adb-backend.cjs.map +1 -1
  8. package/dist/backends/adb-backend.d.cts +9 -2
  9. package/dist/backends/adb-backend.d.cts.map +1 -1
  10. package/dist/backends/adb-backend.d.mts +9 -2
  11. package/dist/backends/adb-backend.d.mts.map +1 -1
  12. package/dist/backends/adb-backend.mjs +21 -5
  13. package/dist/backends/adb-backend.mjs.map +1 -1
  14. package/dist/backends/appium-backend.cjs +25 -7
  15. package/dist/backends/appium-backend.cjs.map +1 -1
  16. package/dist/backends/appium-backend.d.cts +9 -2
  17. package/dist/backends/appium-backend.d.cts.map +1 -1
  18. package/dist/backends/appium-backend.d.mts +9 -2
  19. package/dist/backends/appium-backend.d.mts.map +1 -1
  20. package/dist/backends/appium-backend.mjs +25 -7
  21. package/dist/backends/appium-backend.mjs.map +1 -1
  22. package/dist/backends/idb-backend.cjs +96 -38
  23. package/dist/backends/idb-backend.cjs.map +1 -1
  24. package/dist/backends/idb-backend.d.cts +9 -2
  25. package/dist/backends/idb-backend.d.cts.map +1 -1
  26. package/dist/backends/idb-backend.d.mts +9 -2
  27. package/dist/backends/idb-backend.d.mts.map +1 -1
  28. package/dist/backends/idb-backend.mjs +97 -39
  29. package/dist/backends/idb-backend.mjs.map +1 -1
  30. package/dist/backends/index.cjs +37 -15
  31. package/dist/backends/index.cjs.map +1 -1
  32. package/dist/backends/index.d.cts +8 -11
  33. package/dist/backends/index.d.cts.map +1 -1
  34. package/dist/backends/index.d.mts +8 -11
  35. package/dist/backends/index.d.mts.map +1 -1
  36. package/dist/backends/index.mjs +38 -16
  37. package/dist/backends/index.mjs.map +1 -1
  38. package/dist/backends/types.cjs.map +1 -1
  39. package/dist/backends/types.d.cts +20 -1
  40. package/dist/backends/types.d.cts.map +1 -1
  41. package/dist/backends/types.d.mts +20 -1
  42. package/dist/backends/types.d.mts.map +1 -1
  43. package/dist/backends/types.mjs.map +1 -1
  44. package/dist/cli/device-mcp.cjs +11 -2
  45. package/dist/cli/device-mcp.cjs.map +1 -1
  46. package/dist/cli/device-mcp.mjs +11 -2
  47. package/dist/cli/device-mcp.mjs.map +1 -1
  48. package/dist/hermes/hermes-cdp.cjs +674 -0
  49. package/dist/hermes/hermes-cdp.cjs.map +1 -0
  50. package/dist/hermes/hermes-cdp.d.cts +248 -0
  51. package/dist/hermes/hermes-cdp.d.cts.map +1 -0
  52. package/dist/hermes/hermes-cdp.d.mts +248 -0
  53. package/dist/hermes/hermes-cdp.d.mts.map +1 -0
  54. package/dist/hermes/hermes-cdp.mjs +665 -0
  55. package/dist/hermes/hermes-cdp.mjs.map +1 -0
  56. package/dist/hermes/session.cjs +196 -0
  57. package/dist/hermes/session.cjs.map +1 -0
  58. package/dist/hermes/session.d.cts +163 -0
  59. package/dist/hermes/session.d.cts.map +1 -0
  60. package/dist/hermes/session.d.mts +163 -0
  61. package/dist/hermes/session.d.mts.map +1 -0
  62. package/dist/hermes/session.mjs +189 -0
  63. package/dist/hermes/session.mjs.map +1 -0
  64. package/dist/index.cjs +19 -1
  65. package/dist/index.cjs.map +1 -1
  66. package/dist/index.d.cts +8 -1
  67. package/dist/index.d.cts.map +1 -1
  68. package/dist/index.d.mts +8 -1
  69. package/dist/index.d.mts.map +1 -1
  70. package/dist/index.mjs +3 -0
  71. package/dist/index.mjs.map +1 -1
  72. package/dist/server.cjs +8 -0
  73. package/dist/server.cjs.map +1 -1
  74. package/dist/server.d.cts +2 -2
  75. package/dist/server.d.cts.map +1 -1
  76. package/dist/server.d.mts +2 -2
  77. package/dist/server.d.mts.map +1 -1
  78. package/dist/server.mjs +9 -1
  79. package/dist/server.mjs.map +1 -1
  80. package/dist/tools/get-element-text.cjs +46 -0
  81. package/dist/tools/get-element-text.cjs.map +1 -0
  82. package/dist/tools/get-element-text.d.cts +4 -0
  83. package/dist/tools/get-element-text.d.cts.map +1 -0
  84. package/dist/tools/get-element-text.d.mts +4 -0
  85. package/dist/tools/get-element-text.d.mts.map +1 -0
  86. package/dist/tools/get-element-text.mjs +43 -0
  87. package/dist/tools/get-element-text.mjs.map +1 -0
  88. package/dist/tools/hermes-cdp.cjs +102 -0
  89. package/dist/tools/hermes-cdp.cjs.map +1 -0
  90. package/dist/tools/hermes-cdp.d.cts +18 -0
  91. package/dist/tools/hermes-cdp.d.cts.map +1 -0
  92. package/dist/tools/hermes-cdp.d.mts +18 -0
  93. package/dist/tools/hermes-cdp.d.mts.map +1 -0
  94. package/dist/tools/hermes-cdp.mjs +99 -0
  95. package/dist/tools/hermes-cdp.mjs.map +1 -0
  96. package/dist/tools/hermes-targets.cjs +127 -0
  97. package/dist/tools/hermes-targets.cjs.map +1 -0
  98. package/dist/tools/hermes-targets.d.cts +20 -0
  99. package/dist/tools/hermes-targets.d.cts.map +1 -0
  100. package/dist/tools/hermes-targets.d.mts +20 -0
  101. package/dist/tools/hermes-targets.d.mts.map +1 -0
  102. package/dist/tools/hermes-targets.mjs +124 -0
  103. package/dist/tools/hermes-targets.mjs.map +1 -0
  104. package/dist/tools/index.cjs +11 -1
  105. package/dist/tools/index.cjs.map +1 -1
  106. package/dist/tools/index.d.cts +5 -0
  107. package/dist/tools/index.d.cts.map +1 -1
  108. package/dist/tools/index.d.mts +5 -0
  109. package/dist/tools/index.d.mts.map +1 -1
  110. package/dist/tools/index.mjs +5 -0
  111. package/dist/tools/index.mjs.map +1 -1
  112. package/dist/tools/list-devices.cjs +36 -0
  113. package/dist/tools/list-devices.cjs.map +1 -0
  114. package/dist/tools/list-devices.d.cts +4 -0
  115. package/dist/tools/list-devices.d.cts.map +1 -0
  116. package/dist/tools/list-devices.d.mts +4 -0
  117. package/dist/tools/list-devices.d.mts.map +1 -0
  118. package/dist/tools/list-devices.mjs +33 -0
  119. package/dist/tools/list-devices.mjs.map +1 -0
  120. package/dist/tools/screenshot.cjs +8 -3
  121. package/dist/tools/screenshot.cjs.map +1 -1
  122. package/dist/tools/screenshot.d.cts.map +1 -1
  123. package/dist/tools/screenshot.d.mts.map +1 -1
  124. package/dist/tools/screenshot.mjs +8 -3
  125. package/dist/tools/screenshot.mjs.map +1 -1
  126. package/dist/tools/select-device.cjs +38 -0
  127. package/dist/tools/select-device.cjs.map +1 -0
  128. package/dist/tools/select-device.d.cts +4 -0
  129. package/dist/tools/select-device.d.cts.map +1 -0
  130. package/dist/tools/select-device.d.mts +4 -0
  131. package/dist/tools/select-device.d.mts.map +1 -0
  132. package/dist/tools/select-device.mjs +35 -0
  133. package/dist/tools/select-device.mjs.map +1 -0
  134. package/dist/utils/exec.cjs +11 -9
  135. package/dist/utils/exec.cjs.map +1 -1
  136. package/dist/utils/exec.d.cts.map +1 -1
  137. package/dist/utils/exec.d.mts.map +1 -1
  138. package/dist/utils/exec.mjs +11 -9
  139. package/dist/utils/exec.mjs.map +1 -1
  140. package/dist/utils/output-path.cjs +128 -0
  141. package/dist/utils/output-path.cjs.map +1 -0
  142. package/dist/utils/output-path.d.cts +41 -0
  143. package/dist/utils/output-path.d.cts.map +1 -0
  144. package/dist/utils/output-path.d.mts +41 -0
  145. package/dist/utils/output-path.d.mts.map +1 -0
  146. package/dist/utils/output-path.mjs +123 -0
  147. package/dist/utils/output-path.mjs.map +1 -0
  148. package/dist/utils/platform.cjs +121 -36
  149. package/dist/utils/platform.cjs.map +1 -1
  150. package/dist/utils/platform.d.cts +14 -3
  151. package/dist/utils/platform.d.cts.map +1 -1
  152. package/dist/utils/platform.d.mts +14 -3
  153. package/dist/utils/platform.d.mts.map +1 -1
  154. package/dist/utils/platform.mjs +117 -36
  155. package/dist/utils/platform.mjs.map +1 -1
  156. package/package.json +2 -2
@@ -1,16 +1,13 @@
1
- import type { DeviceBackend } from "./types.mjs";
1
+ import type { DeviceBackend, Platform } from "./types.mjs";
2
+ import type { DetectedDevice } from "../utils/platform.mjs";
2
3
  export type { DeviceBackend } from "./types.mjs";
3
4
  export { AdbBackend } from "./adb-backend.mjs";
4
5
  export { AppiumBackend } from "./appium-backend.mjs";
5
6
  export { IdbBackend } from "./idb-backend.mjs";
6
- export declare function createBackend(explicitDeviceId?: string): Promise<DeviceBackend>;
7
- /**
8
- * Lazy backend that defers device detection to first tool call.
9
- * Allows the MCP server to start and complete the handshake
10
- * even when no device is connected yet.
11
- *
12
- * @param explicitDeviceId - Optional device ID override.
13
- * @returns A DeviceBackend that resolves on first use.
14
- */
15
- export declare function createLazyBackend(explicitDeviceId?: string): DeviceBackend;
7
+ export type LazyDeviceBackend = DeviceBackend & {
8
+ selectDevice(deviceId: string): void;
9
+ listDevices(): Promise<DetectedDevice[]>;
10
+ };
11
+ export declare function createBackend(explicitDeviceId?: string, explicitPlatform?: Platform): Promise<DeviceBackend>;
12
+ export declare function createLazyBackend(explicitDeviceId?: string, explicitPlatform?: Platform): LazyDeviceBackend;
16
13
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../../src/backends/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,aAAa,EAYd,oBAAmB;AAGpB,YAAY,EAAE,aAAa,EAAE,oBAAmB;AAChD,OAAO,EAAE,UAAU,EAAE,0BAAyB;AAC9C,OAAO,EAAE,aAAa,EAAE,6BAA4B;AACpD,OAAO,EAAE,UAAU,EAAE,0BAAyB;AAE9C,wBAAsB,aAAa,CACjC,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO,CAAC,aAAa,CAAC,CAmBxB;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,aAAa,CA6I1E"}
1
+ {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../../src/backends/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,aAAa,EAYb,QAAQ,EAET,oBAAmB;AAMpB,OAAO,KAAK,EAAE,cAAc,EAAE,8BAA6B;AAE3D,YAAY,EAAE,aAAa,EAAE,oBAAmB;AAChD,OAAO,EAAE,UAAU,EAAE,0BAAyB;AAC9C,OAAO,EAAE,aAAa,EAAE,6BAA4B;AACpD,OAAO,EAAE,UAAU,EAAE,0BAAyB;AAE9C,MAAM,MAAM,iBAAiB,GAAG,aAAa,GAAG;IAC9C,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,WAAW,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;CAC1C,CAAC;AAEF,wBAAsB,aAAa,CACjC,gBAAgB,CAAC,EAAE,MAAM,EACzB,gBAAgB,CAAC,EAAE,QAAQ,GAC1B,OAAO,CAAC,aAAa,CAAC,CAsBxB;AAED,wBAAgB,iBAAiB,CAC/B,gBAAgB,CAAC,EAAE,MAAM,EACzB,gBAAgB,CAAC,EAAE,QAAQ,GAC1B,iBAAiB,CAgMnB"}
@@ -2,11 +2,11 @@ import { AdbBackend } from "./adb-backend.mjs";
2
2
  import { AppiumBackend } from "./appium-backend.mjs";
3
3
  import { IdbBackend } from "./idb-backend.mjs";
4
4
  import { readSessionFile } from "./session-file.mjs";
5
- import { detectPlatform } from "../utils/platform.mjs";
5
+ import { detectPlatform, detectAllDevices, MultipleDevicesError } from "../utils/platform.mjs";
6
6
  export { AdbBackend } from "./adb-backend.mjs";
7
7
  export { AppiumBackend } from "./appium-backend.mjs";
8
8
  export { IdbBackend } from "./idb-backend.mjs";
9
- export async function createBackend(explicitDeviceId) {
9
+ export async function createBackend(explicitDeviceId, explicitPlatform) {
10
10
  const sessionConfig = await readSessionFile();
11
11
  if (sessionConfig) {
12
12
  console.error(`Found .device-session (${sessionConfig.mode}, ${sessionConfig.platform})`);
@@ -14,38 +14,59 @@ export async function createBackend(explicitDeviceId) {
14
14
  await backend.ensureConnected();
15
15
  return backend;
16
16
  }
17
- const { platform, deviceId } = await detectPlatform(explicitDeviceId);
17
+ const { platform, deviceId } = await detectPlatform(explicitDeviceId, explicitPlatform);
18
18
  const backend = platform === 'ios' ? new IdbBackend(deviceId) : new AdbBackend(deviceId);
19
19
  await backend.ensureConnected();
20
20
  return backend;
21
21
  }
22
- /**
23
- * Lazy backend that defers device detection to first tool call.
24
- * Allows the MCP server to start and complete the handshake
25
- * even when no device is connected yet.
26
- *
27
- * @param explicitDeviceId - Optional device ID override.
28
- * @returns A DeviceBackend that resolves on first use.
29
- */
30
- export function createLazyBackend(explicitDeviceId) {
22
+ export function createLazyBackend(explicitDeviceId, explicitPlatform) {
31
23
  let inner = null;
32
24
  let connecting = null;
25
+ let pendingDevices = null;
26
+ let selectedOverride = null;
33
27
  async function resolve() {
34
28
  if (inner) {
35
29
  return inner;
36
30
  }
31
+ if (pendingDevices && !selectedOverride) {
32
+ throw new MultipleDevicesError(pendingDevices);
33
+ }
37
34
  if (!connecting) {
38
- connecting = createBackend(explicitDeviceId).then((backend) => {
35
+ const deviceId = selectedOverride ?? explicitDeviceId;
36
+ connecting = createBackend(deviceId, explicitPlatform)
37
+ .then((backend) => {
39
38
  inner = backend;
39
+ pendingDevices = null;
40
40
  return backend;
41
+ })
42
+ .catch((error) => {
43
+ connecting = null;
44
+ if (error instanceof MultipleDevicesError) {
45
+ pendingDevices = error.devices;
46
+ }
47
+ throw error;
41
48
  });
42
49
  }
43
50
  return connecting;
44
51
  }
52
+ async function screenshot(outputPath, options) {
53
+ return (await resolve()).screenshot(outputPath, options);
54
+ }
45
55
  return {
46
56
  get platform() {
47
57
  return inner?.platform ?? 'ios';
48
58
  },
59
+ selectDevice(deviceId) {
60
+ selectedOverride = deviceId;
61
+ inner = null;
62
+ connecting = null;
63
+ },
64
+ async listDevices() {
65
+ if (pendingDevices) {
66
+ return pendingDevices;
67
+ }
68
+ return detectAllDevices(explicitPlatform);
69
+ },
49
70
  async getDeviceInfo() {
50
71
  return (await resolve()).getDeviceInfo();
51
72
  },
@@ -70,9 +91,7 @@ export function createLazyBackend(explicitDeviceId) {
70
91
  async getAppState(bundleId) {
71
92
  return (await resolve()).getAppState(bundleId);
72
93
  },
73
- async screenshot(outputPath) {
74
- return (await resolve()).screenshot(outputPath);
75
- },
94
+ screenshot,
76
95
  async openApp(bundleId) {
77
96
  return (await resolve()).openApp(bundleId);
78
97
  },
@@ -121,6 +140,9 @@ export function createLazyBackend(explicitDeviceId) {
121
140
  async stopScreenRecording() {
122
141
  return (await resolve()).stopScreenRecording();
123
142
  },
143
+ async getElementText(query) {
144
+ return (await resolve()).getElementText(query);
145
+ },
124
146
  };
125
147
  }
126
148
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sourceRoot":"","sources":["../../src/backends/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { AdbBackend } from './adb-backend.js';\nimport { AppiumBackend } from './appium-backend.js';\nimport { IdbBackend } from './idb-backend.js';\nimport { readSessionFile } from './session-file.js';\nimport type {\n DeviceBackend,\n DeviceButton,\n DeviceInfo,\n LogsResult,\n ScreenshotResult,\n SnapshotResult,\n TapResult,\n AppStateResult,\n ElementQuery,\n UIElement,\n Platform,\n WindowSize,\n} from './types.js';\nimport { detectPlatform } from '../utils/platform.js';\n\nexport type { DeviceBackend } from './types.js';\nexport { AdbBackend } from './adb-backend.js';\nexport { AppiumBackend } from './appium-backend.js';\nexport { IdbBackend } from './idb-backend.js';\n\nexport async function createBackend(\n explicitDeviceId?: string,\n): Promise<DeviceBackend> {\n const sessionConfig = await readSessionFile();\n\n if (sessionConfig) {\n console.error(\n `Found .device-session (${sessionConfig.mode}, ${sessionConfig.platform})`,\n );\n const backend = new AppiumBackend(sessionConfig);\n await backend.ensureConnected();\n return backend;\n }\n\n const { platform, deviceId } = await detectPlatform(explicitDeviceId);\n\n const backend =\n platform === 'ios' ? new IdbBackend(deviceId) : new AdbBackend(deviceId);\n\n await backend.ensureConnected();\n return backend;\n}\n\n/**\n * Lazy backend that defers device detection to first tool call.\n * Allows the MCP server to start and complete the handshake\n * even when no device is connected yet.\n *\n * @param explicitDeviceId - Optional device ID override.\n * @returns A DeviceBackend that resolves on first use.\n */\nexport function createLazyBackend(explicitDeviceId?: string): DeviceBackend {\n let inner: DeviceBackend | null = null;\n let connecting: Promise<DeviceBackend> | null = null;\n\n async function resolve(): Promise<DeviceBackend> {\n if (inner) {\n return inner;\n }\n if (!connecting) {\n connecting = createBackend(explicitDeviceId).then((backend) => {\n inner = backend;\n return backend;\n });\n }\n return connecting;\n }\n\n return {\n get platform(): Platform {\n return inner?.platform ?? 'ios';\n },\n\n async getDeviceInfo(): Promise<DeviceInfo> {\n return (await resolve()).getDeviceInfo();\n },\n\n async snapshot(): Promise<SnapshotResult> {\n return (await resolve()).snapshot();\n },\n\n async tapElement(query: ElementQuery): Promise<TapResult> {\n return (await resolve()).tapElement(query);\n },\n\n async tapCoordinates(x: number, y: number): Promise<void> {\n return (await resolve()).tapCoordinates(x, y);\n },\n\n async typeText(text: string): Promise<void> {\n return (await resolve()).typeText(text);\n },\n\n async swipe(\n direction: 'up' | 'down' | 'left' | 'right',\n startX?: number,\n startY?: number,\n distance?: number,\n ): Promise<void> {\n return (await resolve()).swipe(direction, startX, startY, distance);\n },\n\n async waitForElement(\n query: ElementQuery,\n timeoutMs?: number,\n intervalMs?: number,\n ): Promise<UIElement> {\n return (await resolve()).waitForElement(query, timeoutMs, intervalMs);\n },\n\n async getAppState(bundleId: string): Promise<AppStateResult> {\n return (await resolve()).getAppState(bundleId);\n },\n\n async screenshot(outputPath?: string): Promise<ScreenshotResult> {\n return (await resolve()).screenshot(outputPath);\n },\n\n async openApp(bundleId: string): Promise<void> {\n return (await resolve()).openApp(bundleId);\n },\n\n async closeApp(bundleId: string): Promise<void> {\n return (await resolve()).closeApp(bundleId);\n },\n\n async pressButton(button: DeviceButton): Promise<void> {\n return (await resolve()).pressButton(button);\n },\n\n async dismissKeyboard(): Promise<void> {\n return (await resolve()).dismissKeyboard();\n },\n\n async dismissAlert(accept: boolean): Promise<void> {\n return (await resolve()).dismissAlert(accept);\n },\n\n async getLogs(\n durationSeconds?: number,\n filter?: string,\n ): Promise<LogsResult> {\n return (await resolve()).getLogs(durationSeconds, filter);\n },\n\n async longPress(\n query: ElementQuery,\n durationMs?: number,\n ): Promise<TapResult> {\n return (await resolve()).longPress(query, durationMs);\n },\n\n async scrollToElement(\n query: ElementQuery,\n direction?: 'up' | 'down',\n maxAttempts?: number,\n ): Promise<UIElement> {\n return (await resolve()).scrollToElement(query, direction, maxAttempts);\n },\n\n async getAlertText(): Promise<string> {\n return (await resolve()).getAlertText();\n },\n\n async getWindowSize(): Promise<WindowSize> {\n return (await resolve()).getWindowSize();\n },\n\n async getContexts(): Promise<string[]> {\n return (await resolve()).getContexts();\n },\n\n async setContext(context: string): Promise<void> {\n return (await resolve()).setContext(context);\n },\n\n async getClipboard(): Promise<string> {\n return (await resolve()).getClipboard();\n },\n\n async setClipboard(text: string): Promise<void> {\n return (await resolve()).setClipboard(text);\n },\n\n async startScreenRecording(outputPath?: string): Promise<void> {\n return (await resolve()).startScreenRecording(outputPath);\n },\n\n async stopScreenRecording(): Promise<string> {\n return (await resolve()).stopScreenRecording();\n },\n };\n}\n"]}
1
+ {"version":3,"file":"index.mjs","sourceRoot":"","sources":["../../src/backends/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { AdbBackend } from './adb-backend.js';\nimport { AppiumBackend } from './appium-backend.js';\nimport { IdbBackend } from './idb-backend.js';\nimport { readSessionFile } from './session-file.js';\nimport type {\n DeviceBackend,\n DeviceButton,\n DeviceInfo,\n LogsResult,\n ScreenshotResult,\n ScreenshotFileResult,\n ScreenshotOptions,\n SnapshotResult,\n TapResult,\n AppStateResult,\n ElementQuery,\n UIElement,\n Platform,\n WindowSize,\n} from './types.js';\nimport {\n detectPlatform,\n detectAllDevices,\n MultipleDevicesError,\n} from '../utils/platform.js';\nimport type { DetectedDevice } from '../utils/platform.js';\n\nexport type { DeviceBackend } from './types.js';\nexport { AdbBackend } from './adb-backend.js';\nexport { AppiumBackend } from './appium-backend.js';\nexport { IdbBackend } from './idb-backend.js';\n\nexport type LazyDeviceBackend = DeviceBackend & {\n selectDevice(deviceId: string): void;\n listDevices(): Promise<DetectedDevice[]>;\n};\n\nexport async function createBackend(\n explicitDeviceId?: string,\n explicitPlatform?: Platform,\n): Promise<DeviceBackend> {\n const sessionConfig = await readSessionFile();\n\n if (sessionConfig) {\n console.error(\n `Found .device-session (${sessionConfig.mode}, ${sessionConfig.platform})`,\n );\n const backend = new AppiumBackend(sessionConfig);\n await backend.ensureConnected();\n return backend;\n }\n\n const { platform, deviceId } = await detectPlatform(\n explicitDeviceId,\n explicitPlatform,\n );\n\n const backend =\n platform === 'ios' ? new IdbBackend(deviceId) : new AdbBackend(deviceId);\n\n await backend.ensureConnected();\n return backend;\n}\n\nexport function createLazyBackend(\n explicitDeviceId?: string,\n explicitPlatform?: Platform,\n): LazyDeviceBackend {\n let inner: DeviceBackend | null = null;\n let connecting: Promise<DeviceBackend> | null = null;\n let pendingDevices: DetectedDevice[] | null = null;\n let selectedOverride: string | null = null;\n\n async function resolve(): Promise<DeviceBackend> {\n if (inner) {\n return inner;\n }\n\n if (pendingDevices && !selectedOverride) {\n throw new MultipleDevicesError(pendingDevices);\n }\n\n if (!connecting) {\n const deviceId = selectedOverride ?? explicitDeviceId;\n connecting = createBackend(deviceId, explicitPlatform)\n .then((backend) => {\n inner = backend;\n pendingDevices = null;\n return backend;\n })\n .catch((error: unknown) => {\n connecting = null;\n if (error instanceof MultipleDevicesError) {\n pendingDevices = error.devices;\n }\n throw error;\n });\n }\n return connecting;\n }\n\n function screenshot(\n outputPath?: string,\n options?: { encode?: true },\n ): Promise<ScreenshotResult>;\n function screenshot(\n outputPath: string | undefined,\n options: { encode: false },\n ): Promise<ScreenshotFileResult>;\n function screenshot(\n outputPath?: string,\n options?: ScreenshotOptions,\n ): Promise<ScreenshotResult | ScreenshotFileResult>;\n async function screenshot(\n outputPath?: string,\n options?: ScreenshotOptions,\n ): Promise<ScreenshotResult | ScreenshotFileResult> {\n return (await resolve()).screenshot(outputPath, options);\n }\n\n return {\n get platform(): Platform {\n return inner?.platform ?? 'ios';\n },\n\n selectDevice(deviceId: string): void {\n selectedOverride = deviceId;\n inner = null;\n connecting = null;\n },\n\n async listDevices(): Promise<DetectedDevice[]> {\n if (pendingDevices) {\n return pendingDevices;\n }\n return detectAllDevices(explicitPlatform);\n },\n\n async getDeviceInfo(): Promise<DeviceInfo> {\n return (await resolve()).getDeviceInfo();\n },\n\n async snapshot(): Promise<SnapshotResult> {\n return (await resolve()).snapshot();\n },\n\n async tapElement(query: ElementQuery): Promise<TapResult> {\n return (await resolve()).tapElement(query);\n },\n\n async tapCoordinates(x: number, y: number): Promise<void> {\n return (await resolve()).tapCoordinates(x, y);\n },\n\n async typeText(text: string): Promise<void> {\n return (await resolve()).typeText(text);\n },\n\n async swipe(\n direction: 'up' | 'down' | 'left' | 'right',\n startX?: number,\n startY?: number,\n distance?: number,\n ): Promise<void> {\n return (await resolve()).swipe(direction, startX, startY, distance);\n },\n\n async waitForElement(\n query: ElementQuery,\n timeoutMs?: number,\n intervalMs?: number,\n ): Promise<UIElement> {\n return (await resolve()).waitForElement(query, timeoutMs, intervalMs);\n },\n\n async getAppState(bundleId: string): Promise<AppStateResult> {\n return (await resolve()).getAppState(bundleId);\n },\n\n screenshot,\n\n async openApp(bundleId: string): Promise<void> {\n return (await resolve()).openApp(bundleId);\n },\n\n async closeApp(bundleId: string): Promise<void> {\n return (await resolve()).closeApp(bundleId);\n },\n\n async pressButton(button: DeviceButton): Promise<void> {\n return (await resolve()).pressButton(button);\n },\n\n async dismissKeyboard(): Promise<void> {\n return (await resolve()).dismissKeyboard();\n },\n\n async dismissAlert(accept: boolean): Promise<void> {\n return (await resolve()).dismissAlert(accept);\n },\n\n async getLogs(\n durationSeconds?: number,\n filter?: string,\n ): Promise<LogsResult> {\n return (await resolve()).getLogs(durationSeconds, filter);\n },\n\n async longPress(\n query: ElementQuery,\n durationMs?: number,\n ): Promise<TapResult> {\n return (await resolve()).longPress(query, durationMs);\n },\n\n async scrollToElement(\n query: ElementQuery,\n direction?: 'up' | 'down',\n maxAttempts?: number,\n ): Promise<UIElement> {\n return (await resolve()).scrollToElement(query, direction, maxAttempts);\n },\n\n async getAlertText(): Promise<string> {\n return (await resolve()).getAlertText();\n },\n\n async getWindowSize(): Promise<WindowSize> {\n return (await resolve()).getWindowSize();\n },\n\n async getContexts(): Promise<string[]> {\n return (await resolve()).getContexts();\n },\n\n async setContext(context: string): Promise<void> {\n return (await resolve()).setContext(context);\n },\n\n async getClipboard(): Promise<string> {\n return (await resolve()).getClipboard();\n },\n\n async setClipboard(text: string): Promise<void> {\n return (await resolve()).setClipboard(text);\n },\n\n async startScreenRecording(outputPath?: string): Promise<void> {\n return (await resolve()).startScreenRecording(outputPath);\n },\n\n async stopScreenRecording(): Promise<string> {\n return (await resolve()).stopScreenRecording();\n },\n\n async getElementText(query: ElementQuery): Promise<string> {\n return (await resolve()).getElementText(query);\n },\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"types.cjs","sourceRoot":"","sources":["../../src/backends/types.ts"],"names":[],"mappings":"","sourcesContent":["export type Platform = 'ios' | 'android';\n\nexport type DeviceInfo = {\n platform: Platform;\n deviceId: string;\n name: string;\n osVersion: string;\n state: string;\n};\n\nexport type UIElement = {\n type: string;\n label?: string;\n value?: string;\n identifier?: string;\n frame: { x: number; y: number; width: number; height: number };\n enabled: boolean;\n children?: UIElement[];\n};\n\nexport type SnapshotResult = {\n platform: Platform;\n hierarchy: UIElement[];\n raw: string;\n timestamp: number;\n};\n\nexport type TapResult = {\n success: boolean;\n x: number;\n y: number;\n targetDescription: string;\n};\n\nexport type AppStateResult = {\n bundleId: string;\n state: string;\n pid?: number;\n};\n\nexport type ScreenshotResult = {\n data: string;\n format: 'png' | 'jpeg';\n path?: string;\n};\n\nexport type LogEntry = {\n timestamp: string;\n level: string;\n message: string;\n};\n\nexport type LogsResult = {\n entries: LogEntry[];\n source: string;\n};\n\nexport type ElementQuery = {\n label?: string;\n identifier?: string;\n text?: string;\n type?: string;\n};\n\nexport type DeviceButton = 'home' | 'back' | 'enter' | 'lock';\n\nexport type WindowSize = {\n width: number;\n height: number;\n};\n\nexport type DeviceBackend = {\n readonly platform: Platform;\n\n getDeviceInfo(): Promise<DeviceInfo>;\n\n snapshot(): Promise<SnapshotResult>;\n\n tapElement(query: ElementQuery): Promise<TapResult>;\n\n tapCoordinates(x: number, y: number): Promise<void>;\n\n typeText(text: string): Promise<void>;\n\n swipe(\n direction: 'up' | 'down' | 'left' | 'right',\n startX?: number,\n startY?: number,\n distance?: number,\n ): Promise<void>;\n\n waitForElement(\n query: ElementQuery,\n timeoutMs?: number,\n intervalMs?: number,\n ): Promise<UIElement>;\n\n getAppState(bundleId: string): Promise<AppStateResult>;\n\n screenshot(outputPath?: string): Promise<ScreenshotResult>;\n\n openApp(bundleId: string): Promise<void>;\n\n closeApp(bundleId: string): Promise<void>;\n\n pressButton(button: DeviceButton): Promise<void>;\n\n dismissKeyboard(): Promise<void>;\n\n dismissAlert(accept: boolean): Promise<void>;\n\n getLogs(durationSeconds?: number, filter?: string): Promise<LogsResult>;\n\n longPress(query: ElementQuery, durationMs?: number): Promise<TapResult>;\n\n scrollToElement(\n query: ElementQuery,\n direction?: 'up' | 'down',\n maxAttempts?: number,\n ): Promise<UIElement>;\n\n getAlertText(): Promise<string>;\n\n getWindowSize(): Promise<WindowSize>;\n\n getContexts(): Promise<string[]>;\n\n setContext(context: string): Promise<void>;\n\n getClipboard(): Promise<string>;\n\n setClipboard(text: string): Promise<void>;\n\n startScreenRecording(outputPath?: string): Promise<void>;\n\n stopScreenRecording(): Promise<string>;\n};\n"]}
1
+ {"version":3,"file":"types.cjs","sourceRoot":"","sources":["../../src/backends/types.ts"],"names":[],"mappings":"","sourcesContent":["export type Platform = 'ios' | 'android';\n\nexport type DeviceInfo = {\n platform: Platform;\n deviceId: string;\n name: string;\n osVersion: string;\n state: string;\n};\n\nexport type UIElement = {\n type: string;\n label?: string;\n value?: string;\n identifier?: string;\n frame: { x: number; y: number; width: number; height: number };\n enabled: boolean;\n children?: UIElement[];\n};\n\nexport type SnapshotResult = {\n platform: Platform;\n hierarchy: UIElement[];\n raw: string;\n timestamp: number;\n};\n\nexport type TapResult = {\n success: boolean;\n x: number;\n y: number;\n targetDescription: string;\n};\n\nexport type AppStateResult = {\n bundleId: string;\n state: string;\n pid?: number;\n};\n\nexport type ScreenshotResult = {\n /** Base64-encoded image data. */\n data: string;\n format: 'png' | 'jpeg';\n /** File path the screenshot was written to, when captured to disk. */\n path?: string;\n};\n\n/** Result of a screenshot captured with `encode: false`: file `path` only, no base64 `data`. */\nexport type ScreenshotFileResult = {\n data?: undefined;\n format: 'png' | 'jpeg';\n path: string;\n};\n\nexport type ScreenshotOptions = {\n /** Include base64 image data in the result. Defaults to `true`. */\n encode?: boolean;\n};\n\nexport type LogEntry = {\n timestamp: string;\n level: string;\n message: string;\n};\n\nexport type LogsResult = {\n entries: LogEntry[];\n source: string;\n};\n\nexport type ElementQuery = {\n label?: string;\n identifier?: string;\n text?: string;\n type?: string;\n};\n\nexport type DeviceButton = 'home' | 'back' | 'enter' | 'lock';\n\nexport type WindowSize = {\n width: number;\n height: number;\n};\n\nexport type DeviceBackend = {\n readonly platform: Platform;\n\n getDeviceInfo(): Promise<DeviceInfo>;\n\n snapshot(): Promise<SnapshotResult>;\n\n tapElement(query: ElementQuery): Promise<TapResult>;\n\n tapCoordinates(x: number, y: number): Promise<void>;\n\n typeText(text: string): Promise<void>;\n\n swipe(\n direction: 'up' | 'down' | 'left' | 'right',\n startX?: number,\n startY?: number,\n distance?: number,\n ): Promise<void>;\n\n waitForElement(\n query: ElementQuery,\n timeoutMs?: number,\n intervalMs?: number,\n ): Promise<UIElement>;\n\n getAppState(bundleId: string): Promise<AppStateResult>;\n\n screenshot(\n outputPath?: string,\n options?: { encode?: true },\n ): Promise<ScreenshotResult>;\n screenshot(\n outputPath: string | undefined,\n options: { encode: false },\n ): Promise<ScreenshotFileResult>;\n screenshot(\n outputPath?: string,\n options?: ScreenshotOptions,\n ): Promise<ScreenshotResult | ScreenshotFileResult>;\n\n openApp(bundleId: string): Promise<void>;\n\n closeApp(bundleId: string): Promise<void>;\n\n pressButton(button: DeviceButton): Promise<void>;\n\n dismissKeyboard(): Promise<void>;\n\n dismissAlert(accept: boolean): Promise<void>;\n\n getLogs(durationSeconds?: number, filter?: string): Promise<LogsResult>;\n\n longPress(query: ElementQuery, durationMs?: number): Promise<TapResult>;\n\n scrollToElement(\n query: ElementQuery,\n direction?: 'up' | 'down',\n maxAttempts?: number,\n ): Promise<UIElement>;\n\n getAlertText(): Promise<string>;\n\n getWindowSize(): Promise<WindowSize>;\n\n getContexts(): Promise<string[]>;\n\n setContext(context: string): Promise<void>;\n\n getClipboard(): Promise<string>;\n\n setClipboard(text: string): Promise<void>;\n\n startScreenRecording(outputPath?: string): Promise<void>;\n\n stopScreenRecording(): Promise<string>;\n\n getElementText(query: ElementQuery): Promise<string>;\n};\n"]}
@@ -38,10 +38,22 @@ export type AppStateResult = {
38
38
  pid?: number;
39
39
  };
40
40
  export type ScreenshotResult = {
41
+ /** Base64-encoded image data. */
41
42
  data: string;
42
43
  format: 'png' | 'jpeg';
44
+ /** File path the screenshot was written to, when captured to disk. */
43
45
  path?: string;
44
46
  };
47
+ /** Result of a screenshot captured with `encode: false`: file `path` only, no base64 `data`. */
48
+ export type ScreenshotFileResult = {
49
+ data?: undefined;
50
+ format: 'png' | 'jpeg';
51
+ path: string;
52
+ };
53
+ export type ScreenshotOptions = {
54
+ /** Include base64 image data in the result. Defaults to `true`. */
55
+ encode?: boolean;
56
+ };
45
57
  export type LogEntry = {
46
58
  timestamp: string;
47
59
  level: string;
@@ -72,7 +84,13 @@ export type DeviceBackend = {
72
84
  swipe(direction: 'up' | 'down' | 'left' | 'right', startX?: number, startY?: number, distance?: number): Promise<void>;
73
85
  waitForElement(query: ElementQuery, timeoutMs?: number, intervalMs?: number): Promise<UIElement>;
74
86
  getAppState(bundleId: string): Promise<AppStateResult>;
75
- screenshot(outputPath?: string): Promise<ScreenshotResult>;
87
+ screenshot(outputPath?: string, options?: {
88
+ encode?: true;
89
+ }): Promise<ScreenshotResult>;
90
+ screenshot(outputPath: string | undefined, options: {
91
+ encode: false;
92
+ }): Promise<ScreenshotFileResult>;
93
+ screenshot(outputPath?: string, options?: ScreenshotOptions): Promise<ScreenshotResult | ScreenshotFileResult>;
76
94
  openApp(bundleId: string): Promise<void>;
77
95
  closeApp(bundleId: string): Promise<void>;
78
96
  pressButton(button: DeviceButton): Promise<void>;
@@ -89,5 +107,6 @@ export type DeviceBackend = {
89
107
  setClipboard(text: string): Promise<void>;
90
108
  startScreenRecording(outputPath?: string): Promise<void>;
91
109
  stopScreenRecording(): Promise<string>;
110
+ getElementText(query: ElementQuery): Promise<string>;
92
111
  };
93
112
  //# sourceMappingURL=types.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.cts","sourceRoot":"","sources":["../../src/backends/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.cts","sourceRoot":"","sources":["../../src/backends/types.ts"],"names":[],"mappings":"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"}
@@ -38,10 +38,22 @@ export type AppStateResult = {
38
38
  pid?: number;
39
39
  };
40
40
  export type ScreenshotResult = {
41
+ /** Base64-encoded image data. */
41
42
  data: string;
42
43
  format: 'png' | 'jpeg';
44
+ /** File path the screenshot was written to, when captured to disk. */
43
45
  path?: string;
44
46
  };
47
+ /** Result of a screenshot captured with `encode: false`: file `path` only, no base64 `data`. */
48
+ export type ScreenshotFileResult = {
49
+ data?: undefined;
50
+ format: 'png' | 'jpeg';
51
+ path: string;
52
+ };
53
+ export type ScreenshotOptions = {
54
+ /** Include base64 image data in the result. Defaults to `true`. */
55
+ encode?: boolean;
56
+ };
45
57
  export type LogEntry = {
46
58
  timestamp: string;
47
59
  level: string;
@@ -72,7 +84,13 @@ export type DeviceBackend = {
72
84
  swipe(direction: 'up' | 'down' | 'left' | 'right', startX?: number, startY?: number, distance?: number): Promise<void>;
73
85
  waitForElement(query: ElementQuery, timeoutMs?: number, intervalMs?: number): Promise<UIElement>;
74
86
  getAppState(bundleId: string): Promise<AppStateResult>;
75
- screenshot(outputPath?: string): Promise<ScreenshotResult>;
87
+ screenshot(outputPath?: string, options?: {
88
+ encode?: true;
89
+ }): Promise<ScreenshotResult>;
90
+ screenshot(outputPath: string | undefined, options: {
91
+ encode: false;
92
+ }): Promise<ScreenshotFileResult>;
93
+ screenshot(outputPath?: string, options?: ScreenshotOptions): Promise<ScreenshotResult | ScreenshotFileResult>;
76
94
  openApp(bundleId: string): Promise<void>;
77
95
  closeApp(bundleId: string): Promise<void>;
78
96
  pressButton(button: DeviceButton): Promise<void>;
@@ -89,5 +107,6 @@ export type DeviceBackend = {
89
107
  setClipboard(text: string): Promise<void>;
90
108
  startScreenRecording(outputPath?: string): Promise<void>;
91
109
  stopScreenRecording(): Promise<string>;
110
+ getElementText(query: ElementQuery): Promise<string>;
92
111
  };
93
112
  //# sourceMappingURL=types.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.mts","sourceRoot":"","sources":["../../src/backends/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.mts","sourceRoot":"","sources":["../../src/backends/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC;AAEzC,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/D,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,SAAS,EAAE,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,EAAE,QAAQ,CAAC;IACnB,SAAS,EAAE,SAAS,EAAE,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,iBAAiB,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC;IACvB,sEAAsE;IACtE,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,gGAAgG;AAChG,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,mEAAmE;IACnE,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAE9D,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAE5B,aAAa,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC;IAErC,QAAQ,IAAI,OAAO,CAAC,cAAc,CAAC,CAAC;IAEpC,UAAU,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAEpD,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEpD,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtC,KAAK,CACH,SAAS,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,EAC3C,MAAM,CAAC,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjB,cAAc,CACZ,KAAK,EAAE,YAAY,EACnB,SAAS,CAAC,EAAE,MAAM,EAClB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,SAAS,CAAC,CAAC;IAEtB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAEvD,UAAU,CACR,UAAU,CAAC,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,IAAI,CAAA;KAAE,GAC1B,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC7B,UAAU,CACR,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,OAAO,EAAE;QAAE,MAAM,EAAE,KAAK,CAAA;KAAE,GACzB,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACjC,UAAU,CACR,UAAU,CAAC,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,gBAAgB,GAAG,oBAAoB,CAAC,CAAC;IAEpD,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1C,WAAW,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjD,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjC,YAAY,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7C,OAAO,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAExE,SAAS,CAAC,KAAK,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAExE,eAAe,CACb,KAAK,EAAE,YAAY,EACnB,SAAS,CAAC,EAAE,IAAI,GAAG,MAAM,EACzB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,SAAS,CAAC,CAAC;IAEtB,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAEhC,aAAa,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC;IAErC,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAEjC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE3C,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAEhC,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1C,oBAAoB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzD,mBAAmB,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAEvC,cAAc,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACtD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.mjs","sourceRoot":"","sources":["../../src/backends/types.ts"],"names":[],"mappings":"","sourcesContent":["export type Platform = 'ios' | 'android';\n\nexport type DeviceInfo = {\n platform: Platform;\n deviceId: string;\n name: string;\n osVersion: string;\n state: string;\n};\n\nexport type UIElement = {\n type: string;\n label?: string;\n value?: string;\n identifier?: string;\n frame: { x: number; y: number; width: number; height: number };\n enabled: boolean;\n children?: UIElement[];\n};\n\nexport type SnapshotResult = {\n platform: Platform;\n hierarchy: UIElement[];\n raw: string;\n timestamp: number;\n};\n\nexport type TapResult = {\n success: boolean;\n x: number;\n y: number;\n targetDescription: string;\n};\n\nexport type AppStateResult = {\n bundleId: string;\n state: string;\n pid?: number;\n};\n\nexport type ScreenshotResult = {\n data: string;\n format: 'png' | 'jpeg';\n path?: string;\n};\n\nexport type LogEntry = {\n timestamp: string;\n level: string;\n message: string;\n};\n\nexport type LogsResult = {\n entries: LogEntry[];\n source: string;\n};\n\nexport type ElementQuery = {\n label?: string;\n identifier?: string;\n text?: string;\n type?: string;\n};\n\nexport type DeviceButton = 'home' | 'back' | 'enter' | 'lock';\n\nexport type WindowSize = {\n width: number;\n height: number;\n};\n\nexport type DeviceBackend = {\n readonly platform: Platform;\n\n getDeviceInfo(): Promise<DeviceInfo>;\n\n snapshot(): Promise<SnapshotResult>;\n\n tapElement(query: ElementQuery): Promise<TapResult>;\n\n tapCoordinates(x: number, y: number): Promise<void>;\n\n typeText(text: string): Promise<void>;\n\n swipe(\n direction: 'up' | 'down' | 'left' | 'right',\n startX?: number,\n startY?: number,\n distance?: number,\n ): Promise<void>;\n\n waitForElement(\n query: ElementQuery,\n timeoutMs?: number,\n intervalMs?: number,\n ): Promise<UIElement>;\n\n getAppState(bundleId: string): Promise<AppStateResult>;\n\n screenshot(outputPath?: string): Promise<ScreenshotResult>;\n\n openApp(bundleId: string): Promise<void>;\n\n closeApp(bundleId: string): Promise<void>;\n\n pressButton(button: DeviceButton): Promise<void>;\n\n dismissKeyboard(): Promise<void>;\n\n dismissAlert(accept: boolean): Promise<void>;\n\n getLogs(durationSeconds?: number, filter?: string): Promise<LogsResult>;\n\n longPress(query: ElementQuery, durationMs?: number): Promise<TapResult>;\n\n scrollToElement(\n query: ElementQuery,\n direction?: 'up' | 'down',\n maxAttempts?: number,\n ): Promise<UIElement>;\n\n getAlertText(): Promise<string>;\n\n getWindowSize(): Promise<WindowSize>;\n\n getContexts(): Promise<string[]>;\n\n setContext(context: string): Promise<void>;\n\n getClipboard(): Promise<string>;\n\n setClipboard(text: string): Promise<void>;\n\n startScreenRecording(outputPath?: string): Promise<void>;\n\n stopScreenRecording(): Promise<string>;\n};\n"]}
1
+ {"version":3,"file":"types.mjs","sourceRoot":"","sources":["../../src/backends/types.ts"],"names":[],"mappings":"","sourcesContent":["export type Platform = 'ios' | 'android';\n\nexport type DeviceInfo = {\n platform: Platform;\n deviceId: string;\n name: string;\n osVersion: string;\n state: string;\n};\n\nexport type UIElement = {\n type: string;\n label?: string;\n value?: string;\n identifier?: string;\n frame: { x: number; y: number; width: number; height: number };\n enabled: boolean;\n children?: UIElement[];\n};\n\nexport type SnapshotResult = {\n platform: Platform;\n hierarchy: UIElement[];\n raw: string;\n timestamp: number;\n};\n\nexport type TapResult = {\n success: boolean;\n x: number;\n y: number;\n targetDescription: string;\n};\n\nexport type AppStateResult = {\n bundleId: string;\n state: string;\n pid?: number;\n};\n\nexport type ScreenshotResult = {\n /** Base64-encoded image data. */\n data: string;\n format: 'png' | 'jpeg';\n /** File path the screenshot was written to, when captured to disk. */\n path?: string;\n};\n\n/** Result of a screenshot captured with `encode: false`: file `path` only, no base64 `data`. */\nexport type ScreenshotFileResult = {\n data?: undefined;\n format: 'png' | 'jpeg';\n path: string;\n};\n\nexport type ScreenshotOptions = {\n /** Include base64 image data in the result. Defaults to `true`. */\n encode?: boolean;\n};\n\nexport type LogEntry = {\n timestamp: string;\n level: string;\n message: string;\n};\n\nexport type LogsResult = {\n entries: LogEntry[];\n source: string;\n};\n\nexport type ElementQuery = {\n label?: string;\n identifier?: string;\n text?: string;\n type?: string;\n};\n\nexport type DeviceButton = 'home' | 'back' | 'enter' | 'lock';\n\nexport type WindowSize = {\n width: number;\n height: number;\n};\n\nexport type DeviceBackend = {\n readonly platform: Platform;\n\n getDeviceInfo(): Promise<DeviceInfo>;\n\n snapshot(): Promise<SnapshotResult>;\n\n tapElement(query: ElementQuery): Promise<TapResult>;\n\n tapCoordinates(x: number, y: number): Promise<void>;\n\n typeText(text: string): Promise<void>;\n\n swipe(\n direction: 'up' | 'down' | 'left' | 'right',\n startX?: number,\n startY?: number,\n distance?: number,\n ): Promise<void>;\n\n waitForElement(\n query: ElementQuery,\n timeoutMs?: number,\n intervalMs?: number,\n ): Promise<UIElement>;\n\n getAppState(bundleId: string): Promise<AppStateResult>;\n\n screenshot(\n outputPath?: string,\n options?: { encode?: true },\n ): Promise<ScreenshotResult>;\n screenshot(\n outputPath: string | undefined,\n options: { encode: false },\n ): Promise<ScreenshotFileResult>;\n screenshot(\n outputPath?: string,\n options?: ScreenshotOptions,\n ): Promise<ScreenshotResult | ScreenshotFileResult>;\n\n openApp(bundleId: string): Promise<void>;\n\n closeApp(bundleId: string): Promise<void>;\n\n pressButton(button: DeviceButton): Promise<void>;\n\n dismissKeyboard(): Promise<void>;\n\n dismissAlert(accept: boolean): Promise<void>;\n\n getLogs(durationSeconds?: number, filter?: string): Promise<LogsResult>;\n\n longPress(query: ElementQuery, durationMs?: number): Promise<TapResult>;\n\n scrollToElement(\n query: ElementQuery,\n direction?: 'up' | 'down',\n maxAttempts?: number,\n ): Promise<UIElement>;\n\n getAlertText(): Promise<string>;\n\n getWindowSize(): Promise<WindowSize>;\n\n getContexts(): Promise<string[]>;\n\n setContext(context: string): Promise<void>;\n\n getClipboard(): Promise<string>;\n\n setClipboard(text: string): Promise<void>;\n\n startScreenRecording(outputPath?: string): Promise<void>;\n\n stopScreenRecording(): Promise<string>;\n\n getElementText(query: ElementQuery): Promise<string>;\n};\n"]}
@@ -6,8 +6,17 @@ const index_js_1 = require("../backends/index.cjs");
6
6
  const server_js_1 = require("../server.cjs");
7
7
  async function main() {
8
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);
9
+ const devicePlatform = process.env.DEVICE_PLATFORM;
10
+ const parts = [];
11
+ if (deviceId) {
12
+ parts.push(`DEVICE_ID=${deviceId}`);
13
+ }
14
+ if (devicePlatform) {
15
+ parts.push(`DEVICE_PLATFORM=${devicePlatform}`);
16
+ }
17
+ const suffix = parts.length > 0 ? ` (${parts.join(', ')})` : ' (auto-detect)';
18
+ console.error(`@metamask/device-mcp starting...${suffix}`);
19
+ const backend = (0, index_js_1.createLazyBackend)(deviceId, devicePlatform);
11
20
  const server = (0, server_js_1.createMcpServer)(backend);
12
21
  const transport = new stdio_js_1.StdioServerTransport();
13
22
  await server.connect(transport);
@@ -1 +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"]}
1
+ {"version":3,"file":"device-mcp.cjs","sourceRoot":"","sources":["../../src/cli/device-mcp.ts"],"names":[],"mappings":";;;AACA,wEAAiF;AAEjF,oDAAyD;AAEzD,6CAA+C;AAE/C,KAAK,UAAU,IAAI;IACjB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;IACvC,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,eAAuC,CAAC;IAE3E,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,QAAQ,EAAE,CAAC;QACb,KAAK,CAAC,IAAI,CAAC,aAAa,QAAQ,EAAE,CAAC,CAAC;IACtC,CAAC;IACD,IAAI,cAAc,EAAE,CAAC;QACnB,KAAK,CAAC,IAAI,CAAC,mBAAmB,cAAc,EAAE,CAAC,CAAC;IAClD,CAAC;IACD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,gBAAgB,CAAC;IAC9E,OAAO,CAAC,KAAK,CAAC,mCAAmC,MAAM,EAAE,CAAC,CAAC;IAE3D,MAAM,OAAO,GAAG,IAAA,4BAAiB,EAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;IAC5D,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 type { Platform } from '../backends/types.js';\nimport { createMcpServer } from '../server.js';\n\nasync function main(): Promise<void> {\n const deviceId = process.env.DEVICE_ID;\n const devicePlatform = process.env.DEVICE_PLATFORM as Platform | undefined;\n\n const parts: string[] = [];\n if (deviceId) {\n parts.push(`DEVICE_ID=${deviceId}`);\n }\n if (devicePlatform) {\n parts.push(`DEVICE_PLATFORM=${devicePlatform}`);\n }\n const suffix = parts.length > 0 ? ` (${parts.join(', ')})` : ' (auto-detect)';\n console.error(`@metamask/device-mcp starting...${suffix}`);\n\n const backend = createLazyBackend(deviceId, devicePlatform);\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"]}
@@ -4,8 +4,17 @@ import { createLazyBackend } from "../backends/index.mjs";
4
4
  import { createMcpServer } from "../server.mjs";
5
5
  async function main() {
6
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);
7
+ const devicePlatform = process.env.DEVICE_PLATFORM;
8
+ const parts = [];
9
+ if (deviceId) {
10
+ parts.push(`DEVICE_ID=${deviceId}`);
11
+ }
12
+ if (devicePlatform) {
13
+ parts.push(`DEVICE_PLATFORM=${devicePlatform}`);
14
+ }
15
+ const suffix = parts.length > 0 ? ` (${parts.join(', ')})` : ' (auto-detect)';
16
+ console.error(`@metamask/device-mcp starting...${suffix}`);
17
+ const backend = createLazyBackend(deviceId, devicePlatform);
9
18
  const server = createMcpServer(backend);
10
19
  const transport = new StdioServerTransport();
11
20
  await server.connect(transport);
@@ -1 +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"]}
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;AAEzD,OAAO,EAAE,eAAe,EAAE,sBAAqB;AAE/C,KAAK,UAAU,IAAI;IACjB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;IACvC,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,eAAuC,CAAC;IAE3E,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,QAAQ,EAAE,CAAC;QACb,KAAK,CAAC,IAAI,CAAC,aAAa,QAAQ,EAAE,CAAC,CAAC;IACtC,CAAC;IACD,IAAI,cAAc,EAAE,CAAC;QACnB,KAAK,CAAC,IAAI,CAAC,mBAAmB,cAAc,EAAE,CAAC,CAAC;IAClD,CAAC;IACD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,gBAAgB,CAAC;IAC9E,OAAO,CAAC,KAAK,CAAC,mCAAmC,MAAM,EAAE,CAAC,CAAC;IAE3D,MAAM,OAAO,GAAG,iBAAiB,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;IAC5D,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 type { Platform } from '../backends/types.js';\nimport { createMcpServer } from '../server.js';\n\nasync function main(): Promise<void> {\n const deviceId = process.env.DEVICE_ID;\n const devicePlatform = process.env.DEVICE_PLATFORM as Platform | undefined;\n\n const parts: string[] = [];\n if (deviceId) {\n parts.push(`DEVICE_ID=${deviceId}`);\n }\n if (devicePlatform) {\n parts.push(`DEVICE_PLATFORM=${devicePlatform}`);\n }\n const suffix = parts.length > 0 ? ` (${parts.join(', ')})` : ' (auto-detect)';\n console.error(`@metamask/device-mcp starting...${suffix}`);\n\n const backend = createLazyBackend(deviceId, devicePlatform);\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"]}