@swmansion/argent 0.25.1-next.34 → 0.25.1-next.36

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.
package/dist/cli-cmds.mjs CHANGED
@@ -2372,6 +2372,8 @@ var FAILURE_CODES = {
2372
2372
  ANDROID_DEVTOOLS_WRONG_PLATFORM: "ANDROID_DEVTOOLS_WRONG_PLATFORM",
2373
2373
  ANDROID_DEVTOOLS_DEVICE_ID_INVALID: "ANDROID_DEVTOOLS_DEVICE_ID_INVALID",
2374
2374
  ANDROID_DEVTOOLS_HELPER_TERMINATED: "ANDROID_DEVTOOLS_HELPER_TERMINATED",
2375
+ ANDROID_DEVTOOLS_HELPER_INSTALL_FAILED: "ANDROID_DEVTOOLS_HELPER_INSTALL_FAILED",
2376
+ ANDROID_DEVTOOLS_HELPER_REPAIR_FAILED: "ANDROID_DEVTOOLS_HELPER_REPAIR_FAILED",
2375
2377
  ANDROID_DEVTOOLS_RPC_CLIENT_CLOSED: "ANDROID_DEVTOOLS_RPC_CLIENT_CLOSED",
2376
2378
  ANDROID_DEVTOOLS_RPC_ERROR: "ANDROID_DEVTOOLS_RPC_ERROR",
2377
2379
  ANDROID_DEVTOOLS_RPC_TIMEOUT: "ANDROID_DEVTOOLS_RPC_TIMEOUT",
@@ -21857,7 +21859,7 @@ var _CI_VENDOR_COUNT_FOR_TEST = vendors_default.length;
21857
21859
  var SESSION_ID2 = randomUUID5();
21858
21860
  function readCliVersion() {
21859
21861
  if (true) {
21860
- return "0.25.1-next.34";
21862
+ return "0.25.1-next.36";
21861
21863
  }
21862
21864
  return "0.0.0";
21863
21865
  }
@@ -15744,6 +15744,8 @@ var FAILURE_CODES = {
15744
15744
  ANDROID_DEVTOOLS_WRONG_PLATFORM: "ANDROID_DEVTOOLS_WRONG_PLATFORM",
15745
15745
  ANDROID_DEVTOOLS_DEVICE_ID_INVALID: "ANDROID_DEVTOOLS_DEVICE_ID_INVALID",
15746
15746
  ANDROID_DEVTOOLS_HELPER_TERMINATED: "ANDROID_DEVTOOLS_HELPER_TERMINATED",
15747
+ ANDROID_DEVTOOLS_HELPER_INSTALL_FAILED: "ANDROID_DEVTOOLS_HELPER_INSTALL_FAILED",
15748
+ ANDROID_DEVTOOLS_HELPER_REPAIR_FAILED: "ANDROID_DEVTOOLS_HELPER_REPAIR_FAILED",
15747
15749
  ANDROID_DEVTOOLS_RPC_CLIENT_CLOSED: "ANDROID_DEVTOOLS_RPC_CLIENT_CLOSED",
15748
15750
  ANDROID_DEVTOOLS_RPC_ERROR: "ANDROID_DEVTOOLS_RPC_ERROR",
15749
15751
  ANDROID_DEVTOOLS_RPC_TIMEOUT: "ANDROID_DEVTOOLS_RPC_TIMEOUT",
@@ -16710,7 +16712,7 @@ var _CI_VENDOR_COUNT_FOR_TEST = vendors_default.length;
16710
16712
  var SESSION_ID = randomUUID4();
16711
16713
  function readCliVersion() {
16712
16714
  if (true) {
16713
- return "0.25.1-next.34";
16715
+ return "0.25.1-next.36";
16714
16716
  }
16715
16717
  return "0.0.0";
16716
16718
  }
@@ -16552,6 +16552,8 @@ var FAILURE_CODES = {
16552
16552
  ANDROID_DEVTOOLS_WRONG_PLATFORM: "ANDROID_DEVTOOLS_WRONG_PLATFORM",
16553
16553
  ANDROID_DEVTOOLS_DEVICE_ID_INVALID: "ANDROID_DEVTOOLS_DEVICE_ID_INVALID",
16554
16554
  ANDROID_DEVTOOLS_HELPER_TERMINATED: "ANDROID_DEVTOOLS_HELPER_TERMINATED",
16555
+ ANDROID_DEVTOOLS_HELPER_INSTALL_FAILED: "ANDROID_DEVTOOLS_HELPER_INSTALL_FAILED",
16556
+ ANDROID_DEVTOOLS_HELPER_REPAIR_FAILED: "ANDROID_DEVTOOLS_HELPER_REPAIR_FAILED",
16555
16557
  ANDROID_DEVTOOLS_RPC_CLIENT_CLOSED: "ANDROID_DEVTOOLS_RPC_CLIENT_CLOSED",
16556
16558
  ANDROID_DEVTOOLS_RPC_ERROR: "ANDROID_DEVTOOLS_RPC_ERROR",
16557
16559
  ANDROID_DEVTOOLS_RPC_TIMEOUT: "ANDROID_DEVTOOLS_RPC_TIMEOUT",
@@ -698,6 +698,8 @@ var init_failure_codes = __esm({
698
698
  ANDROID_DEVTOOLS_WRONG_PLATFORM: "ANDROID_DEVTOOLS_WRONG_PLATFORM",
699
699
  ANDROID_DEVTOOLS_DEVICE_ID_INVALID: "ANDROID_DEVTOOLS_DEVICE_ID_INVALID",
700
700
  ANDROID_DEVTOOLS_HELPER_TERMINATED: "ANDROID_DEVTOOLS_HELPER_TERMINATED",
701
+ ANDROID_DEVTOOLS_HELPER_INSTALL_FAILED: "ANDROID_DEVTOOLS_HELPER_INSTALL_FAILED",
702
+ ANDROID_DEVTOOLS_HELPER_REPAIR_FAILED: "ANDROID_DEVTOOLS_HELPER_REPAIR_FAILED",
701
703
  ANDROID_DEVTOOLS_RPC_CLIENT_CLOSED: "ANDROID_DEVTOOLS_RPC_CLIENT_CLOSED",
702
704
  ANDROID_DEVTOOLS_RPC_ERROR: "ANDROID_DEVTOOLS_RPC_ERROR",
703
705
  ANDROID_DEVTOOLS_RPC_TIMEOUT: "ANDROID_DEVTOOLS_RPC_TIMEOUT",
@@ -77006,8 +77008,8 @@ async function emulatorSupportsFlag(flag, options = {}) {
77006
77008
  } catch {
77007
77009
  return false;
77008
77010
  }
77009
- const cacheKey3 = `${emulatorPath}|${flag}`;
77010
- const cached3 = emulatorFlagSupportCache.get(cacheKey3);
77011
+ const cacheKey2 = `${emulatorPath}|${flag}`;
77012
+ const cached3 = emulatorFlagSupportCache.get(cacheKey2);
77011
77013
  if (cached3 !== void 0) return cached3;
77012
77014
  let output;
77013
77015
  let failure = null;
@@ -77034,7 +77036,7 @@ async function emulatorSupportsFlag(flag, options = {}) {
77034
77036
  return false;
77035
77037
  }
77036
77038
  const supported = output.includes(flag);
77037
- emulatorFlagSupportCache.set(cacheKey3, supported);
77039
+ emulatorFlagSupportCache.set(cacheKey2, supported);
77038
77040
  return supported;
77039
77041
  }
77040
77042
  function describeAdbFailure(args, err) {
@@ -94704,7 +94706,7 @@ var _CI_VENDOR_COUNT_FOR_TEST = vendors_default.length;
94704
94706
  var SESSION_ID = (0, import_node_crypto3.randomUUID)();
94705
94707
  function readCliVersion() {
94706
94708
  if (true) {
94707
- return "0.25.1-next.34";
94709
+ return "0.25.1-next.36";
94708
94710
  }
94709
94711
  return "0.0.0";
94710
94712
  }
@@ -112897,10 +112899,6 @@ init_android_binary();
112897
112899
 
112898
112900
  // ../tool-server/src/utils/android-helper-install.ts
112899
112901
  init_adb();
112900
- var installedHelpers = /* @__PURE__ */ new Map();
112901
- function cacheKey(serial, versionCode) {
112902
- return `${serial}|${versionCode}`;
112903
- }
112904
112902
  async function probeInstalledVersion(serial, packageName) {
112905
112903
  let out;
112906
112904
  try {
@@ -112923,17 +112921,17 @@ async function probeInstalledVersion(serial, packageName) {
112923
112921
  }
112924
112922
  return { installed: false, versionCode: null };
112925
112923
  }
112926
- async function ensureAndroidDevtoolsInstalled(serial) {
112924
+ async function ensureAndroidDevtoolsInstalled(serial, options = {}) {
112927
112925
  const manifest = helperManifest();
112928
- const key2 = cacheKey(serial, manifest.versionCode);
112929
- if (installedHelpers.has(key2)) return;
112930
- const probe3 = await probeInstalledVersion(serial, manifest.packageName);
112931
- if (probe3.installed && probe3.versionCode !== null && probe3.versionCode >= manifest.versionCode) {
112932
- installedHelpers.set(key2, true);
112933
- return;
112926
+ if (!options.force) {
112927
+ const probe3 = await probeInstalledVersion(serial, manifest.packageName);
112928
+ if (probe3.installed && (probe3.versionCode === null || probe3.versionCode >= manifest.versionCode)) {
112929
+ return;
112930
+ }
112934
112931
  }
112935
112932
  const apkPath = bundledHelperApkPath();
112936
- const args = ["-s", serial, "install", ...manifest.installFlags, apkPath];
112933
+ const flags = options.force ? [...manifest.installFlags, "-d"] : manifest.installFlags;
112934
+ const args = ["-s", serial, "install", ...flags, apkPath];
112937
112935
  try {
112938
112936
  await runAdb(args, { timeoutMs: 6e4 });
112939
112937
  } catch (err) {
@@ -112948,7 +112946,6 @@ async function ensureAndroidDevtoolsInstalled(serial) {
112948
112946
  throw err;
112949
112947
  }
112950
112948
  }
112951
- installedHelpers.set(key2, true);
112952
112949
  }
112953
112950
 
112954
112951
  // ../tool-server/src/utils/android-devtools-client.ts
@@ -113092,14 +113089,28 @@ function androidDevtoolsRef(device) {
113092
113089
  };
113093
113090
  }
113094
113091
  var READY_TIMEOUT_MS2 = 3e4;
113092
+ var EXIT_GRACE_MS = 200;
113095
113093
  var HELPER_PORT_MARKER = /^INSTRUMENTATION_STATUS:\s*port=(\d+)/;
113096
113094
  var ADB_FORWARD_PORT_MARKER = /^(\d+)\s*$/;
113095
+ var HELPER_STATUS_MARKER = /^INSTRUMENTATION_STATUS:\s*Error=/;
113096
+ var HELPER_STATUS_MAX_CHARS = 400;
113097
+ function classifyHelperSpawnFault(text) {
113098
+ return /Unable to find instrumentation (?:info|target package)/i.test(text) ? "instrumentation-missing" : "unknown";
113099
+ }
113100
+ var HelperSpawnError = class extends FailureError {
113101
+ fault;
113102
+ constructor(message, signal, fault) {
113103
+ super(message, signal);
113104
+ this.name = "HelperSpawnError";
113105
+ this.fault = fault;
113106
+ }
113107
+ };
113097
113108
  async function spawnHelper(serial) {
113098
113109
  const manifest = helperManifest();
113099
113110
  const adbPath = await resolveAndroidBinary("adb");
113100
113111
  if (!adbPath) {
113101
113112
  throw new FailureError(
113102
- "`adb` not found on PATH or under `$ANDROID_HOME/platform-tools` while spawning android-devtools helper.",
113113
+ "`adb` not found on PATH or under `$ANDROID_HOME/platform-tools` while spawning the argent android helper.",
113103
113114
  {
113104
113115
  error_code: FAILURE_CODES.ANDROID_DEVTOOLS_ADB_NOT_FOUND,
113105
113116
  failure_stage: "android_devtools_spawn_helper",
@@ -113118,10 +113129,13 @@ async function spawnHelper(serial) {
113118
113129
  let localPort = null;
113119
113130
  let settled = false;
113120
113131
  let stderrBuf = "";
113132
+ let statusBuf = "";
113133
+ let exitGrace;
113121
113134
  const settle = (fn, cleanup) => {
113122
113135
  if (settled) return;
113123
113136
  settled = true;
113124
113137
  clearTimeout(timer);
113138
+ clearTimeout(exitGrace);
113125
113139
  rl.close();
113126
113140
  cleanup?.();
113127
113141
  fn();
@@ -113129,6 +113143,9 @@ async function spawnHelper(serial) {
113129
113143
  const rl = readline2.createInterface({ input: proc.stdout });
113130
113144
  rl.on("line", async (rawLine) => {
113131
113145
  const line = rawLine.trim();
113146
+ if (statusBuf.length < HELPER_STATUS_MAX_CHARS && HELPER_STATUS_MARKER.test(line)) {
113147
+ statusBuf = (statusBuf ? `${statusBuf} ${line}` : line).slice(0, HELPER_STATUS_MAX_CHARS);
113148
+ }
113132
113149
  const portMatch = HELPER_PORT_MARKER.exec(line);
113133
113150
  if (!portMatch || devicePort !== null) return;
113134
113151
  devicePort = parseInt(portMatch[1], 10);
@@ -113158,25 +113175,32 @@ async function spawnHelper(serial) {
113158
113175
  stderrBuf += data.toString("utf-8");
113159
113176
  if (stderrBuf.length > 4 * 1024) stderrBuf = stderrBuf.slice(-4 * 1024);
113160
113177
  });
113161
- proc.on("exit", (code, signal) => {
113162
- const detail = stderrBuf.trim() ? ` stderr=${stderrBuf.trim().slice(0, 400)}` : "";
113163
- settle(
113164
- () => reject(
113165
- new FailureError(
113166
- `am instrument exited before becoming ready (code=${code} signal=${signal}).${detail}`,
113167
- {
113168
- error_code: FAILURE_CODES.ANDROID_DEVTOOLS_HELPER_EXITED_BEFORE_READY,
113169
- failure_stage: "android_devtools_helper_ready",
113170
- failure_area: "tool_server",
113171
- error_kind: "subprocess",
113172
- failure_command: "android_devtools",
113173
- ...typeof code === "number" ? { failure_exit_code: code } : {},
113174
- ...signal === "SIGABRT" || signal === "SIGHUP" || signal === "SIGINT" || signal === "SIGKILL" || signal === "SIGQUIT" || signal === "SIGTERM" ? { failure_signal: signal } : {}
113175
- }
113176
- )
113178
+ let exitCode = null;
113179
+ let exitSignal = null;
113180
+ const rejectExited = () => {
113181
+ const detail = statusBuf ? statusBuf : stderrBuf.trim() ? `code=${exitCode} signal=${exitSignal}. stderr=${stderrBuf.trim().slice(0, 200)}` : `code=${exitCode} signal=${exitSignal}`;
113182
+ reject(
113183
+ new HelperSpawnError(
113184
+ `am instrument exited before becoming ready: ${detail}`,
113185
+ {
113186
+ error_code: FAILURE_CODES.ANDROID_DEVTOOLS_HELPER_EXITED_BEFORE_READY,
113187
+ failure_stage: "android_devtools_helper_ready",
113188
+ failure_area: "tool_server",
113189
+ error_kind: "subprocess",
113190
+ failure_command: "android_devtools",
113191
+ ...typeof exitCode === "number" ? { failure_exit_code: exitCode } : {},
113192
+ ...exitSignal === "SIGABRT" || exitSignal === "SIGHUP" || exitSignal === "SIGINT" || exitSignal === "SIGKILL" || exitSignal === "SIGQUIT" || exitSignal === "SIGTERM" ? { failure_signal: exitSignal } : {}
113193
+ },
113194
+ classifyHelperSpawnFault(statusBuf)
113177
113195
  )
113178
113196
  );
113197
+ };
113198
+ proc.on("exit", (code, signal) => {
113199
+ exitCode = code;
113200
+ exitSignal = signal;
113201
+ exitGrace = setTimeout(() => settle(rejectExited), EXIT_GRACE_MS);
113179
113202
  });
113203
+ proc.on("close", () => settle(rejectExited));
113180
113204
  proc.on("error", (err) => {
113181
113205
  settle(
113182
113206
  () => reject(
@@ -113211,6 +113235,50 @@ async function spawnHelper(serial) {
113211
113235
  }, READY_TIMEOUT_MS2);
113212
113236
  });
113213
113237
  }
113238
+ async function installHelper(serial, options) {
113239
+ try {
113240
+ await ensureAndroidDevtoolsInstalled(serial, options);
113241
+ } catch (err) {
113242
+ const cause = err instanceof Error ? err : new Error(String(err));
113243
+ const reason = cause.message.replace(/^.*? failed: /s, "").replace(/\s+/g, " ").trim().slice(0, 200);
113244
+ throw new FailureError(
113245
+ `the argent android helper is not installed on ${serial} and could not be installed: ${reason}`,
113246
+ {
113247
+ error_code: FAILURE_CODES.ANDROID_DEVTOOLS_HELPER_INSTALL_FAILED,
113248
+ failure_stage: "android_devtools_helper_install",
113249
+ failure_area: "tool_server",
113250
+ error_kind: "subprocess",
113251
+ failure_command: "adb"
113252
+ },
113253
+ { cause }
113254
+ );
113255
+ }
113256
+ }
113257
+ async function spawnHelperWithRepair(serial) {
113258
+ await installHelper(serial, {});
113259
+ try {
113260
+ return await spawnHelper(serial);
113261
+ } catch (err) {
113262
+ if (!(err instanceof HelperSpawnError) || err.fault !== "instrumentation-missing") throw err;
113263
+ await installHelper(serial, { force: true });
113264
+ try {
113265
+ return await spawnHelper(serial);
113266
+ } catch (repairErr) {
113267
+ if (!(repairErr instanceof HelperSpawnError)) throw repairErr;
113268
+ throw new FailureError(
113269
+ `the argent android helper could not start on ${serial} even after reinstalling it: ${repairErr.message}`,
113270
+ {
113271
+ error_code: FAILURE_CODES.ANDROID_DEVTOOLS_HELPER_REPAIR_FAILED,
113272
+ failure_stage: "android_devtools_helper_repair",
113273
+ failure_area: "tool_server",
113274
+ error_kind: "subprocess",
113275
+ failure_command: "android_devtools"
113276
+ },
113277
+ { cause: repairErr }
113278
+ );
113279
+ }
113280
+ }
113281
+ }
113214
113282
  async function removeAdbForward(serial, localPort) {
113215
113283
  try {
113216
113284
  await runAdb(["-s", serial, "forward", "--remove", `tcp:${localPort}`], { timeoutMs: 5e3 });
@@ -113260,8 +113328,7 @@ var androidDevtoolsBlueprint = {
113260
113328
  }
113261
113329
  const serial = device.id;
113262
113330
  const events = new TypedEventEmitter();
113263
- await ensureAndroidDevtoolsInstalled(serial);
113264
- const spawned = await spawnHelper(serial);
113331
+ const spawned = await spawnHelperWithRepair(serial);
113265
113332
  let ready2 = false;
113266
113333
  let disposed = false;
113267
113334
  let client2;
@@ -115528,13 +115595,13 @@ async function ensureRunnerArtifact(config2, opts = {}) {
115528
115595
  xcodeVersionFingerprint()
115529
115596
  ]);
115530
115597
  const staticArgs = runnerBuildStaticArgs(projectPath, config2);
115531
- const cacheKey3 = computeRunnerCacheKey(sourcesHash, xcodeVersion, staticArgs);
115598
+ const cacheKey2 = computeRunnerCacheKey(sourcesHash, xcodeVersion, staticArgs);
115532
115599
  const derivedDataPath = derivedDir();
115533
115600
  const build = opts.build ?? buildRunnerArtifact;
115534
115601
  return withRunnerBuildLock(async () => {
115535
115602
  const stampPath = path21.join(derivedDataPath, CACHE_KEY_FILE);
115536
115603
  const stamped = await fsp.readFile(stampPath, "utf8").catch(() => null);
115537
- if (!opts.force && stamped === cacheKey3) {
115604
+ if (!opts.force && stamped === cacheKey2) {
115538
115605
  const cached3 = findBaseXctestrun(derivedDataPath);
115539
115606
  const expiresAt = await readRunnerExpiryDate(derivedDataPath);
115540
115607
  const needsRenew = expiresAt !== null && profileNeedsRenewal(expiresAt, /* @__PURE__ */ new Date());
@@ -115546,14 +115613,14 @@ async function ensureRunnerArtifact(config2, opts = {}) {
115546
115613
  };
115547
115614
  }
115548
115615
  }
115549
- if (stamped !== cacheKey3) {
115616
+ if (stamped !== cacheKey2) {
115550
115617
  await fsp.rm(derivedDataPath, {
115551
115618
  recursive: true,
115552
115619
  force: true
115553
115620
  });
115554
115621
  }
115555
115622
  const built = await build(derivedDataPath, staticArgs, opts.destinationUdid);
115556
- await fsp.writeFile(stampPath, cacheKey3);
115623
+ await fsp.writeFile(stampPath, cacheKey2);
115557
115624
  return built;
115558
115625
  });
115559
115626
  }
@@ -119852,25 +119919,25 @@ var reactProfilerSessionBlueprint = {
119852
119919
  }
119853
119920
  };
119854
119921
  var profilerPathsCache = /* @__PURE__ */ new Map();
119855
- function cacheKey2(port, deviceId) {
119922
+ function cacheKey(port, deviceId) {
119856
119923
  return `${port}:${deviceId}`;
119857
119924
  }
119858
119925
  function cacheProfilerPaths(port, paths, deviceId) {
119859
- profilerPathsCache.set(cacheKey2(port, deviceId), paths);
119926
+ profilerPathsCache.set(cacheKey(port, deviceId), paths);
119860
119927
  }
119861
119928
  function getCachedProfilerPaths(port, deviceId) {
119862
- return profilerPathsCache.get(cacheKey2(port, deviceId));
119929
+ return profilerPathsCache.get(cacheKey(port, deviceId));
119863
119930
  }
119864
119931
  function clearCachedProfilerPaths(port, deviceId) {
119865
- profilerPathsCache.delete(cacheKey2(port, deviceId));
119932
+ profilerPathsCache.delete(cacheKey(port, deviceId));
119866
119933
  }
119867
119934
 
119868
119935
  // ../tool-server/src/tools/devices/boot-device.ts
119869
- var import_node_child_process24 = require("node:child_process");
119936
+ var import_node_child_process25 = require("node:child_process");
119870
119937
  var import_node_fs12 = require("node:fs");
119871
119938
  var import_node_os11 = require("node:os");
119872
119939
  var import_node_path14 = require("node:path");
119873
- var import_node_util17 = require("node:util");
119940
+ var import_node_util18 = require("node:util");
119874
119941
  init_zod();
119875
119942
  init_src();
119876
119943
  init_adb();
@@ -119955,6 +120022,39 @@ function androidHeadlessFromEnv() {
119955
120022
  init_device_info();
119956
120023
  init_external_devices();
119957
120024
 
120025
+ // ../tool-server/src/utils/hid-suppression.ts
120026
+ var import_node_child_process23 = require("node:child_process");
120027
+ var import_node_util17 = require("node:util");
120028
+ var execFileAsync17 = (0, import_node_util17.promisify)(import_node_child_process23.execFile);
120029
+ var WARMUP_TIMEOUT_MS = 4e4;
120030
+ var errText = (err) => err instanceof Error ? err.message : String(err);
120031
+ function startHidWarmUp(udid, deviceSet) {
120032
+ let binary;
120033
+ try {
120034
+ binary = simulatorServerBinaryPath();
120035
+ } catch (err) {
120036
+ process.stderr.write(
120037
+ `[hid-warmup ${udid.slice(0, 8)}] simulator-server binary not found (${errText(err)}); HID suppression protection is not active for this boot.
120038
+ `
120039
+ );
120040
+ return Promise.resolve();
120041
+ }
120042
+ const args = ["hid_warmup", "--id", udid];
120043
+ if (deviceSet) args.push("--device-set", deviceSet);
120044
+ return execFileAsync17(binary, args, {
120045
+ timeout: WARMUP_TIMEOUT_MS,
120046
+ // It prints CoreSimulator noise on every failed attach attempt — ~80KB
120047
+ // against a device that never comes up. Well under Node's 1MB default, but
120048
+ // the default is the only headroom there is, so name one.
120049
+ maxBuffer: 4 * 1024 * 1024
120050
+ }).then(() => void 0).catch((err) => {
120051
+ process.stderr.write(
120052
+ `[hid-warmup ${udid.slice(0, 8)}] warm-up did not run (${errText(err)}); input may be silently dropped on this simulator.
120053
+ `
120054
+ );
120055
+ });
120056
+ }
120057
+
119958
120058
  // ../tool-server/src/utils/vega-vvd.ts
119959
120059
  init_src();
119960
120060
  init_adb();
@@ -120085,7 +120185,7 @@ async function waitForVvdRunning(timeoutMs) {
120085
120185
  }
120086
120186
 
120087
120187
  // ../tool-server/src/tools/devices/boot-electron.ts
120088
- var import_node_child_process23 = require("node:child_process");
120188
+ var import_node_child_process24 = require("node:child_process");
120089
120189
  var fs31 = __toESM(require("node:fs"));
120090
120190
  var path26 = __toESM(require("node:path"));
120091
120191
  init_src();
@@ -120281,7 +120381,7 @@ async function bootElectronApp(options) {
120281
120381
  ];
120282
120382
  let child;
120283
120383
  try {
120284
- child = (0, import_node_child_process23.spawn)(launcher.command, args, {
120384
+ child = (0, import_node_child_process24.spawn)(launcher.command, args, {
120285
120385
  detached: true,
120286
120386
  // stdout is discarded, not piped: nothing reads it, and an unread pipe
120287
120387
  // blocks the child's writes once the OS buffer fills. The
@@ -120403,7 +120503,7 @@ async function bootElectronApp(options) {
120403
120503
  }
120404
120504
 
120405
120505
  // ../tool-server/src/tools/devices/boot-device.ts
120406
- var execFileAsync17 = (0, import_node_util17.promisify)(import_node_child_process24.execFile);
120506
+ var execFileAsync18 = (0, import_node_util18.promisify)(import_node_child_process25.execFile);
120407
120507
  var zodSchema9 = external_exports.object({
120408
120508
  udid: external_exports.string().optional().describe(
120409
120509
  "iOS: simulator UDID to boot (from `list-devices`). Provide exactly one of `udid`, `avdName`, `vvdImage`, or `electronAppPath`."
@@ -120607,7 +120707,7 @@ async function bootIos(udid, registry2, force, headless) {
120607
120707
  const deviceSet = await deviceSetForUdid(udid);
120608
120708
  const prefix = simctlPrefix(deviceSet);
120609
120709
  if (force && simState === "Booted") {
120610
- await execFileAsync17("xcrun", [...prefix, "shutdown", udid]);
120710
+ await execFileAsync18("xcrun", [...prefix, "shutdown", udid]);
120611
120711
  }
120612
120712
  const needsPreBoot = simState === "Shutdown" || force && simState === "Booted";
120613
120713
  if (needsPreBoot) {
@@ -120618,13 +120718,15 @@ async function bootIos(udid, registry2, force, headless) {
120618
120718
  );
120619
120719
  });
120620
120720
  }
120621
- await execFileAsync17("xcrun", [...prefix, "boot", udid]).catch((err) => {
120721
+ const alreadyUp = simState === "Booted" && !force;
120722
+ const hidWarmUp = alreadyUp || isTvOs ? Promise.resolve() : startHidWarmUp(udid, deviceSet);
120723
+ await execFileAsync18("xcrun", [...prefix, "boot", udid]).catch((err) => {
120622
120724
  const message = err instanceof Error ? err.message : String(err);
120623
120725
  if (!message.includes("Unable to boot device in current state: Booted")) {
120624
120726
  throw err;
120625
120727
  }
120626
120728
  });
120627
- await execFileAsync17("xcrun", [...prefix, "bootstatus", udid, "-b"]);
120729
+ await execFileAsync18("xcrun", [...prefix, "bootstatus", udid, "-b"]);
120628
120730
  if (isTvOs && needsPreBoot) {
120629
120731
  await registry2.disposeService(`${TV_CONTROL_NAMESPACE}:${udid}`).catch((err) => {
120630
120732
  if (err instanceof ServiceNotFoundError) return;
@@ -120643,6 +120745,7 @@ async function bootIos(udid, registry2, force, headless) {
120643
120745
  });
120644
120746
  }
120645
120747
  await ensureAutomationEnabled(udid).catch(() => void 0);
120748
+ await hidWarmUp;
120646
120749
  const ndRef = nativeDevtoolsRef({ id: udid, platform: "ios", kind: "simulator" });
120647
120750
  const ndApi = await registry2.resolveService(ndRef.urn, ndRef.options);
120648
120751
  await ndApi.reverifyEnv().catch(() => {
@@ -120652,7 +120755,7 @@ async function bootIos(udid, registry2, force, headless) {
120652
120755
  return buildInitFailedResult(udid, initFailure);
120653
120756
  }
120654
120757
  if (!deviceSet) {
120655
- await execFileAsync17("defaults", [
120758
+ await execFileAsync18("defaults", [
120656
120759
  "write",
120657
120760
  "com.apple.iphonesimulator",
120658
120761
  "CurrentDeviceUDID",
@@ -120661,7 +120764,7 @@ async function bootIos(udid, registry2, force, headless) {
120661
120764
  });
120662
120765
  }
120663
120766
  if (!headless && !iosHeadlessFromEnv() && !deviceSet) {
120664
- await execFileAsync17("open", ["-a", "Simulator.app"]).catch(() => execFileAsync17("open", ["-b", "com.apple.dt.Devices"])).catch(() => {
120767
+ await execFileAsync18("open", ["-a", "Simulator.app"]).catch(() => execFileAsync18("open", ["-b", "com.apple.dt.Devices"])).catch(() => {
120665
120768
  });
120666
120769
  }
120667
120770
  return { platform: "ios", udid, booted: true };
@@ -120708,7 +120811,7 @@ async function attemptBoot(params) {
120708
120811
  emulatorLogFd = (0, import_node_fs12.openSync)(logPath, "w");
120709
120812
  stdio = ["ignore", emulatorLogFd, emulatorLogFd];
120710
120813
  }
120711
- const child = (0, import_node_child_process24.spawn)(params.emulatorBinary, params.emulatorArgs, {
120814
+ const child = (0, import_node_child_process25.spawn)(params.emulatorBinary, params.emulatorArgs, {
120712
120815
  detached: true,
120713
120816
  stdio
120714
120817
  });
@@ -121333,11 +121436,11 @@ var BUNDLE_ID_PATTERN = /^[A-Za-z0-9_][A-Za-z0-9._-]*$/;
121333
121436
  var BUNDLE_ID_MESSAGE = "bundleId may only contain letters, digits, '.', '_' and '-', and may not start with '-' or '.'";
121334
121437
 
121335
121438
  // ../tool-server/src/tools/launch-app/platforms/ios.ts
121336
- var import_node_child_process25 = require("node:child_process");
121337
- var import_node_util18 = require("node:util");
121439
+ var import_node_child_process26 = require("node:child_process");
121440
+ var import_node_util19 = require("node:util");
121338
121441
  init_src();
121339
121442
  init_external_devices();
121340
- var execFileAsync18 = (0, import_node_util18.promisify)(import_node_child_process25.execFile);
121443
+ var execFileAsync19 = (0, import_node_util19.promisify)(import_node_child_process26.execFile);
121341
121444
  function makeIosImpl(registry2) {
121342
121445
  return {
121343
121446
  requires: ["xcrun"],
@@ -121352,7 +121455,7 @@ function makeIosImpl(registry2) {
121352
121455
  if (blocked) return blocked;
121353
121456
  }
121354
121457
  try {
121355
- await execFileAsync18(
121458
+ await execFileAsync19(
121356
121459
  "xcrun",
121357
121460
  await simctlArgsForUdid(params.udid, ["launch", params.udid, params.bundleId])
121358
121461
  );
@@ -121644,11 +121747,11 @@ init_zod();
121644
121747
  init_device_info();
121645
121748
 
121646
121749
  // ../tool-server/src/tools/restart-app/platforms/ios.ts
121647
- var import_node_child_process26 = require("node:child_process");
121648
- var import_node_util19 = require("node:util");
121750
+ var import_node_child_process27 = require("node:child_process");
121751
+ var import_node_util20 = require("node:util");
121649
121752
  init_src();
121650
121753
  init_external_devices();
121651
- var execFileAsync19 = (0, import_node_util19.promisify)(import_node_child_process26.execFile);
121754
+ var execFileAsync20 = (0, import_node_util20.promisify)(import_node_child_process27.execFile);
121652
121755
  function makeIosImpl2(registry2) {
121653
121756
  return {
121654
121757
  requires: ["xcrun"],
@@ -121664,11 +121767,11 @@ function makeIosImpl2(registry2) {
121664
121767
  if (blocked) return blocked;
121665
121768
  }
121666
121769
  try {
121667
- await execFileAsync19("xcrun", await simctlArgsForUdid(udid, ["terminate", udid, bundleId]));
121770
+ await execFileAsync20("xcrun", await simctlArgsForUdid(udid, ["terminate", udid, bundleId]));
121668
121771
  } catch {
121669
121772
  }
121670
121773
  try {
121671
- await execFileAsync19("xcrun", await simctlArgsForUdid(udid, ["launch", udid, bundleId]));
121774
+ await execFileAsync20("xcrun", await simctlArgsForUdid(udid, ["launch", udid, bundleId]));
121672
121775
  } catch (err) {
121673
121776
  throw new FailureError(
121674
121777
  `Failed to restart iOS app ${bundleId} on ${udid}.`,
@@ -121846,11 +121949,11 @@ Returns { restarted, bundleId }. Fails if the app is not installed.`,
121846
121949
  init_zod();
121847
121950
 
121848
121951
  // ../tool-server/src/tools/reinstall-app/platforms/ios.ts
121849
- var import_node_child_process27 = require("node:child_process");
121850
- var import_node_util20 = require("node:util");
121952
+ var import_node_child_process28 = require("node:child_process");
121953
+ var import_node_util21 = require("node:util");
121851
121954
  var import_node_path15 = require("node:path");
121852
121955
  init_src();
121853
- var execFileAsync20 = (0, import_node_util20.promisify)(import_node_child_process27.execFile);
121956
+ var execFileAsync21 = (0, import_node_util21.promisify)(import_node_child_process28.execFile);
121854
121957
  var iosImpl = {
121855
121958
  requires: ["xcrun"],
121856
121959
  handler: async (_services, params) => {
@@ -121858,11 +121961,11 @@ var iosImpl = {
121858
121961
  const absolute = (0, import_node_path15.resolve)(appPath);
121859
121962
  const { nativeId, prefix } = await simctlTargetForUdid(udid);
121860
121963
  try {
121861
- await execFileAsync20("xcrun", [...prefix, "uninstall", nativeId, bundleId]);
121964
+ await execFileAsync21("xcrun", [...prefix, "uninstall", nativeId, bundleId]);
121862
121965
  } catch {
121863
121966
  }
121864
121967
  try {
121865
- await execFileAsync20("xcrun", [...prefix, "install", nativeId, absolute]);
121968
+ await execFileAsync21("xcrun", [...prefix, "install", nativeId, absolute]);
121866
121969
  } catch (err) {
121867
121970
  throw new FailureError(
121868
121971
  `Failed to install iOS app bundle on ${udid}.`,
@@ -122039,10 +122142,10 @@ var PERMISSION_NAMES = [
122039
122142
  ];
122040
122143
 
122041
122144
  // ../tool-server/src/tools/settings-permissions/platforms/ios.ts
122042
- var import_node_child_process28 = require("node:child_process");
122043
- var import_node_util21 = require("node:util");
122145
+ var import_node_child_process29 = require("node:child_process");
122146
+ var import_node_util22 = require("node:util");
122044
122147
  init_src();
122045
- var execFileAsync21 = (0, import_node_util21.promisify)(import_node_child_process28.execFile);
122148
+ var execFileAsync22 = (0, import_node_util22.promisify)(import_node_child_process29.execFile);
122046
122149
  var SIMCTL_ACTION = {
122047
122150
  grant: "grant",
122048
122151
  deny: "revoke",
@@ -122067,7 +122170,7 @@ var NON_TCC_GRANT_NEEDS_INSTALL = /* @__PURE__ */ new Set([
122067
122170
  ]);
122068
122171
  var localBackend = {
122069
122172
  async run(udid, simctlAction, service, bundleId) {
122070
- await execFileAsync21(
122173
+ await execFileAsync22(
122071
122174
  "xcrun",
122072
122175
  await simctlArgsForUdid(udid, ["privacy", udid, simctlAction, service, bundleId]),
122073
122176
  { timeout: 3e4 }
@@ -122075,7 +122178,7 @@ var localBackend = {
122075
122178
  },
122076
122179
  async isInstalled(udid, bundleId) {
122077
122180
  try {
122078
- await execFileAsync21(
122181
+ await execFileAsync22(
122079
122182
  "xcrun",
122080
122183
  await simctlArgsForUdid(udid, ["get_app_container", udid, bundleId]),
122081
122184
  { timeout: 15e3 }
@@ -122358,8 +122461,8 @@ init_zod();
122358
122461
  init_device_info();
122359
122462
 
122360
122463
  // ../tool-server/src/tools/open-url/platforms/ios.ts
122361
- var import_node_child_process29 = require("node:child_process");
122362
- var import_node_util22 = require("node:util");
122464
+ var import_node_child_process30 = require("node:child_process");
122465
+ var import_node_util23 = require("node:util");
122363
122466
  init_src();
122364
122467
 
122365
122468
  // ../tool-server/src/tools/open-url/deep-link-note.ts
@@ -122369,12 +122472,12 @@ function httpDeepLinkNote(url2) {
122369
122472
  }
122370
122473
 
122371
122474
  // ../tool-server/src/tools/open-url/platforms/ios.ts
122372
- var execFileAsync22 = (0, import_node_util22.promisify)(import_node_child_process29.execFile);
122475
+ var execFileAsync23 = (0, import_node_util23.promisify)(import_node_child_process30.execFile);
122373
122476
  var iosImpl3 = {
122374
122477
  requires: ["xcrun"],
122375
122478
  handler: async (_services, params) => {
122376
122479
  try {
122377
- await execFileAsync22(
122480
+ await execFileAsync23(
122378
122481
  "xcrun",
122379
122482
  await simctlArgsForUdid(params.udid, ["openurl", params.udid, params.url])
122380
122483
  );
@@ -122530,8 +122633,8 @@ Returns { opened, url, note? }. note carries the deep-linking caveat when a web
122530
122633
  };
122531
122634
 
122532
122635
  // ../tool-server/src/tools/screenshot/index.ts
122533
- var import_node_child_process30 = require("node:child_process");
122534
- var import_node_util23 = require("node:util");
122636
+ var import_node_child_process31 = require("node:child_process");
122637
+ var import_node_util24 = require("node:util");
122535
122638
  var os13 = __toESM(require("node:os"));
122536
122639
  var path27 = __toESM(require("node:path"));
122537
122640
  init_zod();
@@ -123103,7 +123206,7 @@ function scalePng(src, scale) {
123103
123206
 
123104
123207
  // ../tool-server/src/tools/screenshot/index.ts
123105
123208
  var fs33 = __toESM(require("node:fs/promises"));
123106
- var execFileAsync23 = (0, import_node_util23.promisify)(import_node_child_process30.execFile);
123209
+ var execFileAsync24 = (0, import_node_util24.promisify)(import_node_child_process31.execFile);
123107
123210
  var zodSchema15 = external_exports.object({
123108
123211
  udid: external_exports.string().describe(
123109
123212
  "Target device id from `list-devices` (iOS UDID, Android serial, Apple TV UDID, Vega serial, or Chromium id)."
@@ -123144,11 +123247,11 @@ async function tvScreenshot(udid, scale, signal) {
123144
123247
  os13.tmpdir(),
123145
123248
  `argent-tv-screenshot-${udid.slice(0, 8)}-${process.hrtime.bigint()}.png`
123146
123249
  );
123147
- await execFileAsync23("xcrun", await simctlArgsForUdid(udid, ["io", udid, "screenshot", file2]), {
123250
+ await execFileAsync24("xcrun", await simctlArgsForUdid(udid, ["io", udid, "screenshot", file2]), {
123148
123251
  signal
123149
123252
  });
123150
123253
  if (scale < 1) {
123151
- await execFileAsync23("sips", ["-Z", String(await tvTargetLongSide(file2, scale)), file2], {
123254
+ await execFileAsync24("sips", ["-Z", String(await tvTargetLongSide(file2, scale)), file2], {
123152
123255
  signal
123153
123256
  }).catch(() => {
123154
123257
  });
@@ -123158,7 +123261,7 @@ async function tvScreenshot(udid, scale, signal) {
123158
123261
  async function tvTargetLongSide(file2, scale) {
123159
123262
  let longSide = 3840;
123160
123263
  try {
123161
- const { stdout } = await execFileAsync23("sips", ["-g", "pixelWidth", "-g", "pixelHeight", file2]);
123264
+ const { stdout } = await execFileAsync24("sips", ["-g", "pixelWidth", "-g", "pixelHeight", file2]);
123162
123265
  const width = Number(/pixelWidth:\s*(\d+)/.exec(stdout)?.[1]);
123163
123266
  const height = Number(/pixelHeight:\s*(\d+)/.exec(stdout)?.[1]);
123164
123267
  if (Number.isFinite(width) && Number.isFinite(height) && width > 0 && height > 0) {
@@ -123172,7 +123275,7 @@ async function downscalePngInPlace(file2, scale, signal) {
123172
123275
  if (scale >= 1) {
123173
123276
  return;
123174
123277
  }
123175
- await execFileAsync23("sips", ["-Z", String(await tvTargetLongSide(file2, scale)), file2], {
123278
+ await execFileAsync24("sips", ["-Z", String(await tvTargetLongSide(file2, scale)), file2], {
123176
123279
  signal
123177
123280
  }).catch(() => {
123178
123281
  });
@@ -125163,12 +125266,12 @@ var shakeZodSchema = external_exports.object({
125163
125266
  });
125164
125267
 
125165
125268
  // ../tool-server/src/tools/shake/platforms/ios.ts
125166
- var import_node_child_process32 = require("node:child_process");
125167
- var import_node_util24 = require("node:util");
125269
+ var import_node_child_process33 = require("node:child_process");
125270
+ var import_node_util25 = require("node:util");
125168
125271
  init_src();
125169
125272
 
125170
125273
  // ../tool-server/src/utils/window-shake.ts
125171
- var import_node_child_process31 = require("node:child_process");
125274
+ var import_node_child_process32 = require("node:child_process");
125172
125275
  var MICROINTERACTIONS_FLAG = "microinteractions";
125173
125276
  var AMPLITUDE = 22;
125174
125277
  var STEPS = 60;
@@ -125274,7 +125377,7 @@ end run
125274
125377
  }
125275
125378
  function runOsascript(script) {
125276
125379
  return new Promise((resolve14, reject) => {
125277
- const child = (0, import_node_child_process31.execFile)(
125380
+ const child = (0, import_node_child_process32.execFile)(
125278
125381
  "/usr/bin/osascript",
125279
125382
  ["-"],
125280
125383
  { timeout: OSASCRIPT_TIMEOUT_MS },
@@ -125367,7 +125470,7 @@ async function prepareHostWindowShake(target) {
125367
125470
  }
125368
125471
 
125369
125472
  // ../tool-server/src/tools/shake/platforms/ios.ts
125370
- var execFileAsync24 = (0, import_node_util24.promisify)(import_node_child_process32.execFile);
125473
+ var execFileAsync25 = (0, import_node_util25.promisify)(import_node_child_process33.execFile);
125371
125474
  var SHAKE_NOTIFICATION = "com.apple.UIKit.SimulatorShake";
125372
125475
  var SHAKE_INTERVAL_MS = 400;
125373
125476
  var sleep11 = (ms) => new Promise((r) => setTimeout(r, ms));
@@ -125407,7 +125510,7 @@ var iosImpl4 = {
125407
125510
  if (i > 0) await sleep11(SHAKE_INTERVAL_MS);
125408
125511
  shaker.begin();
125409
125512
  try {
125410
- await execFileAsync24("xcrun", args, { timeout: 15e3 });
125513
+ await execFileAsync25("xcrun", args, { timeout: 15e3 });
125411
125514
  } catch (err) {
125412
125515
  const error52 = err instanceof Error ? err : new Error(String(err));
125413
125516
  throw shakeFailure(udid, error52.message, error52);
@@ -138249,8 +138352,8 @@ var import_util8 = require("util");
138249
138352
  var DEFAULT_EXEC_TIMEOUT_MS = 6e4;
138250
138353
  var DEFAULT_EXEC_MAX_BUFFER = 256 * 1024 * 1024;
138251
138354
  async function execFileAsyncWithTimeout(file2, args, options = {}) {
138252
- const execFileAsync29 = (0, import_util8.promisify)(import_child_process2.execFile);
138253
- const { stdout, stderr } = await execFileAsync29(file2, args, {
138355
+ const execFileAsync30 = (0, import_util8.promisify)(import_child_process2.execFile);
138356
+ const { stdout, stderr } = await execFileAsync30(file2, args, {
138254
138357
  encoding: "utf-8",
138255
138358
  ...options,
138256
138359
  // Applied after ...options so a caller cannot weaken the guards; maxBuffer
@@ -142275,7 +142378,7 @@ var WATERMARK_PNG_HEIGHT = 277;
142275
142378
  var WATERMARK_PNG_BASE64 = "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";
142276
142379
 
142277
142380
  // ../tool-server/src/tools/screen-recording/watermark.ts
142278
- var execFileAsync25 = (0, import_util9.promisify)(import_child_process6.execFile);
142381
+ var execFileAsync26 = (0, import_util9.promisify)(import_child_process6.execFile);
142279
142382
  var OUTPUT_FPS = 30;
142280
142383
  var FFMPEG_FALLBACK_PATHS = [
142281
142384
  "/opt/homebrew/bin/ffmpeg",
@@ -142292,7 +142395,7 @@ var MASK_DARK_MAX_LUMA = 90;
142292
142395
  var MASK_LIGHT_MIN_LUMA = 165;
142293
142396
  async function resolveBinary(name, fallbacks) {
142294
142397
  try {
142295
- await execFileAsync25("/bin/sh", ["-c", `command -v ${name}`], { timeout: 2e3 });
142398
+ await execFileAsync26("/bin/sh", ["-c", `command -v ${name}`], { timeout: 2e3 });
142296
142399
  return name;
142297
142400
  } catch {
142298
142401
  }
@@ -144992,7 +145095,7 @@ Returns { stopped } - the URNs of the services that were actually live and got s
144992
145095
 
144993
145096
  // ../tool-server/src/tools/simulator/stop-metro.ts
144994
145097
  init_zod();
144995
- var import_node_child_process33 = require("node:child_process");
145098
+ var import_node_child_process34 = require("node:child_process");
144996
145099
  function parseNetstatListeningPids(netstatOutput, port) {
144997
145100
  const pids = /* @__PURE__ */ new Set();
144998
145101
  for (const line of netstatOutput.split(/\r?\n/)) {
@@ -145008,7 +145111,7 @@ function parseNetstatListeningPids(netstatOutput, port) {
145008
145111
  }
145009
145112
  function listeningPids(port) {
145010
145113
  if (process.platform === "win32") {
145011
- const output2 = (0, import_node_child_process33.execFileSync)("netstat", ["-ano"], {
145114
+ const output2 = (0, import_node_child_process34.execFileSync)("netstat", ["-ano"], {
145012
145115
  encoding: "utf-8",
145013
145116
  timeout: 5e3,
145014
145117
  // `netstat -ano` dumps every socket on the host; overflowing Node's
@@ -145017,7 +145120,7 @@ function listeningPids(port) {
145017
145120
  });
145018
145121
  return parseNetstatListeningPids(output2, port);
145019
145122
  }
145020
- const output = (0, import_node_child_process33.execFileSync)("lsof", ["-ti", `tcp:${port}`, "-sTCP:LISTEN"], {
145123
+ const output = (0, import_node_child_process34.execFileSync)("lsof", ["-ti", `tcp:${port}`, "-sTCP:LISTEN"], {
145021
145124
  encoding: "utf-8",
145022
145125
  timeout: 5e3
145023
145126
  }).trim();
@@ -148090,10 +148193,7 @@ async function queryAndroidFullHierarchy(registry2, device) {
148090
148193
  devtools = await registry2.resolveService(ref.urn, ref.options);
148091
148194
  } catch (err) {
148092
148195
  const msg = err instanceof Error ? err.message : String(err);
148093
- throw new Error(
148094
- `the android devtools helper is unavailable (${msg}) \u2014 flows resolve testID selectors against the full hierarchy it serves; confirm the device is unlocked and the helper can be installed (\`adb install -t\`)`,
148095
- { cause: err }
148096
- );
148196
+ throw new Error(`the argent android helper is unavailable: ${msg}`, { cause: err });
148097
148197
  }
148098
148198
  const [{ xml }, size] = await Promise.all([
148099
148199
  // clearCache: await/assert polls must see text changes, not cached reads.
@@ -149684,6 +149784,10 @@ function roleOnlySelectorWarning(selector) {
149684
149784
  if (selector.text !== void 0 || selector.textMatches !== void 0) return void 0;
149685
149785
  return `selector ${describeSelector(selector)} matches by role alone (the tapped element has no id or visible text) \u2014 replay takes whichever element of that role ranks first, so re-record against a labelled element if that is not reliably this one`;
149686
149786
  }
149787
+ function innermostTreeReason(message) {
149788
+ const unwrapped = /helper is unavailable:\s*(.+)/s.exec(message)?.[1] ?? message;
149789
+ return unwrapped.replace(/^\[[^\]]+\]\s*/, "").trim();
149790
+ }
149687
149791
  async function captureTapSelector(registry2, session, udid, point) {
149688
149792
  try {
149689
149793
  const device = resolveDevice(udid);
@@ -149715,8 +149819,9 @@ async function captureTapSelector(registry2, session, udid, point) {
149715
149819
  ].filter((w) => w !== void 0);
149716
149820
  return { selector, ...warnings.length > 0 ? { warning: warnings.join("; ") } : {} };
149717
149821
  } catch (err) {
149822
+ const message = err instanceof Error ? err.message : String(err);
149718
149823
  return {
149719
- warning: `selector capture failed (${err instanceof Error ? err.message : String(err)}); kept coordinates`
149824
+ warning: `selector capture failed (${innermostTreeReason(message)}); kept coordinates`
149720
149825
  };
149721
149826
  }
149722
149827
  }
@@ -150131,7 +150236,7 @@ var import_node_url4 = require("node:url");
150131
150236
  init_src();
150132
150237
 
150133
150238
  // ../tool-server/src/tools/flows/script/flow-script-executor.ts
150134
- var import_node_child_process34 = require("node:child_process");
150239
+ var import_node_child_process35 = require("node:child_process");
150135
150240
  var fs56 = __toESM(require("node:fs"));
150136
150241
  var os17 = __toESM(require("node:os"));
150137
150242
  var path41 = __toESM(require("node:path"));
@@ -150515,7 +150620,7 @@ var FlowScriptExecutor = class {
150515
150620
  detached: process.platform !== "win32",
150516
150621
  windowsHide: process.platform === "win32"
150517
150622
  };
150518
- child = (0, import_node_child_process34.fork)(scriptPath, [], forkOptions);
150623
+ child = (0, import_node_child_process35.fork)(scriptPath, [], forkOptions);
150519
150624
  } catch (err) {
150520
150625
  return emptyResult(
150521
150626
  { kind: "spawn", message: `Could not start the script process: ${errorMessage(err)}` },
@@ -150956,7 +151061,7 @@ async function stopProcessTree(child, graceMs) {
150956
151061
  if (process.platform === "win32") {
150957
151062
  if (hasExited(child)) return;
150958
151063
  tryKill(() => {
150959
- const killer = (0, import_node_child_process34.spawn)("taskkill", ["/pid", String(pid), "/t", "/f"], {
151064
+ const killer = (0, import_node_child_process35.spawn)("taskkill", ["/pid", String(pid), "/t", "/f"], {
150960
151065
  windowsHide: true,
150961
151066
  stdio: "ignore"
150962
151067
  });
@@ -151750,7 +151855,7 @@ init_src();
151750
151855
  // ../tool-server/src/tools/screenshot-diff/screenshot-diff-ocr.ts
151751
151856
  var import_child_process8 = require("child_process");
151752
151857
  var import_util10 = require("util");
151753
- var execFileAsync26 = (0, import_util10.promisify)(import_child_process8.execFile);
151858
+ var execFileAsync27 = (0, import_util10.promisify)(import_child_process8.execFile);
151754
151859
  var OCR_TIMEOUT_MS = 1e4;
151755
151860
  var OCR_MAX_BUFFER_BYTES = 32 * 1024 * 1024;
151756
151861
  var TESSERACT_BINARY = "tesseract";
@@ -151795,7 +151900,7 @@ async function extractOcrTextBlocks(imagePath) {
151795
151900
  }
151796
151901
  }
151797
151902
  async function recognizeTsv(imagePath) {
151798
- const { stdout } = await execFileAsync26(
151903
+ const { stdout } = await execFileAsync27(
151799
151904
  TESSERACT_BINARY,
151800
151905
  [
151801
151906
  imagePath,
@@ -154020,11 +154125,11 @@ async function runSnapshot(env, opts) {
154020
154125
  }
154021
154126
 
154022
154127
  // ../tool-server/src/utils/status-bar.ts
154023
- var import_node_child_process35 = require("node:child_process");
154024
- var import_node_util25 = require("node:util");
154128
+ var import_node_child_process36 = require("node:child_process");
154129
+ var import_node_util26 = require("node:util");
154025
154130
  init_adb();
154026
154131
  init_device_info();
154027
- var execFileAsync27 = (0, import_node_util25.promisify)(import_node_child_process35.execFile);
154132
+ var execFileAsync28 = (0, import_node_util26.promisify)(import_node_child_process36.execFile);
154028
154133
  var DEMO_BROADCAST = "am broadcast -a com.android.systemui.demo";
154029
154134
  var IOS_STATUS_BAR_OVERRIDE = [
154030
154135
  "override",
@@ -154048,7 +154153,7 @@ async function pinStatusBar(device, signal) {
154048
154153
  if (isIosPhysicalDevice(device)) return false;
154049
154154
  try {
154050
154155
  if (device.platform === "ios") {
154051
- await execFileAsync27(
154156
+ await execFileAsync28(
154052
154157
  "xcrun",
154053
154158
  await simctlArgsForUdid(device.id, ["status_bar", device.id, ...IOS_STATUS_BAR_OVERRIDE])
154054
154159
  );
@@ -154084,7 +154189,7 @@ async function pinStatusBar(device, signal) {
154084
154189
  async function restoreStatusBar(device) {
154085
154190
  try {
154086
154191
  if (device.platform === "ios") {
154087
- await execFileAsync27(
154192
+ await execFileAsync28(
154088
154193
  "xcrun",
154089
154194
  await simctlArgsForUdid(device.id, ["status_bar", device.id, "clear"])
154090
154195
  );
@@ -154224,9 +154329,9 @@ async function androidDevtoolsReady(registry2, device) {
154224
154329
  try {
154225
154330
  const ref = androidDevtoolsRef(device);
154226
154331
  const api = await registry2.resolveService(ref.urn, ref.options);
154227
- return api.isReady();
154228
- } catch {
154229
- return false;
154332
+ return { ready: api.isReady() };
154333
+ } catch (err) {
154334
+ return { ready: false, reason: err instanceof Error ? err.message : String(err) };
154230
154335
  }
154231
154336
  }
154232
154337
  async function treeSourceGate(registry2, device, bundleId, signal) {
@@ -154246,9 +154351,9 @@ async function treeSourceGate(registry2, device, bundleId, signal) {
154246
154351
  }
154247
154352
  }
154248
154353
  if (device.platform === "android" && !signal?.aborted) {
154249
- const ready2 = await androidDevtoolsReady(registry2, device);
154354
+ const { ready: ready2, reason } = await androidDevtoolsReady(registry2, device);
154250
154355
  if (!ready2 && !signal?.aborted) {
154251
- return `could not reach the Android devtools helper (full-hierarchy source for testID selectors). Confirm the device is unlocked and the argent helper can be installed (\`adb install -t\`); a locked device or a blocked install is the usual cause. Re-run once resolved.`;
154356
+ return reason ? `the argent android helper is unavailable: ${reason}` : `the argent android helper is unavailable (full-hierarchy source for testID selectors).`;
154252
154357
  }
154253
154358
  }
154254
154359
  if (device.platform === "vega" && !signal?.aborted) {
@@ -155429,7 +155534,7 @@ init_zod();
155429
155534
  // ../tool-server/src/utils/workspace-reader.ts
155430
155535
  var import_promises12 = require("node:fs/promises");
155431
155536
  var import_node_path22 = require("node:path");
155432
- var import_node_child_process36 = require("node:child_process");
155537
+ var import_node_child_process37 = require("node:child_process");
155433
155538
  var import_dotenv2 = __toESM(require_main());
155434
155539
  async function exists(path50) {
155435
155540
  try {
@@ -155473,7 +155578,7 @@ async function listDir(path50) {
155473
155578
  var COMMAND_TIMEOUT_MS = 3e3;
155474
155579
  function runVersionCommand(cmd, args, cwd) {
155475
155580
  return new Promise((resolve14) => {
155476
- const child = (0, import_node_child_process36.execFile)(cmd, args, { cwd, timeout: COMMAND_TIMEOUT_MS }, (err, stdout) => {
155581
+ const child = (0, import_node_child_process37.execFile)(cmd, args, { cwd, timeout: COMMAND_TIMEOUT_MS }, (err, stdout) => {
155477
155582
  if (err) {
155478
155583
  resolve14(null);
155479
155584
  return;
@@ -155762,7 +155867,7 @@ Fails if the workspacePath is not an absolute path or the directory cannot be ac
155762
155867
  };
155763
155868
 
155764
155869
  // ../tool-server/src/tools/system/update-argent.ts
155765
- var import_node_child_process37 = require("node:child_process");
155870
+ var import_node_child_process38 = require("node:child_process");
155766
155871
  var fs63 = __toESM(require("node:fs"));
155767
155872
  var path46 = __toESM(require("node:path"));
155768
155873
  init_zod();
@@ -155897,7 +156002,7 @@ var updateArgentTool = {
155897
156002
  if (spawnRoot) updateArgs.push("--project-root", spawnRoot);
155898
156003
  const cmd = cliEntry ? process.execPath : "argent";
155899
156004
  const args = cliEntry ? [cliEntry, ...updateArgs] : updateArgs;
155900
- const child = (0, import_node_child_process37.spawn)(cmd, args, {
156005
+ const child = (0, import_node_child_process38.spawn)(cmd, args, {
155901
156006
  detached: true,
155902
156007
  stdio: "ignore",
155903
156008
  env: { ...process.env, ARGENT_UPDATE_TRIGGER: "mcp_update" }
@@ -156899,13 +157004,13 @@ function probeArgentToolServer(host, port, timeoutMs = 500) {
156899
157004
 
156900
157005
  // ../tool-server/src/utils/simulator-watcher.ts
156901
157006
  var fs65 = __toESM(require("node:fs"));
156902
- var import_node_child_process38 = require("node:child_process");
156903
- var import_node_util26 = require("node:util");
157007
+ var import_node_child_process39 = require("node:child_process");
157008
+ var import_node_util27 = require("node:util");
156904
157009
  init_external_devices();
156905
- var execFileAsync28 = (0, import_node_util26.promisify)(import_node_child_process38.execFile);
157010
+ var execFileAsync29 = (0, import_node_util27.promisify)(import_node_child_process39.execFile);
156906
157011
  var POLL_INTERVAL_MS2 = 1e4;
156907
157012
  async function getBootedUdidsInSet(deviceSet) {
156908
- const { stdout } = await execFileAsync28("xcrun", [
157013
+ const { stdout } = await execFileAsync29("xcrun", [
156909
157014
  ...simctlPrefix(deviceSet),
156910
157015
  "list",
156911
157016
  "devices",
@@ -157024,7 +157129,7 @@ function startSimulatorWatcher(registry2) {
157024
157129
  }
157025
157130
 
157026
157131
  // ../tool-server/src/utils/preview-window.ts
157027
- var import_node_child_process39 = require("node:child_process");
157132
+ var import_node_child_process40 = require("node:child_process");
157028
157133
  var fs66 = __toESM(require("node:fs"));
157029
157134
  var os20 = __toESM(require("node:os"));
157030
157135
  var path48 = __toESM(require("node:path"));
@@ -157056,10 +157161,10 @@ function ensureLensAppBundle(electronBin) {
157056
157161
  fs66.copyFileSync(path48.join(realContents, "Info.plist"), plist);
157057
157162
  const setPlist = (entry, value) => {
157058
157163
  try {
157059
- (0, import_node_child_process39.execFileSync)("/usr/libexec/PlistBuddy", ["-c", `Set :${entry} ${value}`, plist]);
157164
+ (0, import_node_child_process40.execFileSync)("/usr/libexec/PlistBuddy", ["-c", `Set :${entry} ${value}`, plist]);
157060
157165
  } catch {
157061
157166
  try {
157062
- (0, import_node_child_process39.execFileSync)("/usr/libexec/PlistBuddy", ["-c", `Add :${entry} string ${value}`, plist]);
157167
+ (0, import_node_child_process40.execFileSync)("/usr/libexec/PlistBuddy", ["-c", `Add :${entry} string ${value}`, plist]);
157063
157168
  } catch {
157064
157169
  }
157065
157170
  }
@@ -157118,7 +157223,7 @@ function createPreviewWindowManager(opts = {}) {
157118
157223
  const wrapperBin = ensureLensAppBundle(electronBin);
157119
157224
  const launchBin = wrapperBin ?? electronBin;
157120
157225
  const launchArgs = wrapperBin ? ["--no-sandbox", mainScript] : [mainScript];
157121
- const next = (0, import_node_child_process39.spawn)(launchBin, launchArgs, {
157226
+ const next = (0, import_node_child_process40.spawn)(launchBin, launchArgs, {
157122
157227
  // Strips ELECTRON_RUN_AS_NODE, which an Electron-based MCP host leaves in
157123
157228
  // our env, so the child boots as a GUI app instead of bare Node.
157124
157229
  env: electronGuiChildEnv({ ARGENT_PREVIEW_URL: url2 }),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@swmansion/argent",
3
- "version": "0.25.1-next.34",
3
+ "version": "0.25.1-next.36",
4
4
  "mcpName": "io.github.software-mansion/argent",
5
5
  "description": "MCP server for iOS Simulator and Android Emulator control",
6
6
  "license": "Apache-2.0",
@@ -74,11 +74,11 @@ A normally injectable app that is broken in the environment gets the same coordi
74
74
 
75
75
  While the required source is down, selector failures and raw-point capture are void. Restore the source and re-record affected taps.
76
76
 
77
- | Platform | Symptom | Recovery |
78
- | -------- | -------------------------------- | ------------------------------------------------------ |
79
- | Android | Cannot reach the devtools helper | Unlock the device, allow `adb install -t`, and rerun |
80
- | Chromium | No reachable CDP session | Boot again with `electronAppPath` and remote debugging |
81
- | Vega | Toolkit returns no page source | Relaunch an app built with automation support |
77
+ | Platform | Symptom | Recovery |
78
+ | -------- | -------------------------------------- | -------------------------------------------------------------------------------- |
79
+ | Android | Cannot reach the argent android helper | Argent reinstalls it once; if it persists, read the device's reason in the error |
80
+ | Chromium | No reachable CDP session | Boot again with `electronAppPath` and remote debugging |
81
+ | Vega | Toolkit returns no page source | Relaunch an app built with automation support |
82
82
 
83
83
  On Android, healthy `describe` output does not prove the flow tree is available. It can fall back to legacy `uiautomator`, while the runner refuses that trimmed fallback.
84
84