@swmansion/argent 0.30.2-next.19 → 0.30.2-next.20

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
@@ -35594,7 +35594,7 @@ var _CI_VENDOR_COUNT_FOR_TEST = vendors_default.length;
35594
35594
  var SESSION_ID2 = randomUUID5();
35595
35595
  function readCliVersion() {
35596
35596
  if (true) {
35597
- return "0.30.2-next.19";
35597
+ return "0.30.2-next.20";
35598
35598
  }
35599
35599
  return "0.0.0";
35600
35600
  }
@@ -16900,7 +16900,7 @@ var _CI_VENDOR_COUNT_FOR_TEST = vendors_default.length;
16900
16900
  var SESSION_ID = randomUUID4();
16901
16901
  function readCliVersion() {
16902
16902
  if (true) {
16903
- return "0.30.2-next.19";
16903
+ return "0.30.2-next.20";
16904
16904
  }
16905
16905
  return "0.0.0";
16906
16906
  }
@@ -28531,6 +28531,7 @@ var AUTO_SCREENSHOT_DELAY_MS_BY_TOOL = {
28531
28531
  "await-ui-element": 1500
28532
28532
  };
28533
28533
  var DEFAULT_DELAY_MS = 1400;
28534
+ var CAPTURE_TIMEOUT_MS = 15e3;
28534
28535
  function autoScreenshotEnabled(options) {
28535
28536
  return !isFlagEnabled("disable-auto-screenshot", options);
28536
28537
  }
