@swmansion/argent 0.14.1-next.2 → 0.14.1-next.21

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.
@@ -1,4 +1,4 @@
1
- import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);
1
+ import { createRequire as __createRequire } from 'node:module'; import { fileURLToPath as __fileURLToPath } from 'node:url'; import { dirname as __pathDirname } from 'node:path'; const require = __createRequire(import.meta.url); const __filename = __fileURLToPath(import.meta.url); const __dirname = __pathDirname(__filename);
2
2
  var __create = Object.create;
3
3
  var __defProp = Object.defineProperty;
4
4
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
@@ -2984,7 +2984,7 @@ var require_compile = __commonJS({
2984
2984
  const schOrFunc = root.refs[ref];
2985
2985
  if (schOrFunc)
2986
2986
  return schOrFunc;
2987
- let _sch = resolve3.call(this, root, ref);
2987
+ let _sch = resolve4.call(this, root, ref);
2988
2988
  if (_sch === void 0) {
2989
2989
  const schema = (_a3 = root.localRefs) === null || _a3 === void 0 ? void 0 : _a3[ref];
2990
2990
  const { schemaId } = this.opts;
@@ -3011,7 +3011,7 @@ var require_compile = __commonJS({
3011
3011
  function sameSchemaEnv(s1, s2) {
3012
3012
  return s1.schema === s2.schema && s1.root === s2.root && s1.baseId === s2.baseId;
3013
3013
  }
3014
- function resolve3(root, ref) {
3014
+ function resolve4(root, ref) {
3015
3015
  let sch;
3016
3016
  while (typeof (sch = this.refs[ref]) == "string")
3017
3017
  ref = sch;
@@ -3229,8 +3229,8 @@ var require_utils = __commonJS({
3229
3229
  }
3230
3230
  return ind;
3231
3231
  }
3232
- function removeDotSegments(path10) {
3233
- let input = path10;
3232
+ function removeDotSegments(path11) {
3233
+ let input = path11;
3234
3234
  const output = [];
3235
3235
  let nextSlash = -1;
3236
3236
  let len = 0;
@@ -3482,8 +3482,8 @@ var require_schemes = __commonJS({
3482
3482
  wsComponent.secure = void 0;
3483
3483
  }
3484
3484
  if (wsComponent.resourceName) {
3485
- const [path10, query] = wsComponent.resourceName.split("?");
3486
- wsComponent.path = path10 && path10 !== "/" ? path10 : void 0;
3485
+ const [path11, query] = wsComponent.resourceName.split("?");
3486
+ wsComponent.path = path11 && path11 !== "/" ? path11 : void 0;
3487
3487
  wsComponent.query = query;
3488
3488
  wsComponent.resourceName = void 0;
3489
3489
  }
@@ -3642,55 +3642,55 @@ var require_fast_uri = __commonJS({
3642
3642
  }
3643
3643
  return uri;
3644
3644
  }
3645
- function resolve3(baseURI, relativeURI, options) {
3645
+ function resolve4(baseURI, relativeURI, options) {
3646
3646
  const schemelessOptions = options ? Object.assign({ scheme: "null" }, options) : { scheme: "null" };
3647
3647
  const resolved = resolveComponent(parse3(baseURI, schemelessOptions), parse3(relativeURI, schemelessOptions), schemelessOptions, true);
3648
3648
  schemelessOptions.skipEscape = true;
3649
3649
  return serialize(resolved, schemelessOptions);
3650
3650
  }
3651
- function resolveComponent(base, relative, options, skipNormalization) {
3651
+ function resolveComponent(base, relative2, options, skipNormalization) {
3652
3652
  const target = {};
3653
3653
  if (!skipNormalization) {
3654
3654
  base = parse3(serialize(base, options), options);
3655
- relative = parse3(serialize(relative, options), options);
3655
+ relative2 = parse3(serialize(relative2, options), options);
3656
3656
  }
3657
3657
  options = options || {};
3658
- if (!options.tolerant && relative.scheme) {
3659
- target.scheme = relative.scheme;
3660
- target.userinfo = relative.userinfo;
3661
- target.host = relative.host;
3662
- target.port = relative.port;
3663
- target.path = removeDotSegments(relative.path || "");
3664
- target.query = relative.query;
3658
+ if (!options.tolerant && relative2.scheme) {
3659
+ target.scheme = relative2.scheme;
3660
+ target.userinfo = relative2.userinfo;
3661
+ target.host = relative2.host;
3662
+ target.port = relative2.port;
3663
+ target.path = removeDotSegments(relative2.path || "");
3664
+ target.query = relative2.query;
3665
3665
  } else {
3666
- if (relative.userinfo !== void 0 || relative.host !== void 0 || relative.port !== void 0) {
3667
- target.userinfo = relative.userinfo;
3668
- target.host = relative.host;
3669
- target.port = relative.port;
3670
- target.path = removeDotSegments(relative.path || "");
3671
- target.query = relative.query;
3666
+ if (relative2.userinfo !== void 0 || relative2.host !== void 0 || relative2.port !== void 0) {
3667
+ target.userinfo = relative2.userinfo;
3668
+ target.host = relative2.host;
3669
+ target.port = relative2.port;
3670
+ target.path = removeDotSegments(relative2.path || "");
3671
+ target.query = relative2.query;
3672
3672
  } else {
3673
- if (!relative.path) {
3673
+ if (!relative2.path) {
3674
3674
  target.path = base.path;
3675
- if (relative.query !== void 0) {
3676
- target.query = relative.query;
3675
+ if (relative2.query !== void 0) {
3676
+ target.query = relative2.query;
3677
3677
  } else {
3678
3678
  target.query = base.query;
3679
3679
  }
3680
3680
  } else {
3681
- if (relative.path[0] === "/") {
3682
- target.path = removeDotSegments(relative.path);
3681
+ if (relative2.path[0] === "/") {
3682
+ target.path = removeDotSegments(relative2.path);
3683
3683
  } else {
3684
3684
  if ((base.userinfo !== void 0 || base.host !== void 0 || base.port !== void 0) && !base.path) {
3685
- target.path = "/" + relative.path;
3685
+ target.path = "/" + relative2.path;
3686
3686
  } else if (!base.path) {
3687
- target.path = relative.path;
3687
+ target.path = relative2.path;
3688
3688
  } else {
3689
- target.path = base.path.slice(0, base.path.lastIndexOf("/") + 1) + relative.path;
3689
+ target.path = base.path.slice(0, base.path.lastIndexOf("/") + 1) + relative2.path;
3690
3690
  }
3691
3691
  target.path = removeDotSegments(target.path);
3692
3692
  }
3693
- target.query = relative.query;
3693
+ target.query = relative2.query;
3694
3694
  }
3695
3695
  target.userinfo = base.userinfo;
3696
3696
  target.host = base.host;
@@ -3698,7 +3698,7 @@ var require_fast_uri = __commonJS({
3698
3698
  }
3699
3699
  target.scheme = base.scheme;
3700
3700
  }
3701
- target.fragment = relative.fragment;
3701
+ target.fragment = relative2.fragment;
3702
3702
  return target;
3703
3703
  }
3704
3704
  function equal(uriA, uriB, options) {
@@ -3900,7 +3900,7 @@ var require_fast_uri = __commonJS({
3900
3900
  var fastUri = {
3901
3901
  SCHEMES,
3902
3902
  normalize,
3903
- resolve: resolve3,
3903
+ resolve: resolve4,
3904
3904
  resolveComponent,
3905
3905
  equal,
3906
3906
  serialize,
@@ -6876,12 +6876,12 @@ var require_dist = __commonJS({
6876
6876
  throw new Error(`Unknown format "${name}"`);
6877
6877
  return f;
6878
6878
  };
6879
- function addFormats(ajv, list, fs8, exportName) {
6879
+ function addFormats(ajv, list, fs9, exportName) {
6880
6880
  var _a3;
6881
6881
  var _b;
6882
6882
  (_a3 = (_b = ajv.opts.code).formats) !== null && _a3 !== void 0 ? _a3 : _b.formats = (0, codegen_1._)`require("ajv-formats/dist/formats").${exportName}`;
6883
6883
  for (const f of list)
6884
- ajv.addFormat(f, fs8[f]);
6884
+ ajv.addFormat(f, fs9[f]);
6885
6885
  }
6886
6886
  module.exports = exports = formatsPlugin;
6887
6887
  Object.defineProperty(exports, "__esModule", { value: true });
@@ -6891,7 +6891,7 @@ var require_dist = __commonJS({
6891
6891
 
6892
6892
  // ../argent-mcp/src/mcp-server.ts
6893
6893
  import { appendFile, mkdir as mkdir5 } from "node:fs/promises";
6894
- import { dirname as dirname3 } from "node:path";
6894
+ import { dirname as dirname4 } from "node:path";
6895
6895
  import { homedir as homedir5 } from "node:os";
6896
6896
 
6897
6897
  // ../../node_modules/@modelcontextprotocol/sdk/dist/esm/server/stdio.js
@@ -7137,10 +7137,10 @@ function mergeDefs(...defs) {
7137
7137
  function cloneDef(schema) {
7138
7138
  return mergeDefs(schema._zod.def);
7139
7139
  }
7140
- function getElementAtPath(obj, path10) {
7141
- if (!path10)
7140
+ function getElementAtPath(obj, path11) {
7141
+ if (!path11)
7142
7142
  return obj;
7143
- return path10.reduce((acc, key) => acc?.[key], obj);
7143
+ return path11.reduce((acc, key) => acc?.[key], obj);
7144
7144
  }
7145
7145
  function promiseAllObject(promisesObj) {
7146
7146
  const keys = Object.keys(promisesObj);
@@ -7549,11 +7549,11 @@ function explicitlyAborted(x, startIndex = 0) {
7549
7549
  }
7550
7550
  return false;
7551
7551
  }
7552
- function prefixIssues(path10, issues) {
7552
+ function prefixIssues(path11, issues) {
7553
7553
  return issues.map((iss) => {
7554
7554
  var _a3;
7555
7555
  (_a3 = iss).path ?? (_a3.path = []);
7556
- iss.path.unshift(path10);
7556
+ iss.path.unshift(path11);
7557
7557
  return iss;
7558
7558
  });
7559
7559
  }
@@ -7700,16 +7700,16 @@ function flattenError(error2, mapper = (issue2) => issue2.message) {
7700
7700
  }
7701
7701
  function formatError(error2, mapper = (issue2) => issue2.message) {
7702
7702
  const fieldErrors = { _errors: [] };
7703
- const processError = (error3, path10 = []) => {
7703
+ const processError = (error3, path11 = []) => {
7704
7704
  for (const issue2 of error3.issues) {
7705
7705
  if (issue2.code === "invalid_union" && issue2.errors.length) {
7706
- issue2.errors.map((issues) => processError({ issues }, [...path10, ...issue2.path]));
7706
+ issue2.errors.map((issues) => processError({ issues }, [...path11, ...issue2.path]));
7707
7707
  } else if (issue2.code === "invalid_key") {
7708
- processError({ issues: issue2.issues }, [...path10, ...issue2.path]);
7708
+ processError({ issues: issue2.issues }, [...path11, ...issue2.path]);
7709
7709
  } else if (issue2.code === "invalid_element") {
7710
- processError({ issues: issue2.issues }, [...path10, ...issue2.path]);
7710
+ processError({ issues: issue2.issues }, [...path11, ...issue2.path]);
7711
7711
  } else {
7712
- const fullpath = [...path10, ...issue2.path];
7712
+ const fullpath = [...path11, ...issue2.path];
7713
7713
  if (fullpath.length === 0) {
7714
7714
  fieldErrors._errors.push(mapper(issue2));
7715
7715
  } else {
@@ -13701,12 +13701,12 @@ var StdioServerTransport = class {
13701
13701
  this.onclose?.();
13702
13702
  }
13703
13703
  send(message) {
13704
- return new Promise((resolve3) => {
13704
+ return new Promise((resolve4) => {
13705
13705
  const json = serializeMessage(message);
13706
13706
  if (this._stdout.write(json)) {
13707
- resolve3();
13707
+ resolve4();
13708
13708
  } else {
13709
- this._stdout.once("drain", resolve3);
13709
+ this._stdout.once("drain", resolve4);
13710
13710
  }
13711
13711
  });
13712
13712
  }
@@ -14304,7 +14304,7 @@ var Protocol = class {
14304
14304
  return;
14305
14305
  }
14306
14306
  const pollInterval = task2.pollInterval ?? this._options?.defaultTaskPollInterval ?? 1e3;
14307
- await new Promise((resolve3) => setTimeout(resolve3, pollInterval));
14307
+ await new Promise((resolve4) => setTimeout(resolve4, pollInterval));
14308
14308
  options?.signal?.throwIfAborted();
14309
14309
  }
14310
14310
  } catch (error2) {
@@ -14321,7 +14321,7 @@ var Protocol = class {
14321
14321
  */
14322
14322
  request(request, resultSchema, options) {
14323
14323
  const { relatedRequestId, resumptionToken, onresumptiontoken, task, relatedTask } = options ?? {};
14324
- return new Promise((resolve3, reject) => {
14324
+ return new Promise((resolve4, reject) => {
14325
14325
  const earlyReject = (error2) => {
14326
14326
  reject(error2);
14327
14327
  };
@@ -14399,7 +14399,7 @@ var Protocol = class {
14399
14399
  if (!parseResult.success) {
14400
14400
  reject(parseResult.error);
14401
14401
  } else {
14402
- resolve3(parseResult.data);
14402
+ resolve4(parseResult.data);
14403
14403
  }
14404
14404
  } catch (error2) {
14405
14405
  reject(error2);
@@ -14660,12 +14660,12 @@ var Protocol = class {
14660
14660
  }
14661
14661
  } catch {
14662
14662
  }
14663
- return new Promise((resolve3, reject) => {
14663
+ return new Promise((resolve4, reject) => {
14664
14664
  if (signal.aborted) {
14665
14665
  reject(new McpError(ErrorCode.InvalidRequest, "Request cancelled"));
14666
14666
  return;
14667
14667
  }
14668
- const timeoutId = setTimeout(resolve3, interval);
14668
+ const timeoutId = setTimeout(resolve4, interval);
14669
14669
  signal.addEventListener("abort", () => {
14670
14670
  clearTimeout(timeoutId);
14671
14671
  reject(new McpError(ErrorCode.InvalidRequest, "Request cancelled"));
@@ -15461,8 +15461,8 @@ import * as path from "node:path";
15461
15461
  import * as readline from "node:readline";
15462
15462
  import { homedir } from "node:os";
15463
15463
  import { spawn, execFileSync } from "node:child_process";
15464
- import { randomBytes } from "node:crypto";
15465
- import { mkdir, writeFile, readFile, unlink, rename, chmod } from "node:fs/promises";
15464
+ import { createHash, randomBytes } from "node:crypto";
15465
+ import { mkdir, writeFile, readFile, readdir, unlink, rename, chmod } from "node:fs/promises";
15466
15466
  var STATE_DIR = path.join(homedir(), ".argent");
15467
15467
  var STATE_FILE = path.join(STATE_DIR, "tool-server.json");
15468
15468
  var LOG_FILE = path.join(STATE_DIR, "tool-server.log");
@@ -15482,13 +15482,15 @@ function buildToolsServerEnv(paths, port, baseEnv = process.env, options = {}) {
15482
15482
  env.ARGENT_IDLE_TIMEOUT_MINUTES = String(options.idleTimeoutMinutes);
15483
15483
  }
15484
15484
  if (options.token) env[AUTH_TOKEN_ENV] = options.token;
15485
+ if (paths.installKind) env.ARGENT_INSTALL_KIND = paths.installKind;
15486
+ if (paths.installProjectRoot) env.ARGENT_PROJECT_ROOT = paths.installProjectRoot;
15485
15487
  return env;
15486
15488
  }
15487
15489
  function generateToken() {
15488
15490
  return randomBytes(AUTH_TOKEN_BYTES).toString("hex");
15489
15491
  }
15490
15492
  function findFreePort() {
15491
- return new Promise((resolve3, reject) => {
15493
+ return new Promise((resolve4, reject) => {
15492
15494
  const srv = net.createServer();
15493
15495
  srv.listen(0, "127.0.0.1", () => {
15494
15496
  const addr = srv.address();
@@ -15499,12 +15501,55 @@ function findFreePort() {
15499
15501
  const port = addr.port;
15500
15502
  srv.close((err) => {
15501
15503
  if (err) reject(err);
15502
- else resolve3(port);
15504
+ else resolve4(port);
15503
15505
  });
15504
15506
  });
15505
15507
  srv.on("error", reject);
15506
15508
  });
15507
15509
  }
15510
+ function isVersionNewer(a, b) {
15511
+ const parse3 = (v) => {
15512
+ const [core = "", ...preParts] = v.split("+")[0].split("-");
15513
+ const nums = core.split(".").map((n) => Number.parseInt(n, 10));
15514
+ if (nums.length === 0 || nums.some((n) => Number.isNaN(n))) return null;
15515
+ return { nums, pre: preParts.length > 0 ? preParts.join("-").split(".") : [] };
15516
+ };
15517
+ const pa = parse3(a);
15518
+ const pb = parse3(b);
15519
+ if (!pa || !pb) return false;
15520
+ for (let i = 0; i < 3; i++) {
15521
+ const x = pa.nums[i] ?? 0;
15522
+ const y = pb.nums[i] ?? 0;
15523
+ if (x !== y) return x > y;
15524
+ }
15525
+ if (pa.pre.length === 0 && pb.pre.length === 0) return false;
15526
+ if (pa.pre.length === 0) return true;
15527
+ if (pb.pre.length === 0) return false;
15528
+ for (let i = 0; i < Math.max(pa.pre.length, pb.pre.length); i++) {
15529
+ const x = pa.pre[i];
15530
+ const y = pb.pre[i];
15531
+ if (x === void 0) return false;
15532
+ if (y === void 0) return true;
15533
+ if (x === y) continue;
15534
+ const xn = /^\d+$/.test(x) ? Number.parseInt(x, 10) : null;
15535
+ const yn = /^\d+$/.test(y) ? Number.parseInt(y, 10) : null;
15536
+ if (xn !== null && yn !== null) return xn > yn;
15537
+ if (xn !== null) return false;
15538
+ if (yn !== null) return true;
15539
+ return x > y;
15540
+ }
15541
+ return false;
15542
+ }
15543
+ function readBundlePackageVersion(bundlePath) {
15544
+ try {
15545
+ const pkg = JSON.parse(
15546
+ fs.readFileSync(path.join(path.dirname(bundlePath), "..", "package.json"), "utf8")
15547
+ );
15548
+ return typeof pkg.version === "string" ? pkg.version : void 0;
15549
+ } catch {
15550
+ return void 0;
15551
+ }
15552
+ }
15508
15553
  function isProcessAlive(pid) {
15509
15554
  try {
15510
15555
  process.kill(pid, 0);
@@ -15554,7 +15599,7 @@ function killSpawnedChild(child, pid) {
15554
15599
  }
15555
15600
  }
15556
15601
  function spawnToolsServer(paths, port, options = {}) {
15557
- return new Promise((resolve3, reject) => {
15602
+ return new Promise((resolve4, reject) => {
15558
15603
  let logFd;
15559
15604
  try {
15560
15605
  fs.mkdirSync(STATE_DIR, { recursive: true });
@@ -15590,7 +15635,8 @@ function spawnToolsServer(paths, port, options = {}) {
15590
15635
  const actualPort = parseInt(match[1], 10);
15591
15636
  rl.close();
15592
15637
  child.stdout?.resume();
15593
- settle(() => resolve3({ port: actualPort, pid }));
15638
+ child.stdout?.unref?.();
15639
+ settle(() => resolve4({ port: actualPort, pid }));
15594
15640
  }
15595
15641
  });
15596
15642
  child.on("error", (err) => {
@@ -15608,39 +15654,83 @@ function spawnToolsServer(paths, port, options = {}) {
15608
15654
  rl.on("close", () => clearTimeout(timer));
15609
15655
  });
15610
15656
  }
15611
- async function readToolsServerState() {
15657
+ function stateFileForBundle(bundlePath) {
15658
+ const key = createHash("sha256").update(bundlePath).digest("hex").slice(0, 12);
15659
+ return path.join(STATE_DIR, `tool-server-${key}.json`);
15660
+ }
15661
+ async function readStateFile(file) {
15612
15662
  try {
15613
- const raw = await readFile(STATE_FILE, "utf8");
15663
+ const raw = await readFile(file, "utf8");
15614
15664
  return JSON.parse(raw);
15615
15665
  } catch {
15616
15666
  return null;
15617
15667
  }
15618
15668
  }
15669
+ async function readToolsServerState(bundlePath) {
15670
+ if (bundlePath === void 0) return readStateFile(STATE_FILE);
15671
+ const own = await readStateFile(stateFileForBundle(bundlePath));
15672
+ if (own) return own;
15673
+ const legacy = await readStateFile(STATE_FILE);
15674
+ return legacy && legacy.bundlePath === bundlePath ? legacy : null;
15675
+ }
15619
15676
  async function writeToolsServerState(state) {
15677
+ const target = stateFileForBundle(state.bundlePath);
15620
15678
  await mkdir(STATE_DIR, { recursive: true });
15621
- const tmp = `${STATE_FILE}.${process.pid}.tmp`;
15679
+ const tmp = `${target}.${process.pid}.tmp`;
15622
15680
  try {
15623
15681
  await writeFile(tmp, JSON.stringify(state, null, 2) + "\n", {
15624
15682
  encoding: "utf8",
15625
15683
  mode: 384
15626
15684
  });
15627
15685
  await chmod(tmp, 384);
15628
- await rename(tmp, STATE_FILE);
15686
+ await rename(tmp, target);
15629
15687
  } catch (err) {
15630
15688
  await unlink(tmp).catch(() => {
15631
15689
  });
15632
15690
  throw err;
15633
15691
  }
15634
15692
  }
15635
- async function clearToolsServerState() {
15693
+ async function clearToolsServerState(bundlePath) {
15694
+ const files = [STATE_FILE];
15695
+ if (bundlePath !== void 0) {
15696
+ files[0] = stateFileForBundle(bundlePath);
15697
+ const legacy = await readStateFile(STATE_FILE);
15698
+ if (legacy && legacy.bundlePath === bundlePath) files.push(STATE_FILE);
15699
+ }
15700
+ for (const file of files) {
15701
+ try {
15702
+ await unlink(file);
15703
+ } catch {
15704
+ }
15705
+ }
15706
+ }
15707
+ var STATE_FILE_RE = /^tool-server(-[0-9a-f]{12})?\.json$/;
15708
+ async function readAllToolsServerStates() {
15709
+ let names;
15636
15710
  try {
15637
- await unlink(STATE_FILE);
15711
+ names = await readdir(STATE_DIR);
15638
15712
  } catch {
15713
+ return [];
15714
+ }
15715
+ const out = [];
15716
+ for (const name of names) {
15717
+ if (!STATE_FILE_RE.test(name)) continue;
15718
+ const file = path.join(STATE_DIR, name);
15719
+ const state = await readStateFile(file);
15720
+ if (state) out.push({ file, state });
15721
+ }
15722
+ return out;
15723
+ }
15724
+ async function sweepDeadStateFiles() {
15725
+ for (const { file } of await readAllToolsServerStates()) {
15726
+ if (file === STATE_FILE) continue;
15727
+ const fresh = await readStateFile(file);
15728
+ if (fresh && !isProcessAlive(fresh.pid)) await unlink(file).catch(() => {
15729
+ });
15639
15730
  }
15640
15731
  }
15641
15732
  var readState = readToolsServerState;
15642
15733
  var writeState = writeToolsServerState;
15643
- var clearState = clearToolsServerState;
15644
15734
  var SIGTERM_GRACE_MS = 6e3;
15645
15735
  var SIGKILL_GRACE_MS = 1e3;
15646
15736
  var KILL_POLL_MS = 100;
@@ -15678,8 +15768,8 @@ function processCommandMatches(pid, marker) {
15678
15768
  stdio: ["ignore", "pipe", "ignore"]
15679
15769
  }).trim();
15680
15770
  if (!cmd) return false;
15681
- const argv = cmd.split(/\s+/);
15682
- return argv.includes(marker) && argv.includes("start");
15771
+ const escaped = marker.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
15772
+ return new RegExp(`(?:^|\\s)${escaped} start(?:\\s|$)`).test(cmd);
15683
15773
  } catch {
15684
15774
  return false;
15685
15775
  }
@@ -15743,25 +15833,45 @@ async function acquireSpawnLock() {
15743
15833
  }
15744
15834
  }
15745
15835
  }
15746
- async function reusableHandle(state) {
15836
+ async function reusableHandle(state, wantBundlePath, wantVersion) {
15747
15837
  if (!state || !isProcessAlive(state.pid)) return null;
15838
+ if (wantBundlePath !== void 0 && state.bundlePath !== wantBundlePath) return null;
15839
+ if (wantBundlePath !== void 0 && state.version !== void 0) {
15840
+ const diskVersion = readBundlePackageVersion(wantBundlePath);
15841
+ if (diskVersion !== void 0) {
15842
+ if (diskVersion !== state.version) return null;
15843
+ } else if (wantVersion !== void 0 && state.version !== wantVersion && isVersionNewer(wantVersion, state.version)) {
15844
+ return null;
15845
+ }
15846
+ }
15748
15847
  const host = state.host ?? "127.0.0.1";
15749
15848
  const healthy = await isToolsServerHealthy(state.port, host, 2e3, state.token);
15750
15849
  if (!healthy) return null;
15751
15850
  return { url: formatUrl(healthCheckHost(host), state.port), token: state.token ?? "" };
15752
15851
  }
15753
15852
  async function ensureToolsServer(paths) {
15754
- const fast = await reusableHandle(await readState());
15853
+ const fast = await reusableHandle(
15854
+ await readState(paths.bundlePath),
15855
+ paths.bundlePath,
15856
+ paths.version
15857
+ );
15755
15858
  if (fast) return fast;
15756
15859
  const lock = await acquireSpawnLock();
15757
15860
  try {
15758
- const state = await readState();
15759
- const reuse = await reusableHandle(state);
15861
+ const state = await readState(paths.bundlePath);
15862
+ const reuse = await reusableHandle(state, paths.bundlePath, paths.version);
15760
15863
  if (reuse) return reuse;
15761
- if (state && state.managed === "autospawn" && isProcessAlive(state.pid) && processCommandMatches(state.pid, state.bundlePath)) {
15864
+ if (state && state.managed === "autospawn" && state.bundlePath === paths.bundlePath && isProcessAlive(state.pid) && processCommandMatches(state.pid, state.bundlePath)) {
15762
15865
  await terminatePid(state.pid, () => processCommandMatches(state.pid, state.bundlePath));
15763
15866
  }
15764
- await clearState();
15867
+ await clearToolsServerState(paths.bundlePath);
15868
+ await sweepDeadStateFiles();
15869
+ if (!fs.existsSync(paths.bundlePath)) {
15870
+ throw new Error(
15871
+ `The argent install serving this session is gone from disk (${paths.bundlePath}) \u2014 it was likely updated or removed. Restart the editor's MCP connection to reconnect.`
15872
+ );
15873
+ }
15874
+ const diskVersion = readBundlePackageVersion(paths.bundlePath) ?? paths.version;
15765
15875
  const token = generateToken();
15766
15876
  const port = await findFreePort();
15767
15877
  const { port: actualPort, pid } = await spawnToolsServer(paths, port, {
@@ -15773,6 +15883,7 @@ async function ensureToolsServer(paths) {
15773
15883
  pid,
15774
15884
  startedAt: (/* @__PURE__ */ new Date()).toISOString(),
15775
15885
  bundlePath: paths.bundlePath,
15886
+ version: diskVersion,
15776
15887
  host: "127.0.0.1",
15777
15888
  token,
15778
15889
  managed: "autospawn"
@@ -15926,7 +16037,7 @@ async function applyClientFileDirectives(result) {
15926
16037
  import { mkdir as mkdir4, readFile as readFile4, rm, stat as stat2, writeFile as writeFile4 } from "node:fs/promises";
15927
16038
  import { tmpdir } from "node:os";
15928
16039
  import { basename, join as join3 } from "node:path";
15929
- import { createHash } from "node:crypto";
16040
+ import { createHash as createHash2 } from "node:crypto";
15930
16041
  import { execFile } from "node:child_process";
15931
16042
  import { promisify } from "node:util";
15932
16043
  var execFileAsync = promisify(execFile);
@@ -15947,7 +16058,7 @@ function sanitizeSegment(segment) {
15947
16058
  }
15948
16059
  function projectSlug() {
15949
16060
  const cwd = process.cwd();
15950
- const hash = createHash("sha1").update(cwd).digest("hex").slice(0, 6);
16061
+ const hash = createHash2("sha1").update(cwd).digest("hex").slice(0, 6);
15951
16062
  const name = sanitizeSegment(basename(cwd)) || "root";
15952
16063
  return `${name}-${hash}`;
15953
16064
  }
@@ -17298,6 +17409,9 @@ var FAILURE_CODES = {
17298
17409
  TOOLSERVER_UNHANDLED_REJECTION: "TOOLSERVER_UNHANDLED_REJECTION",
17299
17410
  TOOLSERVER_UNCAUGHT_EXCEPTION: "TOOLSERVER_UNCAUGHT_EXCEPTION",
17300
17411
  INSTALL_GLOBAL_PACKAGE_FAILED: "INSTALL_GLOBAL_PACKAGE_FAILED",
17412
+ INSTALL_LOCAL_PACKAGE_FAILED: "INSTALL_LOCAL_PACKAGE_FAILED",
17413
+ INSTALL_LOCAL_PRECONDITION_FAILED: "INSTALL_LOCAL_PRECONDITION_FAILED",
17414
+ INSTALL_MODE_FLAG_CONFLICT: "INSTALL_MODE_FLAG_CONFLICT",
17301
17415
  INSTALL_FROM_TAR_PACKAGE_FAILED: "INSTALL_FROM_TAR_PACKAGE_FAILED",
17302
17416
  INSTALL_INIT_TRIGGERED_UPDATE_FAILED: "INSTALL_INIT_TRIGGERED_UPDATE_FAILED",
17303
17417
  INSTALL_SKILLS_REFRESH_FAILED: "INSTALL_SKILLS_REFRESH_FAILED",
@@ -17313,6 +17427,14 @@ var FAILURE_CODES = {
17313
17427
  UNINSTALL_UNCLASSIFIED_FAILED: "UNINSTALL_UNCLASSIFIED_FAILED",
17314
17428
  VEGA_CLI_COMMAND_FAILED: "VEGA_CLI_COMMAND_FAILED",
17315
17429
  VEGA_INPUT_UNAVAILABLE: "VEGA_INPUT_UNAVAILABLE",
17430
+ VEGA_DEVICE_NOT_FOUND: "VEGA_DEVICE_NOT_FOUND",
17431
+ VEGA_DEVICE_NOT_REGISTERED: "VEGA_DEVICE_NOT_REGISTERED",
17432
+ VEGA_MULTIPLE_DEVICES: "VEGA_MULTIPLE_DEVICES",
17433
+ VEGA_BOOT_TIMEOUT: "VEGA_BOOT_TIMEOUT",
17434
+ VEGA_IMAGE_NOT_FOUND: "VEGA_IMAGE_NOT_FOUND",
17435
+ VEGA_ALREADY_RUNNING: "VEGA_ALREADY_RUNNING",
17436
+ VEGA_SCREENSHOT_FAILED: "VEGA_SCREENSHOT_FAILED",
17437
+ VEGA_TEXT_INVALID: "VEGA_TEXT_INVALID",
17316
17438
  ANDROID_ADB_NOT_FOUND: "ANDROID_ADB_NOT_FOUND",
17317
17439
  ANDROID_EMULATOR_NOT_FOUND: "ANDROID_EMULATOR_NOT_FOUND",
17318
17440
  ANDROID_ADB_COMMAND_FAILED: "ANDROID_ADB_COMMAND_FAILED",
@@ -17325,6 +17447,7 @@ var FAILURE_CODES = {
17325
17447
  SIMULATOR_NON_JSON_RESPONSE: "SIMULATOR_NON_JSON_RESPONSE",
17326
17448
  SIMULATOR_HTTP_ERROR_RESPONSE: "SIMULATOR_HTTP_ERROR_RESPONSE",
17327
17449
  SIMULATOR_MISSING_RESPONSE_FIELDS: "SIMULATOR_MISSING_RESPONSE_FIELDS",
17450
+ SIMULATOR_SCREENSHOT_FAILED: "SIMULATOR_SCREENSHOT_FAILED",
17328
17451
  SIMULATOR_SERVER_FACTORY_OPTIONS_MISSING: "SIMULATOR_SERVER_FACTORY_OPTIONS_MISSING",
17329
17452
  SIMULATOR_SERVER_DEVICE_ID_INVALID: "SIMULATOR_SERVER_DEVICE_ID_INVALID",
17330
17453
  SIMULATOR_SERVER_READY_EXITED: "SIMULATOR_SERVER_READY_EXITED",
@@ -17378,6 +17501,7 @@ var FAILURE_CODES = {
17378
17501
  ANDROID_SCREEN_SIZE_PARSE_FAILED: "ANDROID_SCREEN_SIZE_PARSE_FAILED",
17379
17502
  ANDROID_SCREEN_SIZE_NON_POSITIVE: "ANDROID_SCREEN_SIZE_NON_POSITIVE",
17380
17503
  ANDROID_UIAUTOMATOR_PARSE_FAILED: "ANDROID_UIAUTOMATOR_PARSE_FAILED",
17504
+ ANDROID_UIAUTOMATOR_CAPTURE_FAILED: "ANDROID_UIAUTOMATOR_CAPTURE_FAILED",
17381
17505
  DEBUGGER_METRO_NOT_RUNNING: "DEBUGGER_METRO_NOT_RUNNING",
17382
17506
  DEBUGGER_METRO_PROJECT_ROOT_MISSING: "DEBUGGER_METRO_PROJECT_ROOT_MISSING",
17383
17507
  DEBUGGER_METRO_NO_TARGETS: "DEBUGGER_METRO_NO_TARGETS",
@@ -17422,8 +17546,19 @@ var FAILURE_CODES = {
17422
17546
  NATIVE_PROFILER_XCTRACE_READY_EXITED: "NATIVE_PROFILER_XCTRACE_READY_EXITED",
17423
17547
  NATIVE_PROFILER_XCTRACE_PROCESS_ERROR: "NATIVE_PROFILER_XCTRACE_PROCESS_ERROR",
17424
17548
  NATIVE_PROFILER_XCTRACE_READY_TIMEOUT: "NATIVE_PROFILER_XCTRACE_READY_TIMEOUT",
17549
+ NATIVE_PROFILER_TRACE_TEMPLATE_MISSING: "NATIVE_PROFILER_TRACE_TEMPLATE_MISSING",
17425
17550
  NATIVE_PROFILER_NO_ACTIVE_SESSION: "NATIVE_PROFILER_NO_ACTIVE_SESSION",
17551
+ NATIVE_PROFILER_APP_PROCESS_NOT_FOUND: "NATIVE_PROFILER_APP_PROCESS_NOT_FOUND",
17552
+ NATIVE_PROFILER_NO_EXPORTED_TRACE: "NATIVE_PROFILER_NO_EXPORTED_TRACE",
17553
+ // Android perfetto start-failure modes — mirror the iOS xctrace set so a
17554
+ // failed recording start is classified rather than falling through to the
17555
+ // generic tool-execution bucket.
17556
+ NATIVE_PROFILER_PERFETTO_PROCESS_ERROR: "NATIVE_PROFILER_PERFETTO_PROCESS_ERROR",
17557
+ NATIVE_PROFILER_PERFETTO_READY_TIMEOUT: "NATIVE_PROFILER_PERFETTO_READY_TIMEOUT",
17558
+ NATIVE_PROFILER_PERFETTO_READY_EXITED: "NATIVE_PROFILER_PERFETTO_READY_EXITED",
17426
17559
  FLOW_PROJECT_ROOT_REQUIRED: "FLOW_PROJECT_ROOT_REQUIRED",
17560
+ FLOW_PROJECT_ROOT_INVALID: "FLOW_PROJECT_ROOT_INVALID",
17561
+ FLOW_NAME_INVALID: "FLOW_NAME_INVALID",
17427
17562
  FLOW_NO_ACTIVE_RECORDING: "FLOW_NO_ACTIVE_RECORDING",
17428
17563
  FLOW_FILE_INVALID: "FLOW_FILE_INVALID",
17429
17564
  FLOW_ENTRY_UNRECOGNIZED: "FLOW_ENTRY_UNRECOGNIZED",
@@ -17431,6 +17566,27 @@ var FAILURE_CODES = {
17431
17566
  PROFILER_QUERY_REQUIRED_PARAM_MISSING: "PROFILER_QUERY_REQUIRED_PARAM_MISSING",
17432
17567
  PROFILER_DATA_NOT_LOADED: "PROFILER_DATA_NOT_LOADED",
17433
17568
  PROFILER_NATIVE_TRACE_MISSING: "PROFILER_NATIVE_TRACE_MISSING",
17569
+ PROFILER_NATIVE_METADATA_MISSING: "PROFILER_NATIVE_METADATA_MISSING",
17570
+ PROFILER_NATIVE_METADATA_INVALID: "PROFILER_NATIVE_METADATA_INVALID",
17571
+ CHROMIUM_CDP_UNREACHABLE: "CHROMIUM_CDP_UNREACHABLE",
17572
+ CHROMIUM_CDP_NO_PAGE_TARGET: "CHROMIUM_CDP_NO_PAGE_TARGET",
17573
+ CHROMIUM_CDP_INVALID_RESPONSE: "CHROMIUM_CDP_INVALID_RESPONSE",
17574
+ CHROMIUM_DEVICE_ID_INVALID: "CHROMIUM_DEVICE_ID_INVALID",
17575
+ CHROMIUM_PARAM_INVALID: "CHROMIUM_PARAM_INVALID",
17576
+ CHROMIUM_INPUT_INVALID: "CHROMIUM_INPUT_INVALID",
17577
+ CHROMIUM_VIEWPORT_READ_FAILED: "CHROMIUM_VIEWPORT_READ_FAILED",
17578
+ CHROMIUM_SCREENSHOT_FAILED: "CHROMIUM_SCREENSHOT_FAILED",
17579
+ CHROMIUM_STORAGE_EVAL_FAILED: "CHROMIUM_STORAGE_EVAL_FAILED",
17580
+ CHROMIUM_TAB_NOT_FOUND: "CHROMIUM_TAB_NOT_FOUND",
17581
+ CHROMIUM_TAB_OPEN_FAILED: "CHROMIUM_TAB_OPEN_FAILED",
17582
+ CHROMIUM_DESCRIBE_FAILED: "CHROMIUM_DESCRIBE_FAILED",
17583
+ CHROMIUM_ELECTRON_APP_PATH_INVALID: "CHROMIUM_ELECTRON_APP_PATH_INVALID",
17584
+ CHROMIUM_ELECTRON_SPAWN_FAILED: "CHROMIUM_ELECTRON_SPAWN_FAILED",
17585
+ CHROMIUM_ELECTRON_CDP_TIMEOUT: "CHROMIUM_ELECTRON_CDP_TIMEOUT",
17586
+ CHROMIUM_ELECTRON_EXITED_BEFORE_READY: "CHROMIUM_ELECTRON_EXITED_BEFORE_READY",
17587
+ KEYBOARD_KEY_UNSUPPORTED: "KEYBOARD_KEY_UNSUPPORTED",
17588
+ KEYBOARD_CHARACTER_UNSUPPORTED: "KEYBOARD_CHARACTER_UNSUPPORTED",
17589
+ SCREENSHOT_DIFF_INPUT_INVALID: "SCREENSHOT_DIFF_INPUT_INVALID",
17434
17590
  BOOT_DEVICE_TARGET_SELECTION_INVALID: "BOOT_DEVICE_TARGET_SELECTION_INVALID",
17435
17591
  BOOT_IOS_UNSUPPORTED_HOST: "BOOT_IOS_UNSUPPORTED_HOST",
17436
17592
  BOOT_ANDROID_NO_AVDS: "BOOT_ANDROID_NO_AVDS",
@@ -17469,6 +17625,7 @@ var FAILURE_COMMANDS = [
17469
17625
  "ax_service",
17470
17626
  "simulator_server",
17471
17627
  "cdp",
17628
+ "electron",
17472
17629
  "npm",
17473
17630
  "npx",
17474
17631
  "unknown"
@@ -17502,7 +17659,15 @@ var FAILURE_SPAWN_CODE_SET = new Set(FAILURE_SPAWN_CODES);
17502
17659
  import { randomUUID as randomUUID2 } from "node:crypto";
17503
17660
 
17504
17661
  // ../telemetry/src/events.ts
17505
- var PLATFORMS = ["ios", "ios-remote", "android", "chromium", "vega"];
17662
+ var PLATFORMS = [
17663
+ "ios",
17664
+ "ios-remote",
17665
+ "android",
17666
+ "chromium",
17667
+ "vega",
17668
+ "tvos",
17669
+ "android-tv"
17670
+ ];
17506
17671
 
17507
17672
  // ../telemetry/src/ai-identity.ts
17508
17673
  var AI_CLIENTS = [
@@ -17589,6 +17754,7 @@ var FAILURE_SIGNAL_NAME = oneOf(FAILURE_SIGNAL_NAMES);
17589
17754
  var FAILURE_SPAWN_CODE = oneOf(FAILURE_SPAWN_CODES);
17590
17755
  var NETWORK_FAILURE = oneOf(NETWORK_FAILURES);
17591
17756
  var AI_CLIENT = oneOf(AI_CLIENTS);
17757
+ var INSTALL_MODE = oneOf(["global", "local"]);
17592
17758
  var AI_TELEMETRY = {
17593
17759
  ai_client: AI_CLIENT
17594
17760
  };
@@ -17612,10 +17778,21 @@ var ALLOWED = {
17612
17778
  duration_ms: DURATION_MS,
17613
17779
  is_success: bool,
17614
17780
  editors_configured_count: COUNT,
17781
+ install_mode: INSTALL_MODE,
17615
17782
  ...FAILURE_SIGNAL
17616
17783
  },
17617
17784
  "installation:cli_init_cancel": {
17618
- step: oneOf(["global_install", "editors", "scope", "skills", "allowlist"])
17785
+ step: oneOf([
17786
+ "global_install",
17787
+ "editors",
17788
+ "scope",
17789
+ "skills",
17790
+ "allowlist",
17791
+ "install_mode"
17792
+ ])
17793
+ },
17794
+ "installation:install_mode_decision": {
17795
+ install_mode: INSTALL_MODE
17619
17796
  },
17620
17797
  "installation:global_install_decision": {
17621
17798
  // `from_tar` is intentionally absent; the installer skips that dev path.
@@ -17629,11 +17806,16 @@ var ALLOWED = {
17629
17806
  "installation:editors_select": {
17630
17807
  editors: arrayOf(ADAPTER_NAME),
17631
17808
  detected_editor_count: COUNT,
17632
- scope: oneOf(["local", "global", "custom"])
17809
+ scope: oneOf(["local", "global", "custom"]),
17810
+ install_mode: INSTALL_MODE
17633
17811
  },
17634
17812
  "installation:allowlist_decision": {
17635
17813
  is_enabled: bool
17636
17814
  },
17815
+ "installation:stale_config_cleanup": {
17816
+ removed_count: COUNT,
17817
+ warned_count: COUNT
17818
+ },
17637
17819
  "installation:skill_install": {
17638
17820
  method: oneOf(["default", "interactive", "manual"]),
17639
17821
  is_online: bool,
@@ -17657,16 +17839,19 @@ var ALLOWED = {
17657
17839
  },
17658
17840
  "installation:cli_update_start": {},
17659
17841
  "installation:cli_update_complete": {
17660
- duration_ms: DURATION_MS
17842
+ duration_ms: DURATION_MS,
17843
+ install_mode: INSTALL_MODE
17661
17844
  },
17662
17845
  "installation:cli_update_fail": {
17663
17846
  duration_ms: DURATION_MS,
17847
+ install_mode: INSTALL_MODE,
17664
17848
  ...FAILURE_SIGNAL
17665
17849
  },
17666
17850
  "installation:cli_uninstall_start": {},
17667
17851
  "installation:cli_uninstall_complete": {
17668
17852
  has_pruned_content: bool,
17669
17853
  has_uninstalled_package: bool,
17854
+ install_mode: INSTALL_MODE,
17670
17855
  ...FAILURE_SIGNAL
17671
17856
  },
17672
17857
  "tool:invoke": {
@@ -18249,14 +18434,25 @@ function updateConfig(mutate) {
18249
18434
  }
18250
18435
  }
18251
18436
 
18252
- // ../telemetry/src/consent.ts
18437
+ // ../telemetry/src/fingerprint.ts
18438
+ import { execFileSync as execFileSync2, spawn as spawn2 } from "node:child_process";
18439
+
18440
+ // ../native-devtools-ios/src/index.ts
18441
+ import * as path9 from "node:path";
18253
18442
  import * as fs5 from "node:fs";
18443
+ var DYLIB_DIR = process.env.ARGENT_NATIVE_DEVTOOLS_DIR ?? path9.join(__dirname, "..", "dylibs");
18444
+ var BIN_DIR = process.env.ARGENT_SIMULATOR_SERVER_DIR ?? path9.join(__dirname, "..", "bin");
18445
+ var DYLIB_TCP_DIR = process.env.ARGENT_NATIVE_DEVTOOLS_TCP_DIR ?? path9.join(DYLIB_DIR, "tcp");
18446
+ var DYLIB_TVOS_DIR = path9.join(DYLIB_DIR, "tvos");
18447
+
18448
+ // ../telemetry/src/consent.ts
18449
+ import * as fs6 from "node:fs";
18254
18450
  var cache = { current: null };
18255
18451
  var sessionOverride = null;
18256
18452
  function readConfigOverride() {
18257
18453
  let stats;
18258
18454
  try {
18259
- stats = fs5.lstatSync(configFilePath());
18455
+ stats = fs6.lstatSync(configFilePath());
18260
18456
  } catch (err) {
18261
18457
  if (err.code === "ENOENT") {
18262
18458
  cache.current = { mtimeMs: null, fingerprint: null, enabledOverride: null };
@@ -18276,7 +18472,7 @@ function readConfigOverride() {
18276
18472
  }
18277
18473
  let parsedEnabled = null;
18278
18474
  try {
18279
- const raw = fs5.readFileSync(configFilePath(), "utf8");
18475
+ const raw = fs6.readFileSync(configFilePath(), "utf8");
18280
18476
  const json = JSON.parse(raw);
18281
18477
  if (json && typeof json === "object") {
18282
18478
  const t = json.telemetry;
@@ -18330,14 +18526,14 @@ function isEnabled(env = process.env) {
18330
18526
  }
18331
18527
 
18332
18528
  // ../telemetry/src/debug.ts
18333
- import * as fs6 from "node:fs";
18529
+ import * as fs7 from "node:fs";
18334
18530
 
18335
18531
  // ../telemetry/src/notice.ts
18336
18532
  var TELEMETRY_OPT_OUT_COMMAND = "argent telemetry disable";
18337
18533
  var TELEMETRY_DETAILS_URL = "https://swmansion.com/legal/argent/privacy-notice/";
18338
18534
  var FIRST_RUN_NOTICE_BODY_LINES = [
18339
- "Argent collects anonymous usage data to help us improve the tool. We never",
18340
- "collect your source code, file paths, tool inputs, or error contents."
18535
+ "Argent collects usage data to help us improve the tool.",
18536
+ "We never collect your source code, file paths, tool inputs, or error contents."
18341
18537
  ];
18342
18538
  var FIRST_RUN_NOTICE = [
18343
18539
  ...FIRST_RUN_NOTICE_BODY_LINES,
@@ -18577,12 +18773,12 @@ function toMcpTool(t) {
18577
18773
  }
18578
18774
 
18579
18775
  // ../argent-mcp/src/installed-version.ts
18580
- import * as fs7 from "node:fs";
18581
- import * as path9 from "node:path";
18776
+ import * as fs8 from "node:fs";
18777
+ import * as path10 from "node:path";
18582
18778
  function getInstalledVersion() {
18583
18779
  try {
18584
- const pkgPath = path9.resolve(import.meta.dirname, "..", "package.json");
18585
- const pkg = JSON.parse(fs7.readFileSync(pkgPath, "utf8"));
18780
+ const pkgPath = path10.resolve(import.meta.dirname, "..", "package.json");
18781
+ const pkg = JSON.parse(fs8.readFileSync(pkgPath, "utf8"));
18586
18782
  return pkg.version ?? "unknown";
18587
18783
  } catch {
18588
18784
  return "unknown";
@@ -18671,7 +18867,7 @@ async function startMcpServer(options) {
18671
18867
  async function spyLog(entry) {
18672
18868
  try {
18673
18869
  if (!logDirReady) {
18674
- await mkdir5(dirname3(LOG_FILE2), { recursive: true });
18870
+ await mkdir5(dirname4(LOG_FILE2), { recursive: true });
18675
18871
  logDirReady = true;
18676
18872
  }
18677
18873
  await appendFile(LOG_FILE2, JSON.stringify(entry) + "\n");
@@ -18767,8 +18963,21 @@ async function startMcpServer(options) {
18767
18963
  }
18768
18964
  const udid = getUdidFromArgs(params.arguments);
18769
18965
  if (autoScreenshotOn && udid && shouldAutoScreenshot(params.name)) {
18770
- const delayMs = getAutoScreenshotDelayMs(params.name);
18771
- if (delayMs > 0) await new Promise((r) => setTimeout(r, delayMs));
18966
+ const maxWaitMs = getAutoScreenshotDelayMs(params.name);
18967
+ if (maxWaitMs > 0) {
18968
+ try {
18969
+ const idle = await callTool("await-screen-idle", { udid, timeoutMs: maxWaitMs });
18970
+ await spyLog({
18971
+ ts: (/* @__PURE__ */ new Date()).toISOString(),
18972
+ event: "auto_screenshot_readiness",
18973
+ name: params.name,
18974
+ maxWaitMs,
18975
+ ...idle.result
18976
+ });
18977
+ } catch {
18978
+ await new Promise((r) => setTimeout(r, maxWaitMs));
18979
+ }
18980
+ }
18772
18981
  try {
18773
18982
  const screenshotResult = await callTool("screenshot", { udid });
18774
18983
  const screenshotContent = await toMcpContent(screenshotResult.result, "image", {