react-native-mcp-kit 4.2.0 → 4.2.1

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 (239) hide show
  1. package/dist/babel/testIdPlugin/collectHooks.d.ts +13 -0
  2. package/dist/babel/testIdPlugin/collectHooks.d.ts.map +1 -0
  3. package/dist/babel/testIdPlugin/collectHooks.js +112 -0
  4. package/dist/babel/testIdPlugin/collectHooks.js.map +1 -0
  5. package/dist/babel/testIdPlugin/constants.d.ts +6 -0
  6. package/dist/babel/testIdPlugin/constants.d.ts.map +1 -0
  7. package/dist/babel/testIdPlugin/constants.js +49 -0
  8. package/dist/babel/testIdPlugin/constants.js.map +1 -0
  9. package/dist/babel/testIdPlugin/helpers.d.ts +7 -0
  10. package/dist/babel/testIdPlugin/helpers.d.ts.map +1 -0
  11. package/dist/babel/testIdPlugin/helpers.js +77 -0
  12. package/dist/babel/testIdPlugin/helpers.js.map +1 -0
  13. package/dist/babel/testIdPlugin/hocUnwrap.d.ts +4 -0
  14. package/dist/babel/testIdPlugin/hocUnwrap.d.ts.map +1 -0
  15. package/dist/babel/testIdPlugin/hocUnwrap.js +94 -0
  16. package/dist/babel/testIdPlugin/hocUnwrap.js.map +1 -0
  17. package/dist/babel/{testIdPlugin.d.ts → testIdPlugin/index.d.ts} +1 -1
  18. package/dist/babel/testIdPlugin/index.d.ts.map +1 -0
  19. package/dist/babel/testIdPlugin/index.js +205 -0
  20. package/dist/babel/testIdPlugin/index.js.map +1 -0
  21. package/dist/babel/testIdPlugin/inject.d.ts +7 -0
  22. package/dist/babel/testIdPlugin/inject.d.ts.map +1 -0
  23. package/dist/babel/testIdPlugin/inject.js +86 -0
  24. package/dist/babel/testIdPlugin/inject.js.map +1 -0
  25. package/dist/babel/testIdPlugin/types.d.ts +59 -0
  26. package/dist/babel/testIdPlugin/types.d.ts.map +1 -0
  27. package/dist/babel/testIdPlugin/types.js +3 -0
  28. package/dist/babel/testIdPlugin/types.js.map +1 -0
  29. package/dist/bin/ios-hid +0 -0
  30. package/dist/index.d.ts +1 -1
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js +2 -1
  33. package/dist/index.js.map +1 -1
  34. package/dist/modules/fiberTree/hooks/extract.d.ts +6 -0
  35. package/dist/modules/fiberTree/hooks/extract.d.ts.map +1 -0
  36. package/dist/modules/fiberTree/hooks/extract.js +187 -0
  37. package/dist/modules/fiberTree/hooks/extract.js.map +1 -0
  38. package/dist/modules/fiberTree/hooks/flatten.d.ts +4 -0
  39. package/dist/modules/fiberTree/hooks/flatten.d.ts.map +1 -0
  40. package/dist/modules/fiberTree/hooks/flatten.js +81 -0
  41. package/dist/modules/fiberTree/hooks/flatten.js.map +1 -0
  42. package/dist/modules/fiberTree/hooks/index.d.ts +5 -0
  43. package/dist/modules/fiberTree/hooks/index.d.ts.map +1 -0
  44. package/dist/modules/fiberTree/hooks/index.js +10 -0
  45. package/dist/modules/fiberTree/hooks/index.js.map +1 -0
  46. package/dist/modules/fiberTree/hooks/options.d.ts +9 -0
  47. package/dist/modules/fiberTree/hooks/options.d.ts.map +1 -0
  48. package/dist/modules/fiberTree/hooks/options.js +27 -0
  49. package/dist/modules/fiberTree/hooks/options.js.map +1 -0
  50. package/dist/modules/fiberTree/hooks/patterns.d.ts +2 -0
  51. package/dist/modules/fiberTree/hooks/patterns.d.ts.map +1 -0
  52. package/dist/modules/fiberTree/hooks/patterns.js +26 -0
  53. package/dist/modules/fiberTree/hooks/patterns.js.map +1 -0
  54. package/dist/modules/fiberTree/hooks/shape.d.ts +3 -0
  55. package/dist/modules/fiberTree/hooks/shape.d.ts.map +1 -0
  56. package/dist/modules/fiberTree/hooks/shape.js +66 -0
  57. package/dist/modules/fiberTree/hooks/shape.js.map +1 -0
  58. package/dist/modules/fiberTree/hooks/slotCount.d.ts +2 -0
  59. package/dist/modules/fiberTree/hooks/slotCount.d.ts.map +1 -0
  60. package/dist/modules/fiberTree/hooks/slotCount.js +93 -0
  61. package/dist/modules/fiberTree/hooks/slotCount.js.map +1 -0
  62. package/dist/modules/fiberTree/{hooks.d.ts → hooks/types.d.ts} +1 -34
  63. package/dist/modules/fiberTree/hooks/types.d.ts.map +1 -0
  64. package/dist/modules/fiberTree/hooks/types.js +3 -0
  65. package/dist/modules/fiberTree/hooks/types.js.map +1 -0
  66. package/dist/modules/fiberTree/hooks/value.d.ts +2 -0
  67. package/dist/modules/fiberTree/hooks/value.d.ts.map +1 -0
  68. package/dist/modules/fiberTree/hooks/value.js +89 -0
  69. package/dist/modules/fiberTree/hooks/value.js.map +1 -0
  70. package/dist/modules/fiberTree/utils/constants.d.ts +8 -0
  71. package/dist/modules/fiberTree/utils/constants.d.ts.map +1 -0
  72. package/dist/modules/fiberTree/utils/constants.js +15 -0
  73. package/dist/modules/fiberTree/utils/constants.js.map +1 -0
  74. package/dist/modules/fiberTree/utils/index.d.ts +9 -0
  75. package/dist/modules/fiberTree/utils/index.d.ts.map +1 -0
  76. package/dist/modules/fiberTree/utils/index.js +34 -0
  77. package/dist/modules/fiberTree/utils/index.js.map +1 -0
  78. package/dist/modules/fiberTree/utils/match.d.ts +4 -0
  79. package/dist/modules/fiberTree/utils/match.d.ts.map +1 -0
  80. package/dist/modules/fiberTree/utils/match.js +169 -0
  81. package/dist/modules/fiberTree/utils/match.js.map +1 -0
  82. package/dist/modules/fiberTree/utils/naming.d.ts +4 -0
  83. package/dist/modules/fiberTree/utils/naming.d.ts.map +1 -0
  84. package/dist/modules/fiberTree/utils/naming.js +52 -0
  85. package/dist/modules/fiberTree/utils/naming.js.map +1 -0
  86. package/dist/modules/fiberTree/utils/native.d.ts +5 -0
  87. package/dist/modules/fiberTree/utils/native.d.ts.map +1 -0
  88. package/dist/modules/fiberTree/utils/native.js +101 -0
  89. package/dist/modules/fiberTree/utils/native.js.map +1 -0
  90. package/dist/modules/fiberTree/utils/projection.d.ts +9 -0
  91. package/dist/modules/fiberTree/utils/projection.d.ts.map +1 -0
  92. package/dist/modules/fiberTree/utils/projection.js +75 -0
  93. package/dist/modules/fiberTree/utils/projection.js.map +1 -0
  94. package/dist/modules/fiberTree/utils/root.d.ts +4 -0
  95. package/dist/modules/fiberTree/utils/root.d.ts.map +1 -0
  96. package/dist/modules/fiberTree/utils/root.js +30 -0
  97. package/dist/modules/fiberTree/utils/root.js.map +1 -0
  98. package/dist/modules/fiberTree/utils/screen.d.ts +10 -0
  99. package/dist/modules/fiberTree/utils/screen.d.ts.map +1 -0
  100. package/dist/modules/fiberTree/utils/screen.js +39 -0
  101. package/dist/modules/fiberTree/utils/screen.js.map +1 -0
  102. package/dist/modules/fiberTree/utils/serialize.d.ts +4 -0
  103. package/dist/modules/fiberTree/utils/serialize.d.ts.map +1 -0
  104. package/dist/modules/fiberTree/utils/serialize.js +102 -0
  105. package/dist/modules/fiberTree/utils/serialize.js.map +1 -0
  106. package/dist/modules/fiberTree/utils/traverse.d.ts +12 -0
  107. package/dist/modules/fiberTree/utils/traverse.d.ts.map +1 -0
  108. package/dist/modules/fiberTree/utils/traverse.js +107 -0
  109. package/dist/modules/fiberTree/utils/traverse.js.map +1 -0
  110. package/dist/server/dispatch.d.ts +15 -0
  111. package/dist/server/dispatch.d.ts.map +1 -0
  112. package/dist/server/dispatch.js +121 -0
  113. package/dist/server/dispatch.js.map +1 -0
  114. package/dist/server/helpers.d.ts +97 -0
  115. package/dist/server/helpers.d.ts.map +1 -0
  116. package/dist/server/helpers.js +162 -0
  117. package/dist/server/helpers.js.map +1 -0
  118. package/dist/server/host/deviceResolver/byClient.d.ts +5 -0
  119. package/dist/server/host/deviceResolver/byClient.d.ts.map +1 -0
  120. package/dist/server/host/deviceResolver/byClient.js +171 -0
  121. package/dist/server/host/deviceResolver/byClient.js.map +1 -0
  122. package/dist/server/host/deviceResolver/byId.d.ts +5 -0
  123. package/dist/server/host/deviceResolver/byId.d.ts.map +1 -0
  124. package/dist/server/host/deviceResolver/byId.js +81 -0
  125. package/dist/server/host/deviceResolver/byId.js.map +1 -0
  126. package/dist/server/host/deviceResolver/enrich.d.ts +5 -0
  127. package/dist/server/host/deviceResolver/enrich.d.ts.map +1 -0
  128. package/dist/server/host/deviceResolver/enrich.js +123 -0
  129. package/dist/server/host/deviceResolver/enrich.js.map +1 -0
  130. package/dist/server/host/deviceResolver/index.d.ts +13 -0
  131. package/dist/server/host/deviceResolver/index.d.ts.map +1 -0
  132. package/dist/server/host/deviceResolver/index.js +65 -0
  133. package/dist/server/host/deviceResolver/index.js.map +1 -0
  134. package/dist/server/host/deviceResolver/list.d.ts +10 -0
  135. package/dist/server/host/deviceResolver/list.d.ts.map +1 -0
  136. package/dist/server/host/deviceResolver/list.js +119 -0
  137. package/dist/server/host/deviceResolver/list.js.map +1 -0
  138. package/dist/server/host/deviceResolver/scan.d.ts +4 -0
  139. package/dist/server/host/deviceResolver/scan.d.ts.map +1 -0
  140. package/dist/server/host/deviceResolver/scan.js +102 -0
  141. package/dist/server/host/deviceResolver/scan.js.map +1 -0
  142. package/dist/server/host/{deviceResolver.d.ts → deviceResolver/types.d.ts} +1 -16
  143. package/dist/server/host/deviceResolver/types.d.ts.map +1 -0
  144. package/dist/server/host/deviceResolver/types.js +3 -0
  145. package/dist/server/host/deviceResolver/types.js.map +1 -0
  146. package/dist/server/host/tools/input/android.d.ts +15 -0
  147. package/dist/server/host/tools/input/android.d.ts.map +1 -0
  148. package/dist/server/host/tools/input/android.js +88 -0
  149. package/dist/server/host/tools/input/android.js.map +1 -0
  150. package/dist/server/host/tools/input/constants.d.ts +14 -0
  151. package/dist/server/host/tools/input/constants.d.ts.map +1 -0
  152. package/dist/server/host/tools/input/constants.js +41 -0
  153. package/dist/server/host/tools/input/constants.js.map +1 -0
  154. package/dist/server/host/tools/input/drag.d.ts +4 -0
  155. package/dist/server/host/tools/input/drag.d.ts.map +1 -0
  156. package/dist/server/host/tools/input/drag.js +76 -0
  157. package/dist/server/host/tools/input/drag.js.map +1 -0
  158. package/dist/server/host/tools/input/index.d.ts +8 -0
  159. package/dist/server/host/tools/input/index.d.ts.map +1 -0
  160. package/dist/server/host/tools/input/index.js +18 -0
  161. package/dist/server/host/tools/input/index.js.map +1 -0
  162. package/dist/server/host/tools/input/longPress.d.ts +4 -0
  163. package/dist/server/host/tools/input/longPress.d.ts.map +1 -0
  164. package/dist/server/host/tools/input/longPress.js +49 -0
  165. package/dist/server/host/tools/input/longPress.js.map +1 -0
  166. package/dist/server/host/tools/input/pressKey.d.ts +4 -0
  167. package/dist/server/host/tools/input/pressKey.d.ts.map +1 -0
  168. package/dist/server/host/tools/input/pressKey.js +42 -0
  169. package/dist/server/host/tools/input/pressKey.js.map +1 -0
  170. package/dist/server/host/tools/input/swipe.d.ts +4 -0
  171. package/dist/server/host/tools/input/swipe.d.ts.map +1 -0
  172. package/dist/server/host/tools/input/swipe.js +71 -0
  173. package/dist/server/host/tools/input/swipe.js.map +1 -0
  174. package/dist/server/host/tools/input/tap.d.ts +4 -0
  175. package/dist/server/host/tools/input/tap.d.ts.map +1 -0
  176. package/dist/server/host/tools/input/tap.js +49 -0
  177. package/dist/server/host/tools/input/tap.js.map +1 -0
  178. package/dist/server/host/tools/input/typeText.d.ts +4 -0
  179. package/dist/server/host/tools/input/typeText.d.ts.map +1 -0
  180. package/dist/server/host/tools/input/typeText.js +52 -0
  181. package/dist/server/host/tools/input/typeText.js.map +1 -0
  182. package/dist/server/host/tools/input/typeTextBatch.d.ts +4 -0
  183. package/dist/server/host/tools/input/typeTextBatch.d.ts.map +1 -0
  184. package/dist/server/host/tools/input/typeTextBatch.js +106 -0
  185. package/dist/server/host/tools/input/typeTextBatch.js.map +1 -0
  186. package/dist/server/instructions.d.ts +2 -0
  187. package/dist/server/instructions.d.ts.map +1 -0
  188. package/dist/server/instructions.js +74 -0
  189. package/dist/server/instructions.js.map +1 -0
  190. package/dist/server/mcpServer.d.ts +0 -12
  191. package/dist/server/mcpServer.d.ts.map +1 -1
  192. package/dist/server/mcpServer.js +26 -877
  193. package/dist/server/mcpServer.js.map +1 -1
  194. package/dist/server/predicate.d.ts +31 -0
  195. package/dist/server/predicate.d.ts.map +1 -0
  196. package/dist/server/predicate.js +104 -0
  197. package/dist/server/predicate.js.map +1 -0
  198. package/dist/server/tools/assert.d.ts +4 -0
  199. package/dist/server/tools/assert.d.ts.map +1 -0
  200. package/dist/server/tools/assert.js +79 -0
  201. package/dist/server/tools/assert.js.map +1 -0
  202. package/dist/server/tools/call.d.ts +4 -0
  203. package/dist/server/tools/call.d.ts.map +1 -0
  204. package/dist/server/tools/call.js +38 -0
  205. package/dist/server/tools/call.js.map +1 -0
  206. package/dist/server/tools/connectionStatus.d.ts +4 -0
  207. package/dist/server/tools/connectionStatus.d.ts.map +1 -0
  208. package/dist/server/tools/connectionStatus.js +41 -0
  209. package/dist/server/tools/connectionStatus.js.map +1 -0
  210. package/dist/server/tools/describeTool.d.ts +4 -0
  211. package/dist/server/tools/describeTool.d.ts.map +1 -0
  212. package/dist/server/tools/describeTool.js +130 -0
  213. package/dist/server/tools/describeTool.js.map +1 -0
  214. package/dist/server/tools/listTools.d.ts +4 -0
  215. package/dist/server/tools/listTools.d.ts.map +1 -0
  216. package/dist/server/tools/listTools.js +109 -0
  217. package/dist/server/tools/listTools.js.map +1 -0
  218. package/dist/server/tools/waitUntil.d.ts +4 -0
  219. package/dist/server/tools/waitUntil.d.ts.map +1 -0
  220. package/dist/server/tools/waitUntil.js +119 -0
  221. package/dist/server/tools/waitUntil.js.map +1 -0
  222. package/package.json +2 -2
  223. package/dist/babel/testIdPlugin.d.ts.map +0 -1
  224. package/dist/babel/testIdPlugin.js +0 -585
  225. package/dist/babel/testIdPlugin.js.map +0 -1
  226. package/dist/modules/fiberTree/hooks.d.ts.map +0 -1
  227. package/dist/modules/fiberTree/hooks.js +0 -550
  228. package/dist/modules/fiberTree/hooks.js.map +0 -1
  229. package/dist/modules/fiberTree/utils.d.ts +0 -39
  230. package/dist/modules/fiberTree/utils.d.ts.map +0 -1
  231. package/dist/modules/fiberTree/utils.js +0 -641
  232. package/dist/modules/fiberTree/utils.js.map +0 -1
  233. package/dist/server/host/deviceResolver.d.ts.map +0 -1
  234. package/dist/server/host/deviceResolver.js +0 -621
  235. package/dist/server/host/deviceResolver.js.map +0 -1
  236. package/dist/server/host/tools/input.d.ts +0 -10
  237. package/dist/server/host/tools/input.d.ts.map +0 -1
  238. package/dist/server/host/tools/input.js +0 -503
  239. package/dist/server/host/tools/input.js.map +0 -1
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.listAndroidDevices = exports.listIosRealDevices = exports.listIosSimulators = exports.toDeviceError = exports.ADB_MISSING_ERROR = exports.XCRUN_MISSING_ERROR = exports.clearDeviceCache = void 0;
4
+ const node_crypto_1 = require("node:crypto");
5
+ const node_fs_1 = require("node:fs");
6
+ const promises_1 = require("node:fs/promises");
7
+ const node_os_1 = require("node:os");
8
+ const node_path_1 = require("node:path");
9
+ const processRunner_1 = require("../../../server/host/processRunner");
10
+ const CACHE_TTL_MS = 5_000;
11
+ const LIST_TIMEOUT_MS = 5_000;
12
+ let iosCache = null;
13
+ let iosRealCache = null;
14
+ let androidCache = null;
15
+ const clearDeviceCache = () => {
16
+ iosCache = null;
17
+ iosRealCache = null;
18
+ androidCache = null;
19
+ };
20
+ exports.clearDeviceCache = clearDeviceCache;
21
+ exports.XCRUN_MISSING_ERROR = 'xcrun not found. iOS host tools require Xcode command line tools (macOS only).';
22
+ exports.ADB_MISSING_ERROR = 'adb not found. Android host tools require Android platform-tools on PATH.';
23
+ // Map a thrown error to a user-facing DeviceResolution error. Handles the
24
+ // common ProcessNotFoundError → "install the toolchain" message; everything
25
+ // else gets wrapped as a context-prefixed message.
26
+ const toDeviceError = (err, context, toolMissing) => {
27
+ if (err instanceof processRunner_1.ProcessNotFoundError) {
28
+ return { error: toolMissing, ok: false };
29
+ }
30
+ return { error: `${context}: ${err.message}`, ok: false };
31
+ };
32
+ exports.toDeviceError = toDeviceError;
33
+ const listIosSimulators = async (runner) => {
34
+ if (iosCache && Date.now() - iosCache.timestamp < CACHE_TTL_MS) {
35
+ return iosCache.result;
36
+ }
37
+ const proc = await runner('xcrun', ['simctl', 'list', 'devices', '--json'], {
38
+ timeoutMs: LIST_TIMEOUT_MS,
39
+ });
40
+ if (proc.exitCode !== 0) {
41
+ throw new Error(`xcrun simctl list failed (exit ${proc.exitCode}): ${proc.stderr.toString('utf8').trim().slice(0, 500)}`);
42
+ }
43
+ const parsed = JSON.parse(proc.stdout.toString('utf8'));
44
+ const out = [];
45
+ for (const runtime of Object.values(parsed.devices ?? {})) {
46
+ for (const d of runtime) {
47
+ if (typeof d.udid === 'string' && typeof d.name === 'string' && typeof d.state === 'string') {
48
+ out.push({ name: d.name, state: d.state, udid: d.udid });
49
+ }
50
+ }
51
+ }
52
+ iosCache = { result: out, timestamp: Date.now() };
53
+ return out;
54
+ };
55
+ exports.listIosSimulators = listIosSimulators;
56
+ // Paired physical iOS devices come from `xcrun devicectl` — simctl knows
57
+ // nothing about them. The JSON output of `list devices` is the only stable
58
+ // integration surface (its stdout has a human-readable header first).
59
+ const listIosRealDevices = async (runner) => {
60
+ if (iosRealCache && Date.now() - iosRealCache.timestamp < CACHE_TTL_MS) {
61
+ return iosRealCache.result;
62
+ }
63
+ const tmpPath = (0, node_path_1.join)((0, node_os_1.tmpdir)(), `rnmcp-devicectl-${(0, node_crypto_1.randomUUID)()}.json`);
64
+ try {
65
+ const proc = await runner('xcrun', ['devicectl', 'list', 'devices', '--json-output', tmpPath], {
66
+ timeoutMs: LIST_TIMEOUT_MS,
67
+ });
68
+ if (proc.exitCode !== 0) {
69
+ throw new Error(`xcrun devicectl list failed (exit ${proc.exitCode}): ${proc.stderr.toString('utf8').trim().slice(0, 500)}`);
70
+ }
71
+ const raw = (0, node_fs_1.readFileSync)(tmpPath, 'utf8');
72
+ const parsed = JSON.parse(raw);
73
+ const devices = parsed.result?.devices ?? [];
74
+ const out = [];
75
+ for (const d of devices) {
76
+ if (d.hardwareProperties?.platform !== 'iOS')
77
+ continue;
78
+ const id = d.identifier;
79
+ const name = d.deviceProperties?.name;
80
+ const pairingState = d.connectionProperties?.pairingState;
81
+ if (typeof id === 'string' && typeof name === 'string' && typeof pairingState === 'string') {
82
+ out.push({ coreDeviceIdentifier: id, name, pairingState });
83
+ }
84
+ }
85
+ iosRealCache = { result: out, timestamp: Date.now() };
86
+ return out;
87
+ }
88
+ finally {
89
+ (0, promises_1.rm)(tmpPath, { force: true }).catch(() => {
90
+ // best-effort
91
+ });
92
+ }
93
+ };
94
+ exports.listIosRealDevices = listIosRealDevices;
95
+ const listAndroidDevices = async (runner) => {
96
+ if (androidCache && Date.now() - androidCache.timestamp < CACHE_TTL_MS) {
97
+ return androidCache.result;
98
+ }
99
+ const proc = await runner('adb', ['devices'], { timeoutMs: LIST_TIMEOUT_MS });
100
+ if (proc.exitCode !== 0) {
101
+ throw new Error(`adb devices failed (exit ${proc.exitCode}): ${proc.stderr.toString('utf8').trim().slice(0, 500)}`);
102
+ }
103
+ const lines = proc.stdout.toString('utf8').split('\n');
104
+ const out = [];
105
+ for (const raw of lines.slice(1)) {
106
+ const line = raw.trim();
107
+ if (!line) {
108
+ continue;
109
+ }
110
+ const match = line.match(/^(\S+)\s+(\S+)\s*$/);
111
+ if (match?.[1] && match[2]) {
112
+ out.push({ serial: match[1], state: match[2] });
113
+ }
114
+ }
115
+ androidCache = { result: out, timestamp: Date.now() };
116
+ return out;
117
+ };
118
+ exports.listAndroidDevices = listAndroidDevices;
119
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../../src/server/host/deviceResolver/list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { type ProcessRunner } from '../../../server/host/processRunner';
2
+ import { type DeviceResolution } from './types';
3
+ export declare const scanForDevice: (platform: "android" | "ios" | undefined, runner: ProcessRunner) => Promise<DeviceResolution>;
4
+ //# sourceMappingURL=scan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../../../src/server/host/deviceResolver/scan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,6BAA6B,CAAC;AASjE,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,SAAS,CAAC;AA+EhD,eAAO,MAAM,aAAa,aACd,SAAS,GAAG,KAAK,GAAG,SAAS,UAC/B,aAAa,KACpB,OAAO,CAAC,gBAAgB,CAmB1B,CAAC"}
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.scanForDevice = void 0;
4
+ const list_1 = require("./list");
5
+ const scanIosDevices = async (runner) => {
6
+ try {
7
+ const sims = await (0, list_1.listIosSimulators)(runner);
8
+ const booted = sims.filter((s) => {
9
+ return s.state === 'Booted';
10
+ });
11
+ if (booted.length === 0) {
12
+ return {
13
+ error: 'No booted iOS simulator found. Boot one via Simulator.app or `xcrun simctl boot <udid>`.',
14
+ ok: false,
15
+ };
16
+ }
17
+ if (booted.length === 1) {
18
+ const only = booted[0];
19
+ return {
20
+ device: {
21
+ displayName: only.name,
22
+ kind: 'simulator',
23
+ nativeId: only.udid,
24
+ platform: 'ios',
25
+ },
26
+ ok: true,
27
+ };
28
+ }
29
+ const list = booted
30
+ .map((s) => {
31
+ return `${s.name} (${s.udid})`;
32
+ })
33
+ .join(', ');
34
+ return {
35
+ error: `Multiple iOS simulators booted: ${list}. Specify clientId or a more precise target.`,
36
+ ok: false,
37
+ };
38
+ }
39
+ catch (err) {
40
+ return (0, list_1.toDeviceError)(err, 'Failed to list iOS simulators', list_1.XCRUN_MISSING_ERROR);
41
+ }
42
+ };
43
+ const scanAndroidDevices = async (runner) => {
44
+ try {
45
+ const devices = await (0, list_1.listAndroidDevices)(runner);
46
+ const online = devices.filter((d) => {
47
+ return d.state === 'device';
48
+ });
49
+ if (online.length === 0) {
50
+ return {
51
+ error: 'No online Android device found. Start an emulator or connect a device.',
52
+ ok: false,
53
+ };
54
+ }
55
+ if (online.length === 1) {
56
+ const only = online[0];
57
+ return {
58
+ device: {
59
+ displayName: only.serial,
60
+ kind: 'real-device',
61
+ nativeId: only.serial,
62
+ platform: 'android',
63
+ },
64
+ ok: true,
65
+ };
66
+ }
67
+ const list = online
68
+ .map((d) => {
69
+ return d.serial;
70
+ })
71
+ .join(', ');
72
+ return {
73
+ error: `Multiple Android devices online: ${list}. Specify clientId.`,
74
+ ok: false,
75
+ };
76
+ }
77
+ catch (err) {
78
+ return (0, list_1.toDeviceError)(err, 'Failed to list Android devices', list_1.ADB_MISSING_ERROR);
79
+ }
80
+ };
81
+ const scanForDevice = async (platform, runner) => {
82
+ if (platform === 'ios') {
83
+ return scanIosDevices(runner);
84
+ }
85
+ if (platform === 'android') {
86
+ return scanAndroidDevices(runner);
87
+ }
88
+ const iosResult = await scanIosDevices(runner);
89
+ if (iosResult.ok) {
90
+ return iosResult;
91
+ }
92
+ const androidResult = await scanAndroidDevices(runner);
93
+ if (androidResult.ok) {
94
+ return androidResult;
95
+ }
96
+ return {
97
+ error: `No device available. iOS: ${iosResult.error} Android: ${androidResult.error}`,
98
+ ok: false,
99
+ };
100
+ };
101
+ exports.scanForDevice = scanForDevice;
102
+ //# sourceMappingURL=scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../../../src/server/host/deviceResolver/scan.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,3 @@
1
- import { type Bridge } from '../../server/bridge';
2
- import { type ProcessRunner } from './processRunner';
3
- import { type HostContext } from './types';
4
1
  export interface IosSimulator {
5
2
  name: string;
6
3
  state: string;
@@ -46,16 +43,4 @@ export type DeviceResolution = {
46
43
  error: string;
47
44
  ok: false;
48
45
  };
49
- interface ResolveOptions {
50
- platform?: 'android' | 'ios';
51
- serial?: string;
52
- udid?: string;
53
- }
54
- export declare const clearDeviceCache: () => void;
55
- export declare const listIosSimulators: (runner: ProcessRunner) => Promise<IosSimulator[]>;
56
- export declare const listIosRealDevices: (runner: ProcessRunner) => Promise<IosRealDevice[]>;
57
- export declare const listAndroidDevices: (runner: ProcessRunner) => Promise<AndroidDevice[]>;
58
- export declare const resolveDevice: (ctx: HostContext, options: ResolveOptions, runner: ProcessRunner) => Promise<DeviceResolution>;
59
- export declare const enrichDevicesWithClientStatus: (bridge: Bridge, runner: ProcessRunner) => Promise<EnrichedDeviceList>;
60
- export {};
61
- //# sourceMappingURL=deviceResolver.d.ts.map
46
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/server/host/deviceResolver/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,UAAU,GAAG,aAAa,GAAG,WAAW,CAAC;AAErD,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,SAAS,GAAG,KAAK,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAe,SAAQ,YAAY;IAClD,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,qBAAsB,SAAQ,aAAa;IAC1D,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,qBAAqB,EAAE,GAAG;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACrD,GAAG,EAAE,cAAc,EAAE,GAAG;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3C;AAED,MAAM,MAAM,gBAAgB,GAAG;IAAE,MAAM,EAAE,cAAc,CAAC;IAAC,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,KAAK,CAAA;CAAE,CAAC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/server/host/deviceResolver/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,15 @@
1
+ import { type AppTargetError } from '../../../../server/host/helpers';
2
+ import { type ProcessRunner } from '../../../../server/host/processRunner';
3
+ export declare const tapAndroid: (serial: string, x: number, y: number, runner: ProcessRunner) => Promise<{
4
+ ok: true;
5
+ } | AppTargetError>;
6
+ export declare const swipeAndroid: (serial: string, x1: number, y1: number, x2: number, y2: number, durationMs: number, runner: ProcessRunner) => Promise<{
7
+ ok: true;
8
+ } | AppTargetError>;
9
+ export declare const typeTextAndroid: (serial: string, text: string, submit: boolean, runner: ProcessRunner) => Promise<{
10
+ ok: true;
11
+ } | AppTargetError>;
12
+ export declare const pressKeyAndroid: (serial: string, key: string, runner: ProcessRunner) => Promise<{
13
+ ok: true;
14
+ } | AppTargetError>;
15
+ //# sourceMappingURL=android.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"android.d.ts","sourceRoot":"","sources":["../../../../../src/server/host/tools/input/android.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAwB,KAAK,aAAa,EAAE,MAAM,6BAA6B,CAAC;AA6CvF,eAAO,MAAM,UAAU,WACb,MAAM,KACX,MAAM,KACN,MAAM,UACD,aAAa,KACpB,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG,cAAc,CAEvC,CAAC;AAEF,eAAO,MAAM,YAAY,WACf,MAAM,MACV,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,cACE,MAAM,UACV,aAAa,KACpB,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG,cAAc,CAOvC,CAAC;AAEF,eAAO,MAAM,eAAe,WAClB,MAAM,QACR,MAAM,UACJ,OAAO,UACP,aAAa,KACpB,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG,cAAc,CAkCvC,CAAC;AAEF,eAAO,MAAM,eAAe,WAClB,MAAM,OACT,MAAM,UACH,aAAa,KACpB,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG,cAAc,CAQvC,CAAC"}
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.pressKeyAndroid = exports.typeTextAndroid = exports.swipeAndroid = exports.tapAndroid = void 0;
4
+ const processRunner_1 = require("../../../../server/host/processRunner");
5
+ const constants_1 = require("./constants");
6
+ // `adb shell input text` maps characters through the default virtual keyboard
7
+ // keymap, which only covers ASCII. Anything outside that set crashes the input
8
+ // service with an opaque "Attempt to get length of null array" NPE. Refuse it
9
+ // up front with an actionable message.
10
+ // eslint-disable-next-line no-control-regex
11
+ const NON_ASCII_RE = /[^\x00-\x7F]/;
12
+ const escapeAdbInputText = (text) => {
13
+ const spaced = text.replace(/\s/g, '%s');
14
+ return spaced.replace(/([\\'"`$&|;<>()[\]{}*?!#~])/g, '\\$1');
15
+ };
16
+ const runAdbInput = async (serial, args, runner, action) => {
17
+ try {
18
+ const proc = await runner('adb', ['-s', serial, 'shell', 'input', ...args], {
19
+ timeoutMs: constants_1.INPUT_TIMEOUT_MS,
20
+ });
21
+ if (proc.timedOut) {
22
+ return { error: `Android ${action} timed out after ${constants_1.INPUT_TIMEOUT_MS}ms` };
23
+ }
24
+ if (proc.exitCode !== 0) {
25
+ return {
26
+ error: `adb shell input ${action} failed (exit ${proc.exitCode}): ${proc.stderr.toString('utf8').trim().slice(0, 500)}`,
27
+ };
28
+ }
29
+ return { ok: true };
30
+ }
31
+ catch (err) {
32
+ if (err instanceof processRunner_1.ProcessNotFoundError) {
33
+ return {
34
+ error: 'adb not found. Android host tools require Android platform-tools on PATH.',
35
+ };
36
+ }
37
+ return { error: `Failed to run Android ${action}: ${err.message}` };
38
+ }
39
+ };
40
+ const tapAndroid = (serial, x, y, runner) => {
41
+ return runAdbInput(serial, ['tap', String(x), String(y)], runner, 'tap');
42
+ };
43
+ exports.tapAndroid = tapAndroid;
44
+ const swipeAndroid = (serial, x1, y1, x2, y2, durationMs, runner) => {
45
+ return runAdbInput(serial, ['swipe', String(x1), String(y1), String(x2), String(y2), String(durationMs)], runner, 'swipe');
46
+ };
47
+ exports.swipeAndroid = swipeAndroid;
48
+ const typeTextAndroid = async (serial, text, submit, runner) => {
49
+ if (NON_ASCII_RE.test(text)) {
50
+ return {
51
+ error: 'Android type_text only supports ASCII — `adb shell input text` has no code path for non-ASCII characters. Workarounds: tap the target field then drive the content some other way (e.g. fiber_tree__call on onChangeText), or paste from the device clipboard via a helper app.',
52
+ };
53
+ }
54
+ // Select all + delete existing text first (consistent with iOS behavior).
55
+ // `input keycombination` sends keys simultaneously (Ctrl+A = select all).
56
+ try {
57
+ const selAll = await runner('adb', ['-s', serial, 'shell', 'input', 'keycombination', '113', '29'], {
58
+ timeoutMs: constants_1.INPUT_TIMEOUT_MS,
59
+ });
60
+ if (selAll.exitCode === 0) {
61
+ await runAdbInput(serial, ['keyevent', 'KEYCODE_DEL'], runner, 'clear');
62
+ }
63
+ }
64
+ catch {
65
+ // keycombination not supported — skip clear, just append
66
+ }
67
+ const escaped = escapeAdbInputText(text);
68
+ const typed = await runAdbInput(serial, ['text', escaped], runner, 'text');
69
+ if ('error' in typed) {
70
+ return typed;
71
+ }
72
+ if (submit) {
73
+ return runAdbInput(serial, ['keyevent', 'KEYCODE_ENTER'], runner, 'submit');
74
+ }
75
+ return typed;
76
+ };
77
+ exports.typeTextAndroid = typeTextAndroid;
78
+ const pressKeyAndroid = (serial, key, runner) => {
79
+ const keycode = constants_1.ANDROID_KEYCODES[key];
80
+ if (!keycode) {
81
+ return Promise.resolve({
82
+ error: `Unknown key '${key}'. Supported: ${constants_1.KEY_NAMES.join(', ')}.`,
83
+ });
84
+ }
85
+ return runAdbInput(serial, ['keyevent', keycode], runner, 'keyevent');
86
+ };
87
+ exports.pressKeyAndroid = pressKeyAndroid;
88
+ //# sourceMappingURL=android.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"android.js","sourceRoot":"","sources":["../../../../../src/server/host/tools/input/android.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export declare const INPUT_TIMEOUT_MS = 5000;
2
+ export declare const SWIPE_DURATION_DEFAULT_MS = 300;
3
+ export declare const SWIPE_DURATION_MIN_MS = 50;
4
+ export declare const SWIPE_DURATION_MAX_MS = 5000;
5
+ export declare const LONG_PRESS_DURATION_DEFAULT_MS = 700;
6
+ export declare const DRAG_HOLD_DEFAULT_MS = 500;
7
+ export declare const DRAG_MOVE_DEFAULT_MS = 400;
8
+ export declare const BATCH_FOCUS_DELAY_DEFAULT_MS = 200;
9
+ export declare const BATCH_FOCUS_DELAY_MAX_MS = 5000;
10
+ export declare const ANDROID_KEYCODES: Record<string, string>;
11
+ export declare const KEY_NAMES: string[];
12
+ export declare const clampSwipeDuration: (value: unknown) => number;
13
+ export declare const clampLongPressDuration: (value: unknown) => number;
14
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../../src/server/host/tools/input/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,OAAQ,CAAC;AAEtC,eAAO,MAAM,yBAAyB,MAAM,CAAC;AAC7C,eAAO,MAAM,qBAAqB,KAAK,CAAC;AACxC,eAAO,MAAM,qBAAqB,OAAQ,CAAC;AAE3C,eAAO,MAAM,8BAA8B,MAAM,CAAC;AAElD,eAAO,MAAM,oBAAoB,MAAM,CAAC;AACxC,eAAO,MAAM,oBAAoB,MAAM,CAAC;AAExC,eAAO,MAAM,4BAA4B,MAAM,CAAC;AAChD,eAAO,MAAM,wBAAwB,OAAQ,CAAC;AAE9C,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAYnD,CAAC;AAEF,eAAO,MAAM,SAAS,UAAuC,CAAC;AAE9D,eAAO,MAAM,kBAAkB,UAAW,OAAO,KAAG,MAKnD,CAAC;AAEF,eAAO,MAAM,sBAAsB,UAAW,OAAO,KAAG,MAKvD,CAAC"}
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.clampLongPressDuration = exports.clampSwipeDuration = exports.KEY_NAMES = exports.ANDROID_KEYCODES = exports.BATCH_FOCUS_DELAY_MAX_MS = exports.BATCH_FOCUS_DELAY_DEFAULT_MS = exports.DRAG_MOVE_DEFAULT_MS = exports.DRAG_HOLD_DEFAULT_MS = exports.LONG_PRESS_DURATION_DEFAULT_MS = exports.SWIPE_DURATION_MAX_MS = exports.SWIPE_DURATION_MIN_MS = exports.SWIPE_DURATION_DEFAULT_MS = exports.INPUT_TIMEOUT_MS = void 0;
4
+ exports.INPUT_TIMEOUT_MS = 5_000;
5
+ exports.SWIPE_DURATION_DEFAULT_MS = 300;
6
+ exports.SWIPE_DURATION_MIN_MS = 50;
7
+ exports.SWIPE_DURATION_MAX_MS = 5_000;
8
+ exports.LONG_PRESS_DURATION_DEFAULT_MS = 700;
9
+ exports.DRAG_HOLD_DEFAULT_MS = 500;
10
+ exports.DRAG_MOVE_DEFAULT_MS = 400;
11
+ exports.BATCH_FOCUS_DELAY_DEFAULT_MS = 200;
12
+ exports.BATCH_FOCUS_DELAY_MAX_MS = 5_000;
13
+ exports.ANDROID_KEYCODES = {
14
+ back: 'KEYCODE_BACK',
15
+ backspace: 'KEYCODE_DEL',
16
+ enter: 'KEYCODE_ENTER',
17
+ escape: 'KEYCODE_ESCAPE',
18
+ home: 'KEYCODE_HOME',
19
+ menu: 'KEYCODE_MENU',
20
+ power: 'KEYCODE_POWER',
21
+ space: 'KEYCODE_SPACE',
22
+ tab: 'KEYCODE_TAB',
23
+ volume_down: 'KEYCODE_VOLUME_DOWN',
24
+ volume_up: 'KEYCODE_VOLUME_UP',
25
+ };
26
+ exports.KEY_NAMES = Object.keys(exports.ANDROID_KEYCODES).sort();
27
+ const clampSwipeDuration = (value) => {
28
+ if (typeof value !== 'number' || !Number.isFinite(value) || value <= 0) {
29
+ return exports.SWIPE_DURATION_DEFAULT_MS;
30
+ }
31
+ return Math.max(exports.SWIPE_DURATION_MIN_MS, Math.min(exports.SWIPE_DURATION_MAX_MS, Math.floor(value)));
32
+ };
33
+ exports.clampSwipeDuration = clampSwipeDuration;
34
+ const clampLongPressDuration = (value) => {
35
+ if (typeof value !== 'number' || !Number.isFinite(value) || value <= 0) {
36
+ return exports.LONG_PRESS_DURATION_DEFAULT_MS;
37
+ }
38
+ return Math.max(exports.SWIPE_DURATION_MIN_MS, Math.min(exports.SWIPE_DURATION_MAX_MS, Math.floor(value)));
39
+ };
40
+ exports.clampLongPressDuration = clampLongPressDuration;
41
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../../src/server/host/tools/input/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,gBAAgB,GAAG,KAAK,CAAC;AAEzB,QAAA,yBAAyB,GAAG,GAAG,CAAC;AAChC,QAAA,qBAAqB,GAAG,EAAE,CAAC;AAC3B,QAAA,qBAAqB,GAAG,KAAK,CAAC;AAE9B,QAAA,8BAA8B,GAAG,GAAG,CAAC;AAErC,QAAA,oBAAoB,GAAG,GAAG,CAAC;AAC3B,QAAA,oBAAoB,GAAG,GAAG,CAAC;AAE3B,QAAA,4BAA4B,GAAG,GAAG,CAAC;AACnC,QAAA,wBAAwB,GAAG,KAAK,CAAC;AAEjC,QAAA,gBAAgB,GAA2B;IACtD,IAAI,EAAE,cAAc;IACpB,SAAS,EAAE,aAAa;IACxB,KAAK,EAAE,eAAe;IACtB,MAAM,EAAE,gBAAgB;IACxB,IAAI,EAAE,cAAc;IACpB,IAAI,EAAE,cAAc;IACpB,KAAK,EAAE,eAAe;IACtB,KAAK,EAAE,eAAe;IACtB,GAAG,EAAE,aAAa;IAClB,WAAW,EAAE,qBAAqB;IAClC,SAAS,EAAE,mBAAmB;CAC/B,CAAC;AAEW,QAAA,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,wBAAgB,CAAC,CAAC,IAAI,EAAE,CAAC;AAEvD,MAAM,kBAAkB,GAAG,CAAC,KAAc,EAAU,EAAE;IAC3D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QACvE,OAAO,iCAAyB,CAAC;IACnC,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,6BAAqB,EAAE,IAAI,CAAC,GAAG,CAAC,6BAAqB,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC7F,CAAC,CAAC;AALW,QAAA,kBAAkB,sBAK7B;AAEK,MAAM,sBAAsB,GAAG,CAAC,KAAc,EAAU,EAAE;IAC/D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QACvE,OAAO,sCAA8B,CAAC;IACxC,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,6BAAqB,EAAE,IAAI,CAAC,GAAG,CAAC,6BAAqB,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC7F,CAAC,CAAC;AALW,QAAA,sBAAsB,0BAKjC"}
@@ -0,0 +1,4 @@
1
+ import { type ProcessRunner } from '../../../../server/host/processRunner';
2
+ import { type HostToolHandler } from '../../../../server/host/types';
3
+ export declare const dragTool: (runner: ProcessRunner) => HostToolHandler;
4
+ //# sourceMappingURL=drag.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drag.d.ts","sourceRoot":"","sources":["../../../../../src/server/host/tools/input/drag.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAY3D,eAAO,MAAM,QAAQ,WAAY,aAAa,KAAG,eAgFhD,CAAC"}
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.dragTool = void 0;
4
+ const deviceResolver_1 = require("../../../../server/host/deviceResolver");
5
+ const helpers_1 = require("../../../../server/host/helpers");
6
+ const iosInput_1 = require("../../../../server/host/iosInput");
7
+ const android_1 = require("./android");
8
+ const constants_1 = require("./constants");
9
+ const dragTool = (runner) => {
10
+ return {
11
+ description: 'Primary way to deliver a hold-then-drag gesture — swipe-to-delete, drag-to-reorder, pull-to-refresh-with-hold. Total gesture time = holdMs + durationMs (both platforms emit a single slow swipe — the hold is simulated by lingering near the start, not a true stop-then-move pause). When precise hold timing matters (e.g. iOS haptic long-press triggers), test + tune holdMs empirically.',
12
+ handler: async (args, ctx) => {
13
+ const resolved = await (0, deviceResolver_1.resolveDevice)(ctx, (0, helpers_1.parseResolveOptions)(args), runner);
14
+ if (!resolved.ok) {
15
+ return { error: resolved.error };
16
+ }
17
+ const x1 = (0, helpers_1.parseCoord)(args.x1, 'x1');
18
+ if (!x1.ok)
19
+ return { error: x1.error };
20
+ const y1 = (0, helpers_1.parseCoord)(args.y1, 'y1');
21
+ if (!y1.ok)
22
+ return { error: y1.error };
23
+ const x2 = (0, helpers_1.parseCoord)(args.x2, 'x2');
24
+ if (!x2.ok)
25
+ return { error: x2.error };
26
+ const y2 = (0, helpers_1.parseCoord)(args.y2, 'y2');
27
+ if (!y2.ok)
28
+ return { error: y2.error };
29
+ const holdMs = typeof args.holdMs === 'number' && Number.isFinite(args.holdMs) && args.holdMs >= 0
30
+ ? Math.min(constants_1.SWIPE_DURATION_MAX_MS, Math.floor(args.holdMs))
31
+ : constants_1.DRAG_HOLD_DEFAULT_MS;
32
+ const moveMs = (0, constants_1.clampSwipeDuration)(args.durationMs ?? constants_1.DRAG_MOVE_DEFAULT_MS);
33
+ const total = Math.min(constants_1.SWIPE_DURATION_MAX_MS, holdMs + moveMs);
34
+ const result = resolved.device.platform === 'ios'
35
+ ? await (0, iosInput_1.swipeIos)(resolved.device.nativeId, x1.value, y1.value, x2.value, y2.value, total, runner)
36
+ : await (0, android_1.swipeAndroid)(resolved.device.nativeId, x1.value, y1.value, x2.value, y2.value, total, runner);
37
+ if ('error' in result) {
38
+ return { error: result.error };
39
+ }
40
+ return {
41
+ device: resolved.device,
42
+ dragged: true,
43
+ from: { x: x1.value, y: y1.value },
44
+ holdMs,
45
+ moveMs,
46
+ to: { x: x2.value, y: y2.value },
47
+ totalMs: total,
48
+ };
49
+ },
50
+ inputSchema: {
51
+ durationMs: {
52
+ default: constants_1.DRAG_MOVE_DEFAULT_MS,
53
+ description: 'Move portion in milliseconds.',
54
+ maximum: constants_1.SWIPE_DURATION_MAX_MS,
55
+ minimum: constants_1.SWIPE_DURATION_MIN_MS,
56
+ type: 'number',
57
+ },
58
+ holdMs: {
59
+ default: constants_1.DRAG_HOLD_DEFAULT_MS,
60
+ description: 'Hold time near start before the motion. 0 to skip hold.',
61
+ maximum: constants_1.SWIPE_DURATION_MAX_MS,
62
+ minimum: 0,
63
+ type: 'number',
64
+ },
65
+ platform: helpers_1.PLATFORM_ARG_SCHEMA,
66
+ x1: { description: 'Start x pixel coordinate.', minimum: 0, type: 'number' },
67
+ x2: { description: 'End x pixel coordinate.', minimum: 0, type: 'number' },
68
+ y1: { description: 'Start y pixel coordinate.', minimum: 0, type: 'number' },
69
+ y2: { description: 'End y pixel coordinate.', minimum: 0, type: 'number' },
70
+ ...helpers_1.NATIVE_ID_SCHEMA,
71
+ },
72
+ timeout: constants_1.INPUT_TIMEOUT_MS + constants_1.SWIPE_DURATION_MAX_MS,
73
+ };
74
+ };
75
+ exports.dragTool = dragTool;
76
+ //# sourceMappingURL=drag.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drag.js","sourceRoot":"","sources":["../../../../../src/server/host/tools/input/drag.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export { dragTool } from './drag';
2
+ export { longPressTool } from './longPress';
3
+ export { pressKeyTool } from './pressKey';
4
+ export { swipeTool } from './swipe';
5
+ export { tapTool } from './tap';
6
+ export { typeTextTool } from './typeText';
7
+ export { typeTextBatchTool } from './typeTextBatch';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/server/host/tools/input/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.typeTextBatchTool = exports.typeTextTool = exports.tapTool = exports.swipeTool = exports.pressKeyTool = exports.longPressTool = exports.dragTool = void 0;
4
+ var drag_1 = require("./drag");
5
+ Object.defineProperty(exports, "dragTool", { enumerable: true, get: function () { return drag_1.dragTool; } });
6
+ var longPress_1 = require("./longPress");
7
+ Object.defineProperty(exports, "longPressTool", { enumerable: true, get: function () { return longPress_1.longPressTool; } });
8
+ var pressKey_1 = require("./pressKey");
9
+ Object.defineProperty(exports, "pressKeyTool", { enumerable: true, get: function () { return pressKey_1.pressKeyTool; } });
10
+ var swipe_1 = require("./swipe");
11
+ Object.defineProperty(exports, "swipeTool", { enumerable: true, get: function () { return swipe_1.swipeTool; } });
12
+ var tap_1 = require("./tap");
13
+ Object.defineProperty(exports, "tapTool", { enumerable: true, get: function () { return tap_1.tapTool; } });
14
+ var typeText_1 = require("./typeText");
15
+ Object.defineProperty(exports, "typeTextTool", { enumerable: true, get: function () { return typeText_1.typeTextTool; } });
16
+ var typeTextBatch_1 = require("./typeTextBatch");
17
+ Object.defineProperty(exports, "typeTextBatchTool", { enumerable: true, get: function () { return typeTextBatch_1.typeTextBatchTool; } });
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/server/host/tools/input/index.ts"],"names":[],"mappings":";;;AAAA,+BAAkC;AAAzB,gGAAA,QAAQ,OAAA;AACjB,yCAA4C;AAAnC,0GAAA,aAAa,OAAA;AACtB,uCAA0C;AAAjC,wGAAA,YAAY,OAAA;AACrB,iCAAoC;AAA3B,kGAAA,SAAS,OAAA;AAClB,6BAAgC;AAAvB,8FAAA,OAAO,OAAA;AAChB,uCAA0C;AAAjC,wGAAA,YAAY,OAAA;AACrB,iDAAoD;AAA3C,kHAAA,iBAAiB,OAAA"}
@@ -0,0 +1,4 @@
1
+ import { type ProcessRunner } from '../../../../server/host/processRunner';
2
+ import { type HostToolHandler } from '../../../../server/host/types';
3
+ export declare const longPressTool: (runner: ProcessRunner) => HostToolHandler;
4
+ //# sourceMappingURL=longPress.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"longPress.d.ts","sourceRoot":"","sources":["../../../../../src/server/host/tools/input/longPress.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAW3D,eAAO,MAAM,aAAa,WAAY,aAAa,KAAG,eAsDrD,CAAC"}