@@ -28648,22 +28649,50 @@ async function fetchWithReconnect(getUrl, reconnect, config2) {
28648
28649
  for (let attempt = 0; attempt <= maxRetries; attempt++) {
28649
28650
  const controller = new AbortController();
28650
28651
  const timer = fetchTimeoutMs !== null ? setTimeout(() => controller.abort(), fetchTimeoutMs) : void 0;
28652
+ let callerSignal;
28651
28653
  try {
28652
28654
  const attemptInit = typeof init === "function" ? init() : init;
28653
- return await fetch(getUrl(), { ...attemptInit, signal: controller.signal });
28655
+ callerSignal = attemptInit?.signal;
28656
+ const signal = callerSignal ? AbortSignal.any([controller.signal, callerSignal]) : controller.signal;
28657
+ return await fetch(getUrl(), { ...attemptInit, signal });
28654
28658
  } catch (err) {
28655
28659
  lastError = err;
28656
- if (attempt === maxRetries) break;
28657
- if (attempt === 0) {
28658
- await reconnect();
28660
+ if (callerSignal?.aborted || attempt === maxRetries) break;
28661
+ const pause = (async () => {
28662
+ if (attempt === 0) {
28663
+ await reconnect();
28664
+ }
28665
+ await new Promise((r) => setTimeout(r, expBackoffBase * Math.pow(2, attempt)));
28666
+ })();
28667
+ await untilAborted(pause, callerSignal);
28668
+ if (callerSignal?.aborted) {
28669
+ lastError = callerSignal.reason;
28670
+ break;
28659
28671
  }
28660
- await new Promise((r) => setTimeout(r, expBackoffBase * Math.pow(2, attempt)));
28661
28672
  } finally {
28662
28673
  clearTimeout(timer);
28663
28674
  }
28664
28675
  }
28665
28676
  throw lastError;
28666
28677
  }
28678
+ async function untilAborted(work, signal) {
28679
+ if (!signal) {
28680
+ await work;
28681
+ return;
28682
+ }
28683
+ let onAbort = () => {
28684
+ };
28685
+ const aborted2 = new Promise((resolve10) => {
28686
+ onAbort = resolve10;
28687
+ if (signal.aborted) resolve10();
28688
+ else signal.addEventListener("abort", onAbort, { once: true });
28689
+ });
28690
+ try {
28691
+ await Promise.race([work, aborted2]);
28692
+ } finally {
28693
+ signal.removeEventListener("abort", onAbort);
28694
+ }
28695
+ }
28667
28696
  function parseUrl(url) {
28668
28697
  let parsed;
28669
28698
  try {
@@ -28708,8 +28737,8 @@ function createToolCaller(deps) {
28708
28737
  });
28709
28738
  return {
28710
28739
  fetchTools: client.fetchTools,
28711
- async callTool(name, args) {
28712
- const { data, note, outputHint, profiling } = await client.callTool(name, args);
28740
+ async callTool(name, args, opts) {
28741
+ const { data, note, outputHint, profiling } = await client.callTool(name, args, opts);
28713
28742
  return { result: data, outputHint, note, ...profiling ? { profiling } : {} };
28714
28743
  }
28715
28744
  };
@@ -28724,6 +28753,7 @@ async function startMcpServer(options) {
28724
28753
  }
28725
28754
  const autoScreenshotOn = autoScreenshotEnabled();
28726
28755
  const autoDescribeOn = autoDescribeEnabled();
28756
+ const captureTimeoutMs = options.captureTimeoutMs ?? CAPTURE_TIMEOUT_MS;
28727
28757
  let TOOLS_URL;
28728
28758
  let AUTH_TOKEN;
28729
28759
  const resolved = await getResolvedToolsUrl();
@@ -28786,8 +28816,14 @@ async function startMcpServer(options) {
28786
28816
  async function awaitScreenSettled(udid, toolName) {
28787
28817
  const maxWaitMs = getAutoScreenshotDelayMs(toolName);
28788
28818
  if (maxWaitMs === 0) return true;
28819
+ const started = Date.now();
28789
28820
  try {
28790
- const idle = await callTool("await-screen-idle", { udid, timeoutMs: maxWaitMs });
28821
+ const idle = await callTool(
28822
+ "await-screen-idle",
28823
+ { udid, timeoutMs: maxWaitMs },
28824
+ // The tool bounds its poll to maxWaitMs; the rest covers its setup.
28825
+ { signal: AbortSignal.timeout(maxWaitMs + captureTimeoutMs) }
28826
+ );
28791
28827
  await spyLog({
28792
28828
  ts: (/* @__PURE__ */ new Date()).toISOString(),
28793
28829
  event: "auto_screenshot_readiness",
@@ -28797,13 +28833,13 @@ async function startMcpServer(options) {
28797
28833
  });
28798
28834
  return idle.result?.settled === true;
28799
28835
  } catch {
28800
- await new Promise((r) => setTimeout(r, maxWaitMs));
28836
+ await new Promise((r) => setTimeout(r, Math.max(0, maxWaitMs - (Date.now() - started))));
28801
28837
  return false;
28802
28838
  }
28803
28839
  }
28804
- async function captureScreenshotBlocks(udid) {
28840
+ async function captureScreenshotBlocks(udid, signal) {
28805
28841
  try {
28806
- const { result } = await callTool("screenshot", { udid });
28842
+ const { result } = await callTool("screenshot", { udid }, { signal });
28807
28843
  const blocks = await toMcpContent(result, "image", {
28808
28844
  toolsUrl: TOOLS_URL,
28809
28845
  authToken: AUTH_TOKEN,
@@ -28815,10 +28851,10 @@ async function startMcpServer(options) {
28815
28851
  return [];
28816
28852
  }
28817
28853
  }
28818
- async function captureTreeBlocks(udid, toolName) {
28854
+ async function captureTreeBlocks(udid, toolName, signal) {
28819
28855
  const t1 = Date.now();
28820
28856
  try {
28821
- const d = await callTool("describe", { udid });
28857
+ const d = await callTool("describe", { udid }, { signal });
28822
28858
  const desc = d.result?.description;
28823
28859
  await spyLog({
28824
28860
  ts: (/* @__PURE__ */ new Date()).toISOString(),
@@ -28914,9 +28950,10 @@ ${desc}` }];
28914
28950
  }
28915
28951
  } else if (udid && (wantScreenshot || wantTree)) {
28916
28952
  const screenSettled = await awaitScreenSettled(udid, params.name);
28917
- const screenshot = wantScreenshot ? captureScreenshotBlocks(udid) : Promise.resolve([]);
28953
+ const signal = AbortSignal.timeout(captureTimeoutMs);
28954
+ const screenshot = wantScreenshot ? captureScreenshotBlocks(udid, signal) : Promise.resolve([]);
28918
28955
  if (!screenSettled) await screenshot;
28919
- const tree = wantTree ? captureTreeBlocks(udid, params.name) : Promise.resolve([]);
28956
+ const tree = wantTree ? captureTreeBlocks(udid, params.name, signal) : Promise.resolve([]);
28920
28957
  content = [...content, ...await screenshot, ...await tree];
28921
28958
  }
28922
28959
  if (note) {
@@ -100945,7 +100945,7 @@ var _CI_VENDOR_COUNT_FOR_TEST = vendors_default.length;
100945
100945
  var SESSION_ID = (0, import_node_crypto3.randomUUID)();
100946
100946
  function readCliVersion() {
100947
100947
  if (true) {
100948
- return "0.30.2-next.19";
100948
+ return "0.30.2-next.20";
100949
100949
  }
100950
100950
  return "0.0.0";
100951
100951
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@swmansion/argent",
3
- "version": "0.30.2-next.19",
3
+ "version": "0.30.2-next.20",
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",