@swmansion/argent 0.29.1-next.22 → 0.29.1-next.24

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.
Binary file
Binary file
Binary file
Binary file
package/dist/cli-cmds.mjs CHANGED
@@ -35549,7 +35549,7 @@ var _CI_VENDOR_COUNT_FOR_TEST = vendors_default.length;
35549
35549
  var SESSION_ID2 = randomUUID5();
35550
35550
  function readCliVersion() {
35551
35551
  if (true) {
35552
- return "0.29.1-next.22";
35552
+ return "0.29.1-next.24";
35553
35553
  }
35554
35554
  return "0.0.0";
35555
35555
  }
@@ -16875,7 +16875,7 @@ var _CI_VENDOR_COUNT_FOR_TEST = vendors_default.length;
16875
16875
  var SESSION_ID = randomUUID4();
16876
16876
  function readCliVersion() {
16877
16877
  if (true) {
16878
- return "0.29.1-next.22";
16878
+ return "0.29.1-next.24";
16879
16879
  }
16880
16880
  return "0.0.0";
16881
16881
  }
@@ -100766,7 +100766,7 @@ var _CI_VENDOR_COUNT_FOR_TEST = vendors_default.length;
100766
100766
  var SESSION_ID = (0, import_node_crypto3.randomUUID)();
100767
100767
  function readCliVersion() {
100768
100768
  if (true) {
100769
- return "0.29.1-next.22";
100769
+ return "0.29.1-next.24";
100770
100770
  }
100771
100771
  return "0.0.0";
100772
100772
  }
@@ -128117,6 +128117,7 @@ function androidDevtoolsRef(device) {
128117
128117
  }
128118
128118
  var READY_TIMEOUT_MS2 = 3e4;
128119
128119
  var EXIT_GRACE_MS = 200;
128120
+ var HELPER_EXIT_TIMEOUT_MS = 3e3;
128120
128121
  var HELPER_PORT_MARKER = /^INSTRUMENTATION_STATUS:\s*port=(\d+)/;
128121
128122
  var ADB_FORWARD_PORT_MARKER = /^(\d+)\s*$/;
128122
128123
  var HELPER_STATUS_MARKER = /^INSTRUMENTATION_STATUS:\s*Error=/;
@@ -128358,13 +128359,38 @@ var androidDevtoolsBlueprint = {
128358
128359
  const spawned = await spawnHelperWithRepair(serial);
128359
128360
  let ready2 = false;
128360
128361
  let disposed = false;
128362
+ let procExited = false;
128363
+ spawned.proc.once("exit", () => {
128364
+ procExited = true;
128365
+ });
128366
+ let generation = 0;
128367
+ let activeGeneration = 0;
128368
+ let socketLost = false;
128369
+ let clientClosed = false;
128370
+ let reconnecting = null;
128371
+ const onClientClosed = (gen, err) => {
128372
+ if (gen !== activeGeneration) return;
128373
+ clientClosed = true;
128374
+ if (disposed) return;
128375
+ if (!procExited && getFailureSignal(err)?.error_code === FAILURE_CODES.ANDROID_DEVTOOLS_SOCKET_CLOSED) {
128376
+ socketLost = true;
128377
+ return;
128378
+ }
128379
+ events.emit("terminated", err);
128380
+ };
128381
+ const openClient = async () => {
128382
+ const gen = ++generation;
128383
+ const opened = await connectAndroidDevtoolsClient(
128384
+ spawned.localPort,
128385
+ (err) => onClientClosed(gen, err)
128386
+ );
128387
+ return { client: opened, gen };
128388
+ };
128361
128389
  let client2;
128362
128390
  try {
128363
- client2 = await connectAndroidDevtoolsClient(spawned.localPort, (err) => {
128364
- if (!disposed) {
128365
- events.emit("terminated", err);
128366
- }
128367
- });
128391
+ const opened = await openClient();
128392
+ client2 = opened.client;
128393
+ activeGeneration = opened.gen;
128368
128394
  } catch (err) {
128369
128395
  try {
128370
128396
  spawned.proc.kill();
@@ -128404,10 +128430,60 @@ var androidDevtoolsBlueprint = {
128404
128430
  spawned.proc.on("error", (err) => {
128405
128431
  if (!disposed) events.emit("terminated", err);
128406
128432
  });
128433
+ const reconnect = async () => {
128434
+ let opened;
128435
+ try {
128436
+ opened = await openClient();
128437
+ await opened.client.request("ping");
128438
+ } catch (err) {
128439
+ opened?.client.close();
128440
+ if (!disposed) events.emit("terminated", err instanceof Error ? err : void 0);
128441
+ throw err;
128442
+ }
128443
+ if (disposed) {
128444
+ opened.client.close();
128445
+ throw new FailureError("AndroidDevtools client closed", {
128446
+ error_code: FAILURE_CODES.ANDROID_DEVTOOLS_RPC_CLIENT_CLOSED,
128447
+ failure_stage: "android_devtools_rpc_reconnect",
128448
+ failure_area: "tool_server",
128449
+ error_kind: "subprocess"
128450
+ });
128451
+ }
128452
+ client2 = opened.client;
128453
+ activeGeneration = opened.gen;
128454
+ socketLost = false;
128455
+ clientClosed = false;
128456
+ return client2;
128457
+ };
128458
+ const waitForHelperExit = (timeoutMs) => new Promise((resolve16) => {
128459
+ if (procExited) return resolve16();
128460
+ const timer = setTimeout(resolve16, timeoutMs);
128461
+ spawned.proc.once("exit", () => {
128462
+ clearTimeout(timer);
128463
+ resolve16();
128464
+ });
128465
+ });
128466
+ const request3 = async (method, params) => {
128467
+ let current = client2;
128468
+ if (socketLost && !disposed && !procExited) {
128469
+ reconnecting ??= reconnect().finally(() => {
128470
+ reconnecting = null;
128471
+ });
128472
+ current = await reconnecting;
128473
+ }
128474
+ try {
128475
+ return await current.request(method, params);
128476
+ } catch (err) {
128477
+ if (!disposed && getFailureSignal(err)?.error_code === FAILURE_CODES.ANDROID_DEVTOOLS_RPC_ERROR && err instanceof Error && err.message.includes("UiAutomation not connected")) {
128478
+ events.emit("terminated", err);
128479
+ }
128480
+ throw err;
128481
+ }
128482
+ };
128407
128483
  const api = {
128408
128484
  isReady: () => ready2 && !disposed,
128409
128485
  getHierarchy(getOpts = {}) {
128410
- return client2.request("getHierarchy", {
128486
+ return request3("getHierarchy", {
128411
128487
  waitForIdleMs: getOpts.waitForIdleMs ?? 500,
128412
128488
  maxDepth: getOpts.maxDepth ?? 128,
128413
128489
  maxNodes: getOpts.maxNodes ?? 5e3,
@@ -128415,15 +128491,15 @@ var androidDevtoolsBlueprint = {
128415
128491
  });
128416
128492
  },
128417
128493
  getScreenSize() {
128418
- return client2.request("getScreenSize");
128494
+ return request3("getScreenSize");
128419
128495
  },
128420
128496
  ping() {
128421
- return client2.request("ping");
128497
+ return request3("ping");
128422
128498
  },
128423
128499
  async setText(text, setOpts = {}) {
128424
128500
  let result;
128425
128501
  try {
128426
- result = await client2.request("setText", {
128502
+ result = await request3("setText", {
128427
128503
  text,
128428
128504
  ...setOpts.check ? { check: true } : {}
128429
128505
  });
@@ -128455,19 +128531,41 @@ var androidDevtoolsBlueprint = {
128455
128531
  dispose: async () => {
128456
128532
  disposed = true;
128457
128533
  ready2 = false;
128458
- try {
128459
- await Promise.race([
128460
- client2.request("shutdown"),
128461
- new Promise(
128462
- (_, reject) => setTimeout(() => reject(new Error("shutdown timeout")), 1e3)
128463
- )
128464
- ]);
128465
- } catch {
128534
+ let opening;
128535
+ let acknowledged = false;
128536
+ if (!procExited) {
128537
+ let timer;
128538
+ try {
128539
+ await Promise.race([
128540
+ (async () => {
128541
+ let target = client2;
128542
+ if (clientClosed) {
128543
+ opening = openClient();
128544
+ target = (await opening).client;
128545
+ }
128546
+ await target.request("shutdown");
128547
+ })(),
128548
+ new Promise((_, reject) => {
128549
+ timer = setTimeout(() => reject(new Error("shutdown timeout")), 1e3);
128550
+ })
128551
+ ]);
128552
+ acknowledged = true;
128553
+ } catch {
128554
+ } finally {
128555
+ clearTimeout(timer);
128556
+ }
128466
128557
  }
128558
+ if (acknowledged) await waitForHelperExit(HELPER_EXIT_TIMEOUT_MS);
128559
+ void opening?.then(
128560
+ (opened) => opened.client.close(),
128561
+ () => void 0
128562
+ );
128467
128563
  client2.close();
128468
- try {
128469
- spawned.proc.kill();
128470
- } catch {
128564
+ if (!procExited) {
128565
+ try {
128566
+ spawned.proc.kill();
128567
+ } catch {
128568
+ }
128471
128569
  }
128472
128570
  await removeAdbForward(serial, spawned.localPort);
128473
128571
  },
@@ -134819,7 +134917,7 @@ var NETWORK_INTERCEPTOR_SCRIPT = `(function() {
134819
134917
  if (outcome === 'error') {
134820
134918
  var text = '';
134821
134919
  try { if (xhr.responseType === '' || xhr.responseType === 'text') text = xhr.responseText; } catch (e) {}
134822
- return fail(rec, text ? String(text) : 'Network error');
134920
+ return fail(rec, text ? String(text) : 'Network request failed');
134823
134921
  }
134824
134922
  // RN sets responseURL only after it announces HEADERS_RECEIVED: this is the final URL.
134825
134923
  if (rec.entry.response && xhr.responseURL) rec.entry.response.url = xhr.responseURL;
@@ -142414,18 +142512,19 @@ function parseDeviceStates(stdout) {
142414
142512
  function parseSnapshot(stdout) {
142415
142513
  const screenOn = !/mScreenOnFully=false/.test(stdout);
142416
142514
  const wakefulness = /mWakefulness=([A-Za-z]+)/.exec(stdout)?.[1];
142515
+ const keyguard = /isKeyguardShowing=([a-z]+)/.exec(stdout)?.[1];
142417
142516
  return {
142418
142517
  state: /^\s*(\d+)\s*$/m.exec(stdout)?.[1],
142419
142518
  screenOn,
142420
142519
  awake: wakefulness ? !/^(Asleep|Dozing)$/.test(wakefulness) : screenOn,
142421
- keyguard: /isKeyguardShowing=true/.test(stdout)
142520
+ keyguard: keyguard === void 0 ? void 0 : keyguard === "true"
142422
142521
  };
142423
142522
  }
142424
142523
  async function readSnapshot(serial) {
142425
142524
  return parseSnapshot(
142426
142525
  await shell(
142427
142526
  serial,
142428
- "cmd device_state print-state; dumpsys window displays | grep -o 'mScreenOnFully=[a-z]*'; dumpsys power | grep -o 'mWakefulness=[A-Za-z]*'; dumpsys window | grep -o 'isKeyguardShowing=[a-z]*'"
142527
+ "cmd device_state print-state; dumpsys window displays | grep -o 'mScreenOnFully=[a-z]*'; dumpsys power | grep -o 'mWakefulness=[A-Za-z]*'; dumpsys window | grep -o 'isKeyguardShowing=[a-z]*'; true"
142429
142528
  )
142430
142529
  );
142431
142530
  }
@@ -142461,12 +142560,16 @@ async function dismissFoldLockScreen(serial, signal) {
142461
142560
  let lastAttempt = -Infinity;
142462
142561
  const deadline = Date.now() + DISMISS_TIMEOUT_MS;
142463
142562
  for (; ; ) {
142464
- if (!(await readSnapshot(serial)).keyguard) {
142563
+ const { keyguard } = await readSnapshot(serial);
142564
+ if (keyguard === false) {
142465
142565
  if (++clear >= STABLE_READS) return void 0;
142466
142566
  } else {
142467
142567
  clear = 0;
142468
- if (Date.now() >= deadline) break;
142469
- if (attempts < MAX_DISMISS_ATTEMPTS && Date.now() - lastAttempt >= DISMISS_SPACING_MS) {
142568
+ if (Date.now() >= deadline) {
142569
+ if (keyguard) break;
142570
+ return void 0;
142571
+ }
142572
+ if (keyguard && attempts < MAX_DISMISS_ATTEMPTS && Date.now() - lastAttempt >= DISMISS_SPACING_MS) {
142470
142573
  attempts++;
142471
142574
  lastAttempt = Date.now();
142472
142575
  await shell(serial, "wm dismiss-keyguard");
@@ -142542,9 +142645,15 @@ async function fold(serial, params, device, signal) {
142542
142645
  const stateName = last?.state !== void 0 ? byId.get(last.state) ?? last.state : "unknown";
142543
142646
  const darkAwake = last?.state !== void 0 && last.awake && !last.screenOn;
142544
142647
  const budget = `${SETTLE_TIMEOUT_MS2 / 1e3} s`;
142648
+ let lockScreen = last?.keyguard ?? false;
142649
+ let lockScreenWarning;
142650
+ if (stateName === "CLOSED" && !before.keyguard && last?.awake) {
142651
+ lockScreen = false;
142652
+ lockScreenWarning = await dismissFoldLockScreen(serial, signal);
142653
+ }
142545
142654
  if (!settled && expected !== void 0) {
142546
142655
  throw failed(
142547
- last?.state === expected ? `${serial} reached device state ${stateName} for the ${params.posture} posture, but the device is awake and the screen did not stay on within ${budget}. Take a screenshot before the next action.` : `${serial} did not reach the ${params.posture} posture: the guest still reports device state ${stateName}. Fold again; a screenshot shows what the device renders.`,
142656
+ last?.state === expected ? `${serial} reached device state ${stateName} for the ${params.posture} posture, but the device is awake and the screen did not stay on within ${budget}. Take a screenshot before the next action.` + (lockScreenWarning ? ` ${lockScreenWarning}` : "") : `${serial} did not reach the ${params.posture} posture: the guest still reports device state ${stateName}. Fold again; a screenshot shows what the device renders.`,
142548
142657
  "android_fold_unverified"
142549
142658
  );
142550
142659
  }
@@ -142558,12 +142667,7 @@ async function fold(serial, params, device, signal) {
142558
142667
  `The screen did not hold steady within ${budget}. Take a screenshot before the next action.`
142559
142668
  );
142560
142669
  }
142561
- let lockScreen = last?.keyguard ?? false;
142562
- if (stateName === "CLOSED" && !before.keyguard && last?.awake) {
142563
- lockScreen = false;
142564
- const warning = await dismissFoldLockScreen(serial, signal);
142565
- if (warning) warnings.push(warning);
142566
- }
142670
+ if (lockScreenWarning) warnings.push(lockScreenWarning);
142567
142671
  const screenOff = settled && last !== void 0 && !last.screenOn;
142568
142672
  if (screenOff && lockScreen) {
142569
142673
  warnings.push(
Binary file
Binary file
Binary file
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@swmansion/argent",
3
- "version": "0.29.1-next.22",
3
+ "version": "0.29.1-next.24",
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",