@swmansion/argent 0.28.1-next.0 → 0.28.1-next.10

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.
@@ -13223,8 +13223,8 @@ function finalize(ctx, schema) {
13223
13223
  const root = ctx.seen.get(schema);
13224
13224
  if (!root)
13225
13225
  throw new Error("Unprocessed schema. This is a bug in Zod.");
13226
- const flattenRef = (zodSchema79) => {
13227
- const seen = ctx.seen.get(zodSchema79);
13226
+ const flattenRef = (zodSchema80) => {
13227
+ const seen = ctx.seen.get(zodSchema80);
13228
13228
  if (seen.ref === null)
13229
13229
  return;
13230
13230
  const schema2 = seen.def ?? seen.schema;
@@ -13242,7 +13242,7 @@ function finalize(ctx, schema) {
13242
13242
  Object.assign(schema2, refSchema);
13243
13243
  }
13244
13244
  Object.assign(schema2, _cached);
13245
- const isParentRef = zodSchema79._zod.parent === ref;
13245
+ const isParentRef = zodSchema80._zod.parent === ref;
13246
13246
  if (isParentRef) {
13247
13247
  for (const key2 in schema2) {
13248
13248
  if (key2 === "$ref" || key2 === "allOf")
@@ -13262,7 +13262,7 @@ function finalize(ctx, schema) {
13262
13262
  }
13263
13263
  }
13264
13264
  }
13265
- const parent = zodSchema79._zod.parent;
13265
+ const parent = zodSchema80._zod.parent;
13266
13266
  if (parent && parent !== ref) {
13267
13267
  flattenRef(parent);
13268
13268
  const parentSeen = ctx.seen.get(parent);
@@ -13280,7 +13280,7 @@ function finalize(ctx, schema) {
13280
13280
  }
13281
13281
  }
13282
13282
  ctx.override({
13283
- zodSchema: zodSchema79,
13283
+ zodSchema: zodSchema80,
13284
13284
  jsonSchema: schema2,
13285
13285
  path: seen.path ?? []
13286
13286
  });
@@ -16081,10 +16081,10 @@ function convertBaseSchema(schema, ctx) {
16081
16081
  }
16082
16082
  ctx.processing.add(refPath);
16083
16083
  const resolved = resolveRef(refPath, ctx);
16084
- const zodSchema80 = convertSchema(resolved, ctx);
16085
- ctx.refs.set(refPath, zodSchema80);
16084
+ const zodSchema81 = convertSchema(resolved, ctx);
16085
+ ctx.refs.set(refPath, zodSchema81);
16086
16086
  ctx.processing.delete(refPath);
16087
- return zodSchema80;
16087
+ return zodSchema81;
16088
16088
  }
16089
16089
  if (schema.enum !== void 0) {
16090
16090
  const enumValues = schema.enum;
@@ -16126,7 +16126,7 @@ function convertBaseSchema(schema, ctx) {
16126
16126
  if (!type) {
16127
16127
  return z.any();
16128
16128
  }
16129
- let zodSchema79;
16129
+ let zodSchema80;
16130
16130
  switch (type) {
16131
16131
  case "string": {
16132
16132
  let stringSchema = z.string();
@@ -16189,7 +16189,7 @@ function convertBaseSchema(schema, ctx) {
16189
16189
  if (schema.pattern) {
16190
16190
  stringSchema = stringSchema.regex(new RegExp(schema.pattern));
16191
16191
  }
16192
- zodSchema79 = stringSchema;
16192
+ zodSchema80 = stringSchema;
16193
16193
  break;
16194
16194
  }
16195
16195
  case "number":
@@ -16214,15 +16214,15 @@ function convertBaseSchema(schema, ctx) {
16214
16214
  if (typeof schema.multipleOf === "number") {
16215
16215
  numberSchema = numberSchema.multipleOf(schema.multipleOf);
16216
16216
  }
16217
- zodSchema79 = numberSchema;
16217
+ zodSchema80 = numberSchema;
16218
16218
  break;
16219
16219
  }
16220
16220
  case "boolean": {
16221
- zodSchema79 = z.boolean();
16221
+ zodSchema80 = z.boolean();
16222
16222
  break;
16223
16223
  }
16224
16224
  case "null": {
16225
- zodSchema79 = z.null();
16225
+ zodSchema80 = z.null();
16226
16226
  break;
16227
16227
  }
16228
16228
  case "object": {
@@ -16237,12 +16237,12 @@ function convertBaseSchema(schema, ctx) {
16237
16237
  const keySchema = convertSchema(schema.propertyNames, ctx);
16238
16238
  const valueSchema = schema.additionalProperties && typeof schema.additionalProperties === "object" ? convertSchema(schema.additionalProperties, ctx) : z.any();
16239
16239
  if (Object.keys(shape).length === 0) {
16240
- zodSchema79 = z.record(keySchema, valueSchema);
16240
+ zodSchema80 = z.record(keySchema, valueSchema);
16241
16241
  break;
16242
16242
  }
16243
16243
  const objectSchema2 = z.object(shape).passthrough();
16244
16244
  const recordSchema = z.looseRecord(keySchema, valueSchema);
16245
- zodSchema79 = z.intersection(objectSchema2, recordSchema);
16245
+ zodSchema80 = z.intersection(objectSchema2, recordSchema);
16246
16246
  break;
16247
16247
  }
16248
16248
  if (schema.patternProperties) {
@@ -16260,25 +16260,25 @@ function convertBaseSchema(schema, ctx) {
16260
16260
  }
16261
16261
  schemasToIntersect.push(...looseRecords);
16262
16262
  if (schemasToIntersect.length === 0) {
16263
- zodSchema79 = z.object({}).passthrough();
16263
+ zodSchema80 = z.object({}).passthrough();
16264
16264
  } else if (schemasToIntersect.length === 1) {
16265
- zodSchema79 = schemasToIntersect[0];
16265
+ zodSchema80 = schemasToIntersect[0];
16266
16266
  } else {
16267
16267
  let result = z.intersection(schemasToIntersect[0], schemasToIntersect[1]);
16268
16268
  for (let i = 2; i < schemasToIntersect.length; i++) {
16269
16269
  result = z.intersection(result, schemasToIntersect[i]);
16270
16270
  }
16271
- zodSchema79 = result;
16271
+ zodSchema80 = result;
16272
16272
  }
16273
16273
  break;
16274
16274
  }
16275
16275
  const objectSchema = z.object(shape);
16276
16276
  if (schema.additionalProperties === false) {
16277
- zodSchema79 = objectSchema.strict();
16277
+ zodSchema80 = objectSchema.strict();
16278
16278
  } else if (typeof schema.additionalProperties === "object") {
16279
- zodSchema79 = objectSchema.catchall(convertSchema(schema.additionalProperties, ctx));
16279
+ zodSchema80 = objectSchema.catchall(convertSchema(schema.additionalProperties, ctx));
16280
16280
  } else {
16281
- zodSchema79 = objectSchema.passthrough();
16281
+ zodSchema80 = objectSchema.passthrough();
16282
16282
  }
16283
16283
  break;
16284
16284
  }
@@ -16289,29 +16289,29 @@ function convertBaseSchema(schema, ctx) {
16289
16289
  const tupleItems = prefixItems.map((item) => convertSchema(item, ctx));
16290
16290
  const rest = items && typeof items === "object" && !Array.isArray(items) ? convertSchema(items, ctx) : void 0;
16291
16291
  if (rest) {
16292
- zodSchema79 = z.tuple(tupleItems).rest(rest);
16292
+ zodSchema80 = z.tuple(tupleItems).rest(rest);
16293
16293
  } else {
16294
- zodSchema79 = z.tuple(tupleItems);
16294
+ zodSchema80 = z.tuple(tupleItems);
16295
16295
  }
16296
16296
  if (typeof schema.minItems === "number") {
16297
- zodSchema79 = zodSchema79.check(z.minLength(schema.minItems));
16297
+ zodSchema80 = zodSchema80.check(z.minLength(schema.minItems));
16298
16298
  }
16299
16299
  if (typeof schema.maxItems === "number") {
16300
- zodSchema79 = zodSchema79.check(z.maxLength(schema.maxItems));
16300
+ zodSchema80 = zodSchema80.check(z.maxLength(schema.maxItems));
16301
16301
  }
16302
16302
  } else if (Array.isArray(items)) {
16303
16303
  const tupleItems = items.map((item) => convertSchema(item, ctx));
16304
16304
  const rest = schema.additionalItems && typeof schema.additionalItems === "object" ? convertSchema(schema.additionalItems, ctx) : void 0;
16305
16305
  if (rest) {
16306
- zodSchema79 = z.tuple(tupleItems).rest(rest);
16306
+ zodSchema80 = z.tuple(tupleItems).rest(rest);
16307
16307
  } else {
16308
- zodSchema79 = z.tuple(tupleItems);
16308
+ zodSchema80 = z.tuple(tupleItems);
16309
16309
  }
16310
16310
  if (typeof schema.minItems === "number") {
16311
- zodSchema79 = zodSchema79.check(z.minLength(schema.minItems));
16311
+ zodSchema80 = zodSchema80.check(z.minLength(schema.minItems));
16312
16312
  }
16313
16313
  if (typeof schema.maxItems === "number") {
16314
- zodSchema79 = zodSchema79.check(z.maxLength(schema.maxItems));
16314
+ zodSchema80 = zodSchema80.check(z.maxLength(schema.maxItems));
16315
16315
  }
16316
16316
  } else if (items !== void 0) {
16317
16317
  const element = convertSchema(items, ctx);
@@ -16322,16 +16322,16 @@ function convertBaseSchema(schema, ctx) {
16322
16322
  if (typeof schema.maxItems === "number") {
16323
16323
  arraySchema = arraySchema.max(schema.maxItems);
16324
16324
  }
16325
- zodSchema79 = arraySchema;
16325
+ zodSchema80 = arraySchema;
16326
16326
  } else {
16327
- zodSchema79 = z.array(z.any());
16327
+ zodSchema80 = z.array(z.any());
16328
16328
  }
16329
16329
  break;
16330
16330
  }
16331
16331
  default:
16332
16332
  throw new Error(`Unsupported type: ${type}`);
16333
16333
  }
16334
- return zodSchema79;
16334
+ return zodSchema80;
16335
16335
  }
16336
16336
  function convertSchema(schema, ctx) {
16337
16337
  if (typeof schema === "boolean") {
@@ -73655,16 +73655,16 @@ function lookupExternalDeviceNow(id) {
73655
73655
  }
73656
73656
  return device;
73657
73657
  }
73658
- async function assertExternalCapability(namespace, device, capability36) {
73659
- assertExternalCapabilitySync(namespace, device, capability36);
73658
+ async function assertExternalCapability(namespace, device, capability37) {
73659
+ assertExternalCapabilitySync(namespace, device, capability37);
73660
73660
  }
73661
- function assertExternalCapabilitySync(namespace, device, capability36) {
73661
+ function assertExternalCapabilitySync(namespace, device, capability37) {
73662
73662
  const id = typeof device === "string" ? device : device.id;
73663
73663
  const externalDevice = isExternalId(id) ? lookupExternalDeviceNow(id) : externalClaimForNativeId(id);
73664
73664
  if (!externalDevice) return;
73665
- if (externalDevice.capabilities.has(capability36)) return;
73665
+ if (externalDevice.capabilities.has(capability37)) return;
73666
73666
  throw new FailureError(
73667
- `${namespace} is not available on '${externalDevice.name}': ${externalDevice.provider.name} did not grant the '${capability36}' capability for this device.`,
73667
+ `${namespace} is not available on '${externalDevice.name}': ${externalDevice.provider.name} did not grant the '${capability37}' capability for this device.`,
73668
73668
  {
73669
73669
  error_code: FAILURE_CODES.EXTERNAL_DEVICE_CAPABILITY_DENIED,
73670
73670
  error_kind: "unsupported",
@@ -94920,7 +94920,7 @@ var _CI_VENDOR_COUNT_FOR_TEST = vendors_default.length;
94920
94920
  var SESSION_ID = (0, import_node_crypto3.randomUUID)();
94921
94921
  function readCliVersion() {
94922
94922
  if (true) {
94923
- return "0.28.1-next.0";
94923
+ return "0.28.1-next.10";
94924
94924
  }
94925
94925
  return "0.0.0";
94926
94926
  }
@@ -96694,8 +96694,8 @@ async function simctlArgsForUdid(udid, args, options) {
96694
96694
  return [...simctlPrefix(await deviceSetForUdid(udid)), ...nativeArgs(udid, args)];
96695
96695
  }
96696
96696
  function assertSimctlEntitlement(udid, options) {
96697
- const capability36 = options?.granted ?? "simctl";
96698
- assertExternalCapabilitySync(capability36, udid, capability36);
96697
+ const capability37 = options?.granted ?? "simctl";
96698
+ assertExternalCapabilitySync(capability37, udid, capability37);
96699
96699
  }
96700
96700
  async function simctlTargetForUdid(udid, options) {
96701
96701
  assertSimctlEntitlement(udid, options);
@@ -97869,23 +97869,23 @@ var InvalidToolInputError = class extends Error {
97869
97869
  });
97870
97870
  }
97871
97871
  };
97872
- function platformMatrix(platform, capability36) {
97872
+ function platformMatrix(platform, capability37) {
97873
97873
  switch (platform) {
97874
97874
  case "ios":
97875
- return capability36.apple;
97875
+ return capability37.apple;
97876
97876
  case "ios-remote":
97877
- return capability36.appleRemote;
97877
+ return capability37.appleRemote;
97878
97878
  case "android":
97879
- return capability36.android;
97879
+ return capability37.android;
97880
97880
  case "chromium":
97881
- return capability36.chromium;
97881
+ return capability37.chromium;
97882
97882
  case "vega":
97883
- return capability36.vega;
97883
+ return capability37.vega;
97884
97884
  }
97885
97885
  }
97886
- function assertSupported(toolId, capability36, device) {
97887
- if (!capability36) return;
97888
- const matrix = platformMatrix(device.platform, capability36);
97886
+ function assertSupported(toolId, capability37, device) {
97887
+ if (!capability37) return;
97888
+ const matrix = platformMatrix(device.platform, capability37);
97889
97889
  if (!matrix) {
97890
97890
  throw new UnsupportedOperationError(toolId, device, `no ${device.platform} support declared`);
97891
97891
  }
@@ -97893,7 +97893,7 @@ function assertSupported(toolId, capability36, device) {
97893
97893
  if (!supported) {
97894
97894
  throw new UnsupportedOperationError(toolId, device, `kind '${device.kind}' not supported`);
97895
97895
  }
97896
- if (capability36.supports && !capability36.supports(device)) {
97896
+ if (capability37.supports && !capability37.supports(device)) {
97897
97897
  throw new UnsupportedOperationError(toolId, device, "supports() refiner rejected device");
97898
97898
  }
97899
97899
  }
@@ -116728,13 +116728,13 @@ function scheduleGroupSigkill(pid, graceMs, opts) {
116728
116728
  }, graceMs).unref();
116729
116729
  }
116730
116730
  async function pollPidsUntilGone(pids, opts) {
116731
- const isAlive = opts.isAlive ?? pidIsAlive;
116731
+ const isAlive2 = opts.isAlive ?? pidIsAlive;
116732
116732
  const sleep14 = opts.sleep ?? ((ms) => new Promise((resolve14) => setTimeout(resolve14, ms)));
116733
116733
  const maxPolls = Math.max(1, Math.ceil(opts.timeoutMs / opts.pollIntervalMs));
116734
- let remaining = pids.filter((pid) => isAlive(pid));
116734
+ let remaining = pids.filter((pid) => isAlive2(pid));
116735
116735
  for (let poll = 0; poll < maxPolls && remaining.length > 0; poll += 1) {
116736
116736
  await sleep14(opts.pollIntervalMs);
116737
- remaining = remaining.filter((pid) => isAlive(pid));
116737
+ remaining = remaining.filter((pid) => isAlive2(pid));
116738
116738
  }
116739
116739
  return remaining;
116740
116740
  }
@@ -117834,9 +117834,11 @@ var fs29 = __toESM(require("node:fs"));
117834
117834
  var path26 = __toESM(require("node:path"));
117835
117835
  var os12 = __toESM(require("node:os"));
117836
117836
  var MAX_ENTRIES = 5e4;
117837
+ var STALE_LOG_MS = 24 * 60 * 60 * 1e3;
117837
117838
  var CLUSTER_KEY_LENGTH = 80;
117838
117839
  var SOURCE_EXT = /\.(tsx?|jsx?|mjs|cjs)$/;
117839
117840
  var LINE_RE = /^\[L:(\d+)\] (\S+) (\S+)\s+(\S+) \| (.*)$/;
117841
+ var liveLogFiles = /* @__PURE__ */ new Set();
117840
117842
  var LogFileWriter = class {
117841
117843
  filePath;
117842
117844
  fd = null;
@@ -117850,7 +117852,9 @@ var LogFileWriter = class {
117850
117852
  const timestamp = Date.now();
117851
117853
  const dir = path26.join(os12.homedir(), ".argent", "tmp");
117852
117854
  fs29.mkdirSync(dir, { recursive: true });
117853
- this.filePath = path26.join(dir, `argent-logs-${port}-${timestamp}.log`);
117855
+ pruneStaleLogs(dir);
117856
+ this.filePath = path26.join(dir, `argent-logs-${port}-${timestamp}-p${process.pid}.log`);
117857
+ liveLogFiles.add(this.filePath);
117854
117858
  this.open();
117855
117859
  }
117856
117860
  open() {
@@ -117943,9 +117947,11 @@ var LogFileWriter = class {
117943
117947
  }
117944
117948
  return { entries: filtered, total };
117945
117949
  }
117946
- close() {
117950
+ /** `keepFile` leaves the log to the sweep, 24h after the close. */
117951
+ close({ keepFile = false } = {}) {
117947
117952
  if (this.closed) return;
117948
117953
  this.closed = true;
117954
+ liveLogFiles.delete(this.filePath);
117949
117955
  if (this.fd !== null) {
117950
117956
  try {
117951
117957
  fs29.closeSync(this.fd);
@@ -117953,12 +117959,47 @@ var LogFileWriter = class {
117953
117959
  }
117954
117960
  this.fd = null;
117955
117961
  }
117962
+ if (keepFile) {
117963
+ try {
117964
+ const now = /* @__PURE__ */ new Date();
117965
+ fs29.utimesSync(this.filePath, now, now);
117966
+ } catch {
117967
+ }
117968
+ return;
117969
+ }
117956
117970
  try {
117957
117971
  fs29.unlinkSync(this.filePath);
117958
117972
  } catch {
117959
117973
  }
117960
117974
  }
117961
117975
  };
117976
+ function pruneStaleLogs(dir) {
117977
+ const cutoff = Date.now() - STALE_LOG_MS;
117978
+ let names;
117979
+ try {
117980
+ names = fs29.readdirSync(dir);
117981
+ } catch {
117982
+ return;
117983
+ }
117984
+ for (const name of names) {
117985
+ const pid = Number(/^argent-logs-.*-p(\d+)\.log$/.exec(name)?.[1]);
117986
+ if (!pid) continue;
117987
+ const file2 = path26.join(dir, name);
117988
+ if (pid === process.pid ? liveLogFiles.has(file2) : isAlive(pid)) continue;
117989
+ try {
117990
+ if (fs29.statSync(file2).mtimeMs < cutoff) fs29.unlinkSync(file2);
117991
+ } catch {
117992
+ }
117993
+ }
117994
+ }
117995
+ function isAlive(pid) {
117996
+ try {
117997
+ process.kill(pid, 0);
117998
+ return true;
117999
+ } catch (err) {
118000
+ return err.code === "EPERM";
118001
+ }
118002
+ }
117962
118003
  function cleanSourceUrl(url2) {
117963
118004
  try {
117964
118005
  const { pathname } = new URL(url2);
@@ -117996,20 +118037,36 @@ var reaped = /* @__PURE__ */ new Map();
117996
118037
  function key(kind, deviceId) {
117997
118038
  return `${kind}:${deviceId.toLowerCase()}`;
117998
118039
  }
117999
- function recordReapedSession(kind, deviceId, salvage) {
118000
- const entry = { kind, deviceId, atMs: Date.now() };
118040
+ function recordReapedSession(kind, deviceIds, salvage, connectionLost = false) {
118041
+ const ids = [deviceIds].flat().filter((id) => id !== void 0);
118042
+ const entry = { kind, deviceId: ids[0], ids, atMs: Date.now() };
118001
118043
  if (salvage) entry.salvage = salvage;
118002
- reaped.set(key(kind, deviceId), entry);
118044
+ if (connectionLost) entry.connectionLost = true;
118045
+ for (const id of ids) reaped.set(key(kind, id), entry);
118003
118046
  }
118004
118047
  function takeReapedSession(kind, deviceId) {
118005
- const k = key(kind, deviceId);
118006
- const entry = reaped.get(k);
118007
- if (entry) reaped.delete(k);
118048
+ const entry = reaped.get(key(kind, deviceId));
118049
+ for (const id of entry?.ids ?? []) {
118050
+ if (reaped.get(key(kind, id)) === entry) reaped.delete(key(kind, id));
118051
+ }
118008
118052
  return entry;
118009
118053
  }
118054
+ function takeReapedSessionAnyId(kind, ids) {
118055
+ let first;
118056
+ for (const id of new Set(ids)) {
118057
+ if (id === void 0) continue;
118058
+ const entry = takeReapedSession(kind, id);
118059
+ first ??= entry;
118060
+ }
118061
+ return first;
118062
+ }
118010
118063
  function describeReapedSession(entry, what) {
118011
118064
  const secondsAgo = Math.max(0, Math.round((Date.now() - entry.atMs) / 1e3));
118012
- return `The ${what} for device ${entry.deviceId} was torn down ${secondsAgo}s ago \u2014 by a stop-all-simulator-servers, which reaps every service a device owns, or by another teardown that reaches the same services (a stop-simulator-server on Chromium, or a react-profiler-start reclaiming the session with force). One tool-server serves every agent using this argent install, so this may have been another agent rather than your own call. It was not a session that never started.` + (entry.salvage ? ` ${entry.salvage}` : "");
118065
+ const salvage = entry.salvage ? ` ${entry.salvage}` : "";
118066
+ if (entry.connectionLost) {
118067
+ return `The ${what} for device ${entry.deviceId} lost its connection ${secondsAgo}s ago \u2014 the app crashed or quit, or its debugger endpoint went away.${salvage}`;
118068
+ }
118069
+ return `The ${what} for device ${entry.deviceId} was torn down ${secondsAgo}s ago \u2014 by a stop-all-simulator-servers, which reaps every service a device owns, or by another teardown that reaches the same services (a stop-simulator-server on Chromium, or a react-profiler-start reclaiming the session with force). One tool-server serves every agent using this argent install, so this may have been another agent rather than your own call. It was not a session that never started.${salvage}`;
118013
118070
  }
118014
118071
 
118015
118072
  // ../tool-server/src/blueprints/chromium-js-runtime-debugger.ts
@@ -118174,14 +118231,17 @@ var chromiumJsRuntimeDebuggerBlueprint = {
118174
118231
  cdp.events.off("disconnected", onDisconnected);
118175
118232
  await consoleServer.close();
118176
118233
  const captured = logWriter.getStats().totalEntries;
118234
+ const keepFile = captured > 0 && !cdp.isConnected();
118177
118235
  if (captured > 0) {
118236
+ const entries = `${captured} captured console ${captured === 1 ? "entry" : "entries"}`;
118178
118237
  recordReapedSession(
118179
118238
  "js-runtime-debugger",
118180
118239
  device.id,
118181
- `The ${captured} captured console ${captured === 1 ? "entry" : "entries"} went with it \u2014 the log file is deleted on teardown, so this registry starts empty rather than the app having logged nothing.`
118240
+ keepFile ? `The log file with its ${entries} is kept at ${logWriter.getFilePath()}.` : `The ${entries} went with it \u2014 the log file is deleted on teardown, so this registry starts empty rather than the app having logged nothing.`,
118241
+ keepFile
118182
118242
  );
118183
118243
  }
118184
- logWriter.close();
118244
+ logWriter.close({ keepFile });
118185
118245
  },
118186
118246
  events
118187
118247
  };
@@ -119997,17 +120057,21 @@ var jsRuntimeDebuggerBlueprint = {
119997
120057
  api,
119998
120058
  dispose: async () => {
119999
120059
  const captured = logWriter.getStats().totalEntries;
120060
+ const keepFile = captured > 0 && !cdp.isConnected();
120000
120061
  if (captured > 0) {
120001
- const salvage = `The ${captured} captured console ${captured === 1 ? "entry" : "entries"} went with it \u2014 the log file is deleted on teardown, so this registry starts empty rather than the app having logged nothing.`;
120002
- recordReapedSession("js-runtime-debugger", deviceId, salvage);
120003
- if (api.logicalDeviceId && api.logicalDeviceId !== deviceId) {
120004
- recordReapedSession("js-runtime-debugger", api.logicalDeviceId, salvage);
120005
- }
120062
+ const entries = `${captured} captured console ${captured === 1 ? "entry" : "entries"}`;
120063
+ const salvage = keepFile ? `The log file with its ${entries} is kept at ${logWriter.getFilePath()}.` : `The ${entries} went with it \u2014 the log file is deleted on teardown, so this registry starts empty rather than the app having logged nothing.`;
120064
+ recordReapedSession(
120065
+ "js-runtime-debugger",
120066
+ [deviceId, api.logicalDeviceId],
120067
+ salvage,
120068
+ keepFile
120069
+ );
120006
120070
  }
120007
120071
  forgetDeviceAlias(api.logicalDeviceId);
120008
120072
  forgetLogicalKeyedDevice(deviceId);
120009
120073
  await consoleServer.close();
120010
- logWriter.close();
120074
+ logWriter.close({ keepFile });
120011
120075
  await cdp.disconnect();
120012
120076
  },
120013
120077
  events
@@ -122976,15 +123040,91 @@ Returns { restarted, bundleId }. Fails if the app is not installed.`,
122976
123040
  };
122977
123041
  }
122978
123042
 
123043
+ // ../tool-server/src/tools/terminate-app/index.ts
123044
+ var import_node_child_process28 = require("node:child_process");
123045
+ var import_node_util21 = require("node:util");
123046
+ init_zod();
123047
+ init_adb();
123048
+ var execFileAsync21 = (0, import_node_util21.promisify)(import_node_child_process28.execFile);
123049
+ var zodSchema12 = external_exports.object({
123050
+ udid: external_exports.string().min(1).describe("Target device id from `list-devices`."),
123051
+ bundleId: external_exports.string().min(1).regex(BUNDLE_ID_PATTERN, BUNDLE_ID_MESSAGE).describe("App identifier. iOS: bundle id. Android: package name.")
123052
+ });
123053
+ var capability4 = {
123054
+ apple: { simulator: true },
123055
+ appleRemote: { simulator: true },
123056
+ android: { emulator: true, device: true, unknown: true },
123057
+ vega: { vvd: true }
123058
+ };
123059
+ async function tolerateNotRunning(terminate) {
123060
+ try {
123061
+ await terminate;
123062
+ return true;
123063
+ } catch (err) {
123064
+ const e = err;
123065
+ if (/found nothing to terminate/i.test(`${e.stderr ?? ""} ${e.message ?? ""}`)) return false;
123066
+ throw err;
123067
+ }
123068
+ }
123069
+ var terminateAppTool = {
123070
+ id: "terminate-app",
123071
+ interaction: {
123072
+ startedMsg: ({ params }) => `Terminating ${params.bundleId}`,
123073
+ completedMsg: ({ params }) => `Terminated ${params.bundleId}`,
123074
+ failedMsg: ({ params, failureSignal: failureSignal2 }) => `Failed to terminate ${params.bundleId}: ${failureSignal2.error_code}`
123075
+ },
123076
+ description: `Stop a running app without relaunching it, for SDK callers.
123077
+ Use when a program needs the app closed between steps; agents use restart-app.
123078
+ Returns { terminated, bundleId }; terminated is false on iOS when the app was not running.
123079
+ Succeeds when the app is not running or not installed.`,
123080
+ hideFromMcp: true,
123081
+ zodSchema: zodSchema12,
123082
+ capability: capability4,
123083
+ services: () => ({}),
123084
+ execute: dispatchByPlatform({
123085
+ toolId: "terminate-app",
123086
+ capability: capability4,
123087
+ ios: {
123088
+ requires: ["xcrun"],
123089
+ handler: async (_services, { udid, bundleId }) => {
123090
+ const args = await simctlArgsForUdid(udid, ["terminate", udid, bundleId]);
123091
+ const terminated = await tolerateNotRunning(execFileAsync21("xcrun", args));
123092
+ return { terminated, bundleId };
123093
+ }
123094
+ },
123095
+ iosRemote: {
123096
+ requires: ["sim-remote"],
123097
+ handler: async (_services, { udid, bundleId }) => {
123098
+ const terminated = await tolerateNotRunning(remoteSimctl.terminate(udid, bundleId));
123099
+ return { terminated, bundleId };
123100
+ }
123101
+ },
123102
+ android: {
123103
+ requires: ["adb"],
123104
+ handler: async (_services, { udid, bundleId }) => {
123105
+ await adbShell(udid, `am force-stop ${shellQuote(bundleId)}`, { timeoutMs: 15e3 });
123106
+ return { terminated: true, bundleId };
123107
+ }
123108
+ },
123109
+ vega: {
123110
+ requires: ["vega"],
123111
+ handler: async (_services, { udid, bundleId }) => {
123112
+ await vegaDevice(udid, ["terminate-app", "-a", bundleId], { timeoutMs: 4e4 });
123113
+ return { terminated: true, bundleId };
123114
+ }
123115
+ }
123116
+ })
123117
+ };
123118
+
122979
123119
  // ../tool-server/src/tools/reinstall-app/index.ts
122980
123120
  init_zod();
122981
123121
 
122982
123122
  // ../tool-server/src/tools/reinstall-app/platforms/ios.ts
122983
- var import_node_child_process28 = require("node:child_process");
122984
- var import_node_util21 = require("node:util");
123123
+ var import_node_child_process29 = require("node:child_process");
123124
+ var import_node_util22 = require("node:util");
122985
123125
  var import_node_path16 = require("node:path");
122986
123126
  init_src2();
122987
- var execFileAsync21 = (0, import_node_util21.promisify)(import_node_child_process28.execFile);
123127
+ var execFileAsync22 = (0, import_node_util22.promisify)(import_node_child_process29.execFile);
122988
123128
  var iosImpl = {
122989
123129
  requires: ["xcrun"],
122990
123130
  handler: async (_services, params) => {
@@ -122992,11 +123132,11 @@ var iosImpl = {
122992
123132
  const absolute = (0, import_node_path16.resolve)(appPath);
122993
123133
  const { nativeId, prefix } = await simctlTargetForUdid(udid);
122994
123134
  try {
122995
- await execFileAsync21("xcrun", [...prefix, "uninstall", nativeId, bundleId]);
123135
+ await execFileAsync22("xcrun", [...prefix, "uninstall", nativeId, bundleId]);
122996
123136
  } catch {
122997
123137
  }
122998
123138
  try {
122999
- await execFileAsync21("xcrun", [...prefix, "install", nativeId, absolute]);
123139
+ await execFileAsync22("xcrun", [...prefix, "install", nativeId, absolute]);
123000
123140
  } catch (err) {
123001
123141
  throw new FailureError(
123002
123142
  `Failed to install iOS app bundle on ${udid}.`,
@@ -123113,7 +123253,7 @@ ${stderr}`;
123113
123253
  };
123114
123254
 
123115
123255
  // ../tool-server/src/tools/reinstall-app/index.ts
123116
- var zodSchema12 = external_exports.object({
123256
+ var zodSchema13 = external_exports.object({
123117
123257
  udid: external_exports.string().min(1).describe("Target device id from `list-devices` (iOS UDID or Android serial)."),
123118
123258
  bundleId: external_exports.string().regex(BUNDLE_ID_PATTERN, BUNDLE_ID_MESSAGE).describe(
123119
123259
  "App identifier that matches the bundle at `appPath`. iOS: bundle id (used to uninstall first). Android: package name (used to uninstall first; the install itself identifies the app from the APK). Vega: interactive component app id (e.g. com.example.app.main), used to uninstall first."
@@ -123122,7 +123262,7 @@ var zodSchema12 = external_exports.object({
123122
123262
  "Path to the app bundle. iOS: `.app` directory (e.g. ./build/.../MyApp.app). Android: `.apk` file (e.g. android/app/build/outputs/apk/debug/app-debug.apk). Vega: `.vpkg` file. Relative paths are resolved from the current working directory."
123123
123263
  )
123124
123264
  });
123125
- var capability4 = {
123265
+ var capability5 = {
123126
123266
  apple: { simulator: true, device: true },
123127
123267
  appleRemote: { simulator: true },
123128
123268
  android: { emulator: true, device: true, unknown: true },
@@ -123138,13 +123278,13 @@ var reinstallAppTool = {
123138
123278
  description: `Install or reinstall an app on the device. The previous installation (if any) is uninstalled first so app data and runtime permissions are cleared.
123139
123279
  Use for a full reinstall after rebuilding, or to start from a clean app state.
123140
123280
  Returns { reinstalled, bundleId }. Fails if the app path does not exist or the package does not match the platform (.app for iOS, .apk for Android, .vpkg for Vega).`,
123141
- zodSchema: zodSchema12,
123142
- capability: capability4,
123281
+ zodSchema: zodSchema13,
123282
+ capability: capability5,
123143
123283
  fileInputs: [{ target: "appPath", path: "${appPath}", kind: "tar-upload" }],
123144
123284
  services: () => ({}),
123145
123285
  execute: dispatchByPlatform({
123146
123286
  toolId: "reinstall-app",
123147
- capability: capability4,
123287
+ capability: capability5,
123148
123288
  ios: iosImpl,
123149
123289
  android: androidImpl3,
123150
123290
  iosDevice: iosDeviceImpl3,
@@ -123173,10 +123313,10 @@ var PERMISSION_NAMES = [
123173
123313
  ];
123174
123314
 
123175
123315
  // ../tool-server/src/tools/settings-permissions/platforms/ios.ts
123176
- var import_node_child_process29 = require("node:child_process");
123177
- var import_node_util22 = require("node:util");
123316
+ var import_node_child_process30 = require("node:child_process");
123317
+ var import_node_util23 = require("node:util");
123178
123318
  init_src2();
123179
- var execFileAsync22 = (0, import_node_util22.promisify)(import_node_child_process29.execFile);
123319
+ var execFileAsync23 = (0, import_node_util23.promisify)(import_node_child_process30.execFile);
123180
123320
  var SIMCTL_ACTION = {
123181
123321
  grant: "grant",
123182
123322
  deny: "revoke",
@@ -123201,7 +123341,7 @@ var NON_TCC_GRANT_NEEDS_INSTALL = /* @__PURE__ */ new Set([
123201
123341
  ]);
123202
123342
  var localBackend = {
123203
123343
  async run(udid, simctlAction, service, bundleId) {
123204
- await execFileAsync22(
123344
+ await execFileAsync23(
123205
123345
  "xcrun",
123206
123346
  await simctlArgsForUdid(udid, ["privacy", udid, simctlAction, service, bundleId]),
123207
123347
  { timeout: 3e4 }
@@ -123209,7 +123349,7 @@ var localBackend = {
123209
123349
  },
123210
123350
  async isInstalled(udid, bundleId) {
123211
123351
  try {
123212
- await execFileAsync22(
123352
+ await execFileAsync23(
123213
123353
  "xcrun",
123214
123354
  await simctlArgsForUdid(udid, ["get_app_container", udid, bundleId]),
123215
123355
  { timeout: 15e3 }
@@ -123435,7 +123575,7 @@ var androidImpl4 = {
123435
123575
  };
123436
123576
 
123437
123577
  // ../tool-server/src/tools/settings-permissions/index.ts
123438
- var zodSchema13 = external_exports.object({
123578
+ var zodSchema14 = external_exports.object({
123439
123579
  udid: external_exports.string().min(1).describe("Target device id from `list-devices` (iOS simulator UDID or Android serial)."),
123440
123580
  action: external_exports.enum(PERMISSION_ACTIONS).describe(
123441
123581
  "`grant` pre-authorizes the permission, `deny` refuses it, `reset` returns it to the not-yet-asked state so the app prompts on next use."
@@ -123452,7 +123592,7 @@ var permissionAction = {
123452
123592
  deny: { started: "Denying", completed: "Denied" },
123453
123593
  reset: { started: "Resetting", completed: "Reset" }
123454
123594
  };
123455
- var capability5 = {
123595
+ var capability6 = {
123456
123596
  // `simctl privacy` edits the simulator's TCC store; physical iPhones have no
123457
123597
  // equivalent host-side switch, hence no `device: true`.
123458
123598
  apple: { simulator: true },
@@ -123475,12 +123615,12 @@ Android: changes the mapped \`android.permission.*\` runtime permissions (reset
123475
123615
  Some permission changes terminate the app if it is running (system behavior on both platforms) \u2014 set permissions before launching, or relaunch after.
123476
123616
  Returns { action, permission, bundleId, applied, skipped? }: \`applied\` lists the platform-level services/permissions actually changed; \`skipped\` (Android) lists mapped permissions the package manager rejected, e.g. ones the manifest doesn't declare. Fails if nothing could be applied.`,
123477
123617
  searchHint: "grant deny reset revoke app permissions privacy camera microphone location settings",
123478
- zodSchema: zodSchema13,
123479
- capability: capability5,
123618
+ zodSchema: zodSchema14,
123619
+ capability: capability6,
123480
123620
  services: () => ({}),
123481
123621
  execute: dispatchByPlatform({
123482
123622
  toolId: "settings-permissions",
123483
- capability: capability5,
123623
+ capability: capability6,
123484
123624
  ios: iosImpl2,
123485
123625
  iosRemote: iosRemoteImpl4,
123486
123626
  android: androidImpl4
@@ -123492,8 +123632,8 @@ init_zod();
123492
123632
  init_device_info();
123493
123633
 
123494
123634
  // ../tool-server/src/tools/open-url/platforms/ios.ts
123495
- var import_node_child_process30 = require("node:child_process");
123496
- var import_node_util23 = require("node:util");
123635
+ var import_node_child_process31 = require("node:child_process");
123636
+ var import_node_util24 = require("node:util");
123497
123637
  init_src2();
123498
123638
 
123499
123639
  // ../tool-server/src/tools/open-url/deep-link-note.ts
@@ -123503,12 +123643,12 @@ function httpDeepLinkNote(url2) {
123503
123643
  }
123504
123644
 
123505
123645
  // ../tool-server/src/tools/open-url/platforms/ios.ts
123506
- var execFileAsync23 = (0, import_node_util23.promisify)(import_node_child_process30.execFile);
123646
+ var execFileAsync24 = (0, import_node_util24.promisify)(import_node_child_process31.execFile);
123507
123647
  var iosImpl3 = {
123508
123648
  requires: ["xcrun"],
123509
123649
  handler: async (_services, params) => {
123510
123650
  try {
123511
- await execFileAsync23(
123651
+ await execFileAsync24(
123512
123652
  "xcrun",
123513
123653
  await simctlArgsForUdid(params.udid, ["openurl", params.udid, params.url])
123514
123654
  );
@@ -123607,7 +123747,7 @@ var chromiumImpl2 = {
123607
123747
  };
123608
123748
 
123609
123749
  // ../tool-server/src/tools/open-url/index.ts
123610
- var zodSchema14 = external_exports.object({
123750
+ var zodSchema15 = external_exports.object({
123611
123751
  udid: external_exports.string().min(1).describe("Target device id from `list-devices` (iOS UDID, Android serial, or Chromium id)."),
123612
123752
  url: external_exports.string().describe(
123613
123753
  "URL or scheme to open (e.g. https://example.com, messages://, tel:555, geo:37.0,-122.0). For Chromium this navigates the renderer."
@@ -123624,7 +123764,7 @@ function safeDestination(value) {
123624
123764
  return "URL";
123625
123765
  }
123626
123766
  }
123627
- var capability6 = {
123767
+ var capability7 = {
123628
123768
  apple: { simulator: true, device: true },
123629
123769
  appleRemote: { simulator: true },
123630
123770
  android: { emulator: true, device: true, unknown: true },
@@ -123643,8 +123783,8 @@ Cross-platform schemes: https://, tel:, mailto:. iOS also: messages://, settings
123643
123783
  Deep-linking caveat: an https:// link opens the native app only when an installed app is verified for the link's domain (iOS Universal Links / Android App Links) \u2014 otherwise it opens in the browser, and on iOS simulators it may open in Safari even when the owning app is installed. To reliably open an installed app, use its custom scheme (scheme://path) or launch-app with its bundle id.
123644
123784
  On a physical iPhone, http(s) URLs default to Safari and any other scheme needs bundleId; the receiving app becomes the app under automation.
123645
123785
  Returns { opened, url, note? }. note carries the deep-linking caveat when a web URL was opened on a native device. Fails if no app is registered to handle the URI (iOS/Android) or the renderer rejects the navigation (Chromium).`,
123646
- zodSchema: zodSchema14,
123647
- capability: capability6,
123786
+ zodSchema: zodSchema15,
123787
+ capability: capability7,
123648
123788
  services: (params) => {
123649
123789
  const device = resolveDevice(params.udid);
123650
123790
  if (device.platform === "chromium") {
@@ -123654,7 +123794,7 @@ Returns { opened, url, note? }. note carries the deep-linking caveat when a web
123654
123794
  },
123655
123795
  execute: dispatchByPlatform({
123656
123796
  toolId: "open-url",
123657
- capability: capability6,
123797
+ capability: capability7,
123658
123798
  ios: iosImpl3,
123659
123799
  iosDevice: iosDeviceImpl4,
123660
123800
  android: androidImpl5,
@@ -123664,8 +123804,8 @@ Returns { opened, url, note? }. note carries the deep-linking caveat when a web
123664
123804
  };
123665
123805
 
123666
123806
  // ../tool-server/src/tools/screenshot/index.ts
123667
- var import_node_child_process31 = require("node:child_process");
123668
- var import_node_util24 = require("node:util");
123807
+ var import_node_child_process32 = require("node:child_process");
123808
+ var import_node_util25 = require("node:util");
123669
123809
  var os13 = __toESM(require("node:os"));
123670
123810
  var path29 = __toESM(require("node:path"));
123671
123811
  init_zod();
@@ -124237,8 +124377,8 @@ function scalePng(src, scale) {
124237
124377
 
124238
124378
  // ../tool-server/src/tools/screenshot/index.ts
124239
124379
  var fs35 = __toESM(require("node:fs/promises"));
124240
- var execFileAsync24 = (0, import_node_util24.promisify)(import_node_child_process31.execFile);
124241
- var zodSchema15 = external_exports.object({
124380
+ var execFileAsync25 = (0, import_node_util25.promisify)(import_node_child_process32.execFile);
124381
+ var zodSchema16 = external_exports.object({
124242
124382
  udid: external_exports.string().describe(
124243
124383
  "Target device id from `list-devices` (iOS UDID, Android serial, Apple TV UDID, Vega serial, or Chromium id)."
124244
124384
  ),
@@ -124255,7 +124395,7 @@ var zodSchema15 = external_exports.object({
124255
124395
  "Downscaling algorithm when scale<1 on Chromium. Defaults to lanczos3 (highest quality). Mirrors sim-server's wire enum. Ignored on physical iPhones."
124256
124396
  )
124257
124397
  });
124258
- var capability7 = {
124398
+ var capability8 = {
124259
124399
  apple: { simulator: true, device: true },
124260
124400
  appleRemote: { simulator: true },
124261
124401
  android: { emulator: true, device: true, unknown: true },
@@ -124278,11 +124418,11 @@ async function tvScreenshot(udid, scale, signal) {
124278
124418
  os13.tmpdir(),
124279
124419
  `argent-tv-screenshot-${udid.slice(0, 8)}-${process.hrtime.bigint()}.png`
124280
124420
  );
124281
- await execFileAsync24("xcrun", await simctlArgsForUdid(udid, ["io", udid, "screenshot", file2]), {
124421
+ await execFileAsync25("xcrun", await simctlArgsForUdid(udid, ["io", udid, "screenshot", file2]), {
124282
124422
  signal
124283
124423
  });
124284
124424
  if (scale < 1) {
124285
- await execFileAsync24("sips", ["-Z", String(await tvTargetLongSide(file2, scale)), file2], {
124425
+ await execFileAsync25("sips", ["-Z", String(await tvTargetLongSide(file2, scale)), file2], {
124286
124426
  signal
124287
124427
  }).catch(() => {
124288
124428
  });
@@ -124292,7 +124432,7 @@ async function tvScreenshot(udid, scale, signal) {
124292
124432
  async function tvTargetLongSide(file2, scale) {
124293
124433
  let longSide = 3840;
124294
124434
  try {
124295
- const { stdout } = await execFileAsync24("sips", ["-g", "pixelWidth", "-g", "pixelHeight", file2]);
124435
+ const { stdout } = await execFileAsync25("sips", ["-g", "pixelWidth", "-g", "pixelHeight", file2]);
124296
124436
  const width = Number(/pixelWidth:\s*(\d+)/.exec(stdout)?.[1]);
124297
124437
  const height = Number(/pixelHeight:\s*(\d+)/.exec(stdout)?.[1]);
124298
124438
  if (Number.isFinite(width) && Number.isFinite(height) && width > 0 && height > 0) {
@@ -124306,7 +124446,7 @@ async function downscalePngInPlace(file2, scale, signal) {
124306
124446
  if (scale >= 1) {
124307
124447
  return;
124308
124448
  }
124309
- await execFileAsync24("sips", ["-Z", String(await tvTargetLongSide(file2, scale)), file2], {
124449
+ await execFileAsync25("sips", ["-Z", String(await tvTargetLongSide(file2, scale)), file2], {
124310
124450
  signal
124311
124451
  }).catch(() => {
124312
124452
  });
@@ -124324,9 +124464,9 @@ Use when you need a baseline image before an interaction or to inspect the curre
124324
124464
  Fails if the simulator-server / emulator backend / Chromium CDP is not reachable for the given device.`,
124325
124465
  alwaysLoad: true,
124326
124466
  searchHint: "device simulator emulator chromium screen image capture baseline tvos apple tv",
124327
- zodSchema: zodSchema15,
124467
+ zodSchema: zodSchema16,
124328
124468
  outputHint: "image",
124329
- capability: capability7,
124469
+ capability: capability8,
124330
124470
  // No eager service: a tvOS udid classifies as iOS by shape, so declaring
124331
124471
  // simulator-server here would spawn it for a device it cannot drive and hang
124332
124472
  // on the ready timeout. Resolve the backend lazily instead.
@@ -124450,7 +124590,7 @@ async function assertChromiumWindowVisible(chromium, action) {
124450
124590
  // ../tool-server/src/tools/gesture-tap/index.ts
124451
124591
  init_device_info();
124452
124592
  var sleep2 = (ms) => new Promise((r) => setTimeout(r, ms));
124453
- var zodSchema16 = external_exports.object({
124593
+ var zodSchema17 = external_exports.object({
124454
124594
  udid: external_exports.string().describe("Target device id from `list-devices` (iOS UDID, Android serial, or Chromium id)."),
124455
124595
  x: external_exports.number().describe("Normalized horizontal position 0.0\u20131.0 (left=0, right=1), not pixels"),
124456
124596
  y: external_exports.number().describe("Normalized vertical position 0.0\u20131.0 (top=0, bottom=1), not pixels"),
@@ -124463,7 +124603,7 @@ function tapDescription(params, tense) {
124463
124603
  const action = count2 === 1 ? tense === "present" ? "Tapping" : "Tapped" : count2 === 2 ? tense === "present" ? "Double-tapping" : "Double-tapped" : `${tense === "present" ? "Tapping" : "Tapped"} ${count2} times`;
124464
124604
  return `${action} at (${Math.round(params.x * 100)}%, ${Math.round(params.y * 100)}%)`;
124465
124605
  }
124466
- var capability8 = {
124606
+ var capability9 = {
124467
124607
  apple: { simulator: true, device: true },
124468
124608
  appleRemote: { simulator: true },
124469
124609
  android: { emulator: true, device: true, unknown: true },
@@ -124499,8 +124639,8 @@ On a physical iPhone use \`describe\`; \`native-describe-screen\` is simulator-o
124499
124639
  Before tapping, determine the correct coordinates by using discovery tools \u2014 pick by platform: iOS / Android use \`describe\`, \`native-describe-screen\`, or \`debugger-component-tree\`; Chromium uses \`describe\` (the DOM walker), since the native and RN-specific discovery tools don't apply. More information in \`argent-device-interact\` skill`,
124500
124640
  alwaysLoad: true,
124501
124641
  searchHint: "tap press button element device simulator emulator chromium touch down up click",
124502
- zodSchema: zodSchema16,
124503
- capability: capability8,
124642
+ zodSchema: zodSchema17,
124643
+ capability: capability9,
124504
124644
  services: (params) => {
124505
124645
  const device = resolveDevice(params.udid);
124506
124646
  if (device.platform === "chromium") {
@@ -124565,7 +124705,7 @@ var MOMENTUM_FREE_EASE_EXPONENT = 3;
124565
124705
  var DEFAULT_DURATION_MS = 300;
124566
124706
  var MOMENTUM_FREE_MIN_DURATION_MS = 150;
124567
124707
  var MAX_DURATION_MS = 1e4;
124568
- var zodSchema17 = external_exports.object({
124708
+ var zodSchema18 = external_exports.object({
124569
124709
  udid: external_exports.string().describe("Target device id from `list-devices` (iOS UDID or Android serial)."),
124570
124710
  fromX: external_exports.number().describe("Start x: normalized 0.0\u20131.0 (not pixels; same as tap)"),
124571
124711
  fromY: external_exports.number().describe("Start y: normalized 0.0\u20131.0 (not pixels; same as tap)"),
@@ -124594,7 +124734,7 @@ var zodSchema17 = external_exports.object({
124594
124734
  path: ["durationMs"]
124595
124735
  }
124596
124736
  );
124597
- var capability9 = {
124737
+ var capability10 = {
124598
124738
  apple: { simulator: true, device: true },
124599
124739
  appleRemote: { simulator: true },
124600
124740
  android: { emulator: true, device: true, unknown: true }
@@ -124616,8 +124756,8 @@ Physical iOS: an edge gesture (back-swipe) needs fromX 0 exactly; durationMs set
124616
124756
  Pass momentum:false for a momentum-free swipe that lands where the finger lifts (little to no fling at the 300 default), when you need a deterministic scroll distance; it needs durationMs >= 150 and is rejected below that, a shorter ease-out leaving the OS too little wall clock to read the deceleration as a stop. At 150 it lands short of the lift point instead, and 2 of 47 runs still flung backwards. A plain swipe takes any duration up to 10000ms and is delivered as close to the speed it was authored as a 16ms frame allows: below ~32ms the whole travel lands in one or two frames, which the OS flings as hard as it flings anything. Returns { swiped: true, timestampMs }. On physical iOS, reactivated: true = app was re-fronted; re-describe. Fails if the simulator-server / emulator backend is not reachable for the given device.`,
124617
124757
  alwaysLoad: true,
124618
124758
  searchHint: "swipe scroll drag pan gesture device simulator emulator touch move",
124619
- zodSchema: zodSchema17,
124620
- capability: capability9,
124759
+ zodSchema: zodSchema18,
124760
+ capability: capability10,
124621
124761
  services: (params) => {
124622
124762
  const device = resolveDevice(params.udid);
124623
124763
  if (isIosPhysicalDevice(device)) {
@@ -124711,7 +124851,7 @@ Pass momentum:false for a momentum-free swipe that lands where the finger lifts
124711
124851
  init_zod();
124712
124852
  init_device_info();
124713
124853
  var sleep4 = (ms) => new Promise((r) => setTimeout(r, ms));
124714
- var zodSchema18 = external_exports.object({
124854
+ var zodSchema19 = external_exports.object({
124715
124855
  udid: external_exports.string().describe("Target Chromium device id from `list-devices` (chromium-cdp-<port>)."),
124716
124856
  x: external_exports.number().describe(
124717
124857
  "Anchor x: normalized 0.0\u20131.0 (fraction of window width, not pixels). The wheel events land here \u2014 put it over the element you want to scroll."
@@ -124736,7 +124876,7 @@ function scrollDirection(params) {
124736
124876
  if ((params.deltaY ?? 0) === 0) return horizontal;
124737
124877
  return `${vertical} and ${horizontal}`;
124738
124878
  }
124739
- var capability10 = {
124879
+ var capability11 = {
124740
124880
  chromium: { app: true }
124741
124881
  };
124742
124882
  var gestureScrollTool = {
@@ -124751,8 +124891,8 @@ Use when content is below/above the fold (describe shows off-screen elements wit
124751
124891
  Returns { scrolled: true, timestampMs }. Fails if the Chromium CDP session is not reachable for the given device.`,
124752
124892
  alwaysLoad: true,
124753
124893
  searchHint: "scroll wheel list page chromium mouse down up content fold",
124754
- zodSchema: zodSchema18,
124755
- capability: capability10,
124894
+ zodSchema: zodSchema19,
124895
+ capability: capability11,
124756
124896
  services: (params) => ({
124757
124897
  chromium: chromiumCdpRef(resolveDevice(params.udid))
124758
124898
  }),
@@ -124781,7 +124921,7 @@ var sleep5 = (ms) => new Promise((r) => setTimeout(r, ms));
124781
124921
  var MOMENTUM_FREE_EASE_EXPONENT2 = 3;
124782
124922
  var MOMENTUM_FREE_MIN_STEPS = 8;
124783
124923
  var MAX_DURATION_MS2 = 1e4;
124784
- var zodSchema19 = external_exports.object({
124924
+ var zodSchema20 = external_exports.object({
124785
124925
  udid: external_exports.string().describe("Target Chromium device id from `list-devices` (chromium-cdp-<port>)."),
124786
124926
  fromX: external_exports.number().describe("Press x: normalized 0.0\u20131.0 (fraction of window width, not pixels)."),
124787
124927
  fromY: external_exports.number().describe("Press y: normalized 0.0\u20131.0 (fraction of window height, not pixels)."),
@@ -124803,7 +124943,7 @@ var zodSchema19 = external_exports.object({
124803
124943
  "Retired: renamed to `momentum` with the opposite sense. Pass `momentum: false` for what `settle: true` meant; `settle: false` was the default, so drop the key."
124804
124944
  )
124805
124945
  });
124806
- var capability11 = {
124946
+ var capability12 = {
124807
124947
  chromium: { app: true }
124808
124948
  };
124809
124949
  var gestureDragTool = {
@@ -124818,8 +124958,8 @@ Use for slider thumbs, drag-and-drop, text selection, or draggable UI elements.
124818
124958
  Pass momentum:false for a momentum-free drag that decelerates into the release, so apps that compute a fling from the pointer stream read ~0 velocity and the drag ends where it was aimed instead of flinging past it (a durationMs under ~100ms is too short for the deceleration to suppress the fling entirely). Returns { dragged: true, timestampMs }. Fails if the Chromium CDP session is not reachable for the given device.`,
124819
124959
  alwaysLoad: true,
124820
124960
  searchHint: "drag drop slider mouse press move release chromium select",
124821
- zodSchema: zodSchema19,
124822
- capability: capability11,
124961
+ zodSchema: zodSchema20,
124962
+ capability: capability12,
124823
124963
  services: (params) => ({
124824
124964
  chromium: chromiumCdpRef(resolveDevice(params.udid))
124825
124965
  }),
@@ -124959,7 +125099,7 @@ var eventSchema = external_exports.object({
124959
125099
  y2: external_exports.number().optional().describe("Second touch y for two-finger gestures: normalized 0.0\u20131.0 (not pixels)"),
124960
125100
  delayMs: external_exports.number().optional().describe("Delay before this event in milliseconds (default 16ms \u2248 60fps)")
124961
125101
  });
124962
- var zodSchema20 = external_exports.object({
125102
+ var zodSchema21 = external_exports.object({
124963
125103
  udid: external_exports.string().describe("Target device id from `list-devices` (iOS UDID or Android serial)."),
124964
125104
  events: external_exports.array(eventSchema).describe(
124965
125105
  "Sequence of touch events; x/y (and optional second touch) are normalized 0.0\u20131.0, not pixels"
@@ -124968,7 +125108,7 @@ var zodSchema20 = external_exports.object({
124968
125108
  "Number of intermediate Move events to auto-insert between each pair of consecutive events. Smooths out gestures by linearly interpolating both primary (x,y) and secondary (x2,y2) coordinates. The delay is split evenly across interpolated frames. Default: no interpolation."
124969
125109
  )
124970
125110
  });
124971
- var capability12 = {
125111
+ var capability13 = {
124972
125112
  apple: { simulator: true, device: true },
124973
125113
  appleRemote: { simulator: true },
124974
125114
  android: { emulator: true, device: true, unknown: true }
@@ -125052,8 +125192,8 @@ Example pinch-to-zoom (with interpolate:10 for smoothness):
125052
125192
  events: [{"type":"Down","x":0.4,"y":0.5,"x2":0.6,"y2":0.5},
125053
125193
  {"type":"Up","x":0.2,"y":0.5,"x2":0.8,"y2":0.5}]
125054
125194
  interpolate: 10`,
125055
- zodSchema: zodSchema20,
125056
- capability: capability12,
125195
+ zodSchema: zodSchema21,
125196
+ capability: capability13,
125057
125197
  // Declare the runner only for a train execute can replay. A rejected train must not pay a runner cold start.
125058
125198
  services: (params) => {
125059
125199
  const device = resolveDevice(params.udid);
@@ -125093,7 +125233,7 @@ Example pinch-to-zoom (with interpolate:10 for smoothness):
125093
125233
  // ../tool-server/src/tools/gesture-pinch/index.ts
125094
125234
  init_zod();
125095
125235
  init_device_info();
125096
- var zodSchema21 = external_exports.object({
125236
+ var zodSchema22 = external_exports.object({
125097
125237
  udid: external_exports.string().describe("Target device id from `list-devices` (iOS UDID or Android serial)."),
125098
125238
  centerX: external_exports.number().describe(
125099
125239
  "Center of pinch, horizontal: normalized 0.0\u20131.0 (fraction of screen width, not pixels)"
@@ -125116,7 +125256,7 @@ var zodSchema21 = external_exports.object({
125116
125256
  angle: external_exports.number().optional().describe("Axis angle in degrees along which the fingers are placed (default 0 = horizontal)."),
125117
125257
  durationMs: external_exports.number().optional().describe("Total gesture duration in milliseconds (default 300)")
125118
125258
  });
125119
- var capability13 = {
125259
+ var capability14 = {
125120
125260
  apple: { simulator: true },
125121
125261
  appleRemote: { simulator: true },
125122
125262
  android: { emulator: true, device: true, unknown: true }
@@ -125133,8 +125273,8 @@ startDistance > endDistance = pinch in (zoom out). startDistance < endDistance =
125133
125273
  Typical values: startDistance 0.2, endDistance 0.6 for a zoom-in pinch at screen center.
125134
125274
  Auto-generates interpolated frames at ~60fps. The angle parameter controls the axis (0 = horizontal, 90 = vertical). Optional endCenterX/endCenterY drift the centroid linearly over the gesture (omitted = fixed center).
125135
125275
  Use when you need to zoom in or out on a map, image, or zoomable view. Returns { pinched: true, timestampMs }. Fails if the simulator-server / emulator backend is not reachable for the given device.`,
125136
- zodSchema: zodSchema21,
125137
- capability: capability13,
125276
+ zodSchema: zodSchema22,
125277
+ capability: capability14,
125138
125278
  services: (params) => ({
125139
125279
  simulatorServer: simulatorServerRef(resolveDevice(params.udid))
125140
125280
  }),
@@ -125173,7 +125313,7 @@ Use when you need to zoom in or out on a map, image, or zoomable view. Returns {
125173
125313
  // ../tool-server/src/tools/gesture-rotate/index.ts
125174
125314
  init_zod();
125175
125315
  init_device_info();
125176
- var zodSchema22 = external_exports.object({
125316
+ var zodSchema23 = external_exports.object({
125177
125317
  udid: external_exports.string().describe("Target device id from `list-devices` (iOS UDID or Android serial)."),
125178
125318
  centerX: external_exports.number().describe(
125179
125319
  "Center of rotation, horizontal: normalized 0.0\u20131.0 (fraction of screen width, not pixels)"
@@ -125198,7 +125338,7 @@ var zodSchema22 = external_exports.object({
125198
125338
  }).refine((p) => p.radius !== void 0 || p.radiusX !== void 0, {
125199
125339
  message: "Pass radius, or both radiusX and radiusY."
125200
125340
  });
125201
- var capability14 = {
125341
+ var capability15 = {
125202
125342
  apple: { simulator: true },
125203
125343
  appleRemote: { simulator: true },
125204
125344
  android: { emulator: true, device: true, unknown: true }
@@ -125224,8 +125364,8 @@ Auto-generates interpolated frames at ~60fps.
125224
125364
  Unlike gesture-pinch which moves fingers linearly to zoom, this orbits fingers in an arc to change orientation.
125225
125365
  Use when you need to rotate a map, image picker, or any rotateable UI element. Returns { rotated: true, timestampMs }. Fails if the simulator-server / emulator backend is not reachable for the given device.
125226
125366
  Size the orbit with radius, or with radiusX and radiusY together (the pair overrides radius); one half of the pair alone, or none of the three, is rejected.`,
125227
- zodSchema: zodSchema22,
125228
- capability: capability14,
125367
+ zodSchema: zodSchema23,
125368
+ capability: capability15,
125229
125369
  services: (params) => ({
125230
125370
  simulatorServer: simulatorServerRef(resolveDevice(params.udid))
125231
125371
  }),
@@ -125281,7 +125421,7 @@ Size the orbit with radius, or with radiusX and radiusY together (the pair overr
125281
125421
  init_zod();
125282
125422
  init_device_info();
125283
125423
  var sleep7 = (ms) => new Promise((r) => setTimeout(r, ms));
125284
- var zodSchema23 = external_exports.object({
125424
+ var zodSchema24 = external_exports.object({
125285
125425
  udid: external_exports.string().describe("Target device id from `list-devices` (iOS UDID or Android serial)."),
125286
125426
  button: external_exports.enum(["home", "back", "power", "volumeUp", "volumeDown", "appSwitch", "actionButton"]).describe("Hardware button to press")
125287
125427
  });
@@ -125295,7 +125435,7 @@ var BUTTONS_BY_PLATFORM = {
125295
125435
  // `vega`, so this entry only keeps the record total.
125296
125436
  "vega": /* @__PURE__ */ new Set([])
125297
125437
  };
125298
- var capability15 = {
125438
+ var capability16 = {
125299
125439
  apple: { simulator: true, device: true },
125300
125440
  appleRemote: { simulator: true },
125301
125441
  android: { emulator: true, device: true, unknown: true }
@@ -125322,8 +125462,8 @@ Supported buttons depend on the platform: home, back, power, volumeUp, volumeDow
125322
125462
  Use when you need to trigger hardware button events.
125323
125463
  Returns { pressed: buttonName }.
125324
125464
  Fails if the device backend is not reachable: the simulator-server for iOS, or \`adb\` for Android (Android presses are injected with \`adb shell input keyevent\`).`,
125325
- zodSchema: zodSchema23,
125326
- capability: capability15,
125465
+ zodSchema: zodSchema24,
125466
+ capability: capability16,
125327
125467
  // Declare only the service the resolved path actually consumes. The Android
125328
125468
  // path uses `adb`, so a sim-server here would spawn a service the tool never
125329
125469
  // uses (up to a 30s ready-wait) and could throw ServiceInitializationError
@@ -126014,7 +126154,7 @@ var vegaImpl4 = {
126014
126154
  };
126015
126155
 
126016
126156
  // ../tool-server/src/tools/keyboard/index.ts
126017
- var zodSchema24 = external_exports.object({
126157
+ var zodSchema25 = external_exports.object({
126018
126158
  udid: external_exports.string().describe(
126019
126159
  "Target device id from `list-devices` (iOS UDID, Android serial, Vega serial, or Chromium id)."
126020
126160
  ),
@@ -126028,7 +126168,7 @@ var zodSchema24 = external_exports.object({
126028
126168
  "Delay in ms between key presses (default 50). Ignored on Android phones/tablets (typed via `adb input text`, which has no per-key cadence), on Vega (text/keys injected in a single shot), on TV targets (Apple TV / Android TV type the whole string at the daemon's own cadence), and on physical iOS."
126029
126169
  )
126030
126170
  });
126031
- var capability16 = {
126171
+ var capability17 = {
126032
126172
  apple: { simulator: true, device: true },
126033
126173
  appleRemote: { simulator: true },
126034
126174
  android: { emulator: true, device: true, unknown: true },
@@ -126038,7 +126178,7 @@ var capability16 = {
126038
126178
  function createKeyboardTool(registry2) {
126039
126179
  const dispatch = dispatchByPlatform({
126040
126180
  toolId: "keyboard",
126041
- capability: capability16,
126181
+ capability: capability17,
126042
126182
  ios: makeIosImpl3(registry2),
126043
126183
  iosDevice: makeIosDeviceImpl(registry2),
126044
126184
  iosRemote: makeIosRemoteImpl(registry2),
@@ -126072,8 +126212,9 @@ A failure is not rolled back. An unsupported key name is always rejected before
126072
126212
  - key: presses a single named key (enter, escape, backspace, tab, arrow-up/down/left/right, f1-f12). NOT supported on TV targets; move focus with \`tv-remote\` instead. Physical iOS: only \`enter\` and \`backspace\`.
126073
126213
  On a TV target (runtimeKind 'tv') only \`text\` applies \u2014 focus a text field first (with \`tv-remote\`), then type into it (injected HID keyboard on Apple TV, \`adb input text\` on Android TV).
126074
126214
  One call does one action: pass text OR key, never both. To type and then press a key, send two \`keyboard\` steps in one \`run-sequence\` \u2014 { text: "hello" } then { key: "enter" } \u2014 which also keeps it to a single round-trip.`,
126075
- zodSchema: zodSchema24,
126076
- capability: capability16,
126215
+ zodSchema: zodSchema25,
126216
+ capability: capability17,
126217
+ alwaysLoad: true,
126077
126218
  searchHint: "type text keyboard input named key enter escape arrow tv vega fire tv search field hid leanback",
126078
126219
  services: () => ({}),
126079
126220
  execute: async (services, params, options) => {
@@ -126231,7 +126372,7 @@ function makeAndroidImpl2(registry2) {
126231
126372
  }
126232
126373
 
126233
126374
  // ../tool-server/src/tools/paste/index.ts
126234
- var capability17 = {
126375
+ var capability18 = {
126235
126376
  apple: { simulator: true },
126236
126377
  // A remote sim pastes over the MoQ transport (`simctl pbcopy` + ⌘V); the HTTP
126237
126378
  // clipboard route does not exist there.
@@ -126265,7 +126406,7 @@ function serializedPerDevice(deviceId, task) {
126265
126406
  function createPasteTool(registry2) {
126266
126407
  const dispatch = dispatchByPlatform({
126267
126408
  toolId: "paste",
126268
- capability: capability17,
126409
+ capability: capability18,
126269
126410
  ios: makeIosImpl4(registry2),
126270
126411
  iosRemote: makeIosRemoteImpl2(registry2),
126271
126412
  android: makeAndroidImpl2(registry2)
@@ -126283,7 +126424,7 @@ Tap the field first so it has focus. Returns { pasted: true }, plus via: "keyboa
126283
126424
  Supports \`{{secret:<NAME>}}\` placeholders like \`keyboard\`; the value is never echoed back.`,
126284
126425
  searchHint: "paste clipboard pasteboard otp 2fa code fill field",
126285
126426
  zodSchema: pasteZodSchema,
126286
- capability: capability17,
126427
+ capability: capability18,
126287
126428
  services: () => ({}),
126288
126429
  execute: async (services, params, options) => {
126289
126430
  const { text, secrets } = resolveSecretPlaceholders(params.text);
@@ -126302,11 +126443,11 @@ Supports \`{{secret:<NAME>}}\` placeholders like \`keyboard\`; the value is neve
126302
126443
  // ../tool-server/src/tools/rotate/index.ts
126303
126444
  init_zod();
126304
126445
  init_device_info();
126305
- var zodSchema25 = external_exports.object({
126446
+ var zodSchema26 = external_exports.object({
126306
126447
  udid: external_exports.string().describe("Target device id from `list-devices` (iOS UDID or Android serial)."),
126307
126448
  orientation: external_exports.enum(["Portrait", "LandscapeLeft", "LandscapeRight", "PortraitUpsideDown"]).describe("Target orientation")
126308
126449
  });
126309
- var capability18 = {
126450
+ var capability19 = {
126310
126451
  apple: { simulator: true },
126311
126452
  appleRemote: { simulator: true },
126312
126453
  android: { emulator: true, device: true, unknown: true }
@@ -126322,8 +126463,8 @@ var rotateTool = {
126322
126463
  Use to test layout in a different orientation. Re-run \`describe\` afterwards \u2014 frame coordinates change with the orientation.
126323
126464
  On an unfolded foldable iOS simulator (the iPhone Duo), the value sets the orientation of the device, not of the UI: \`Portrait\` gives a landscape UI and \`LandscapeLeft\` gives a portrait UI. To fold or unfold the device, use \`fold\`.
126324
126465
  Returns { orientation }. Fails if the target device is not booted.`,
126325
- zodSchema: zodSchema25,
126326
- capability: capability18,
126466
+ zodSchema: zodSchema26,
126467
+ capability: capability19,
126327
126468
  services: (params) => ({
126328
126469
  simulatorServer: simulatorServerRef(resolveDevice(params.udid))
126329
126470
  }),
@@ -126347,12 +126488,12 @@ var shakeZodSchema = external_exports.object({
126347
126488
  });
126348
126489
 
126349
126490
  // ../tool-server/src/tools/shake/platforms/ios.ts
126350
- var import_node_child_process33 = require("node:child_process");
126351
- var import_node_util25 = require("node:util");
126491
+ var import_node_child_process34 = require("node:child_process");
126492
+ var import_node_util26 = require("node:util");
126352
126493
  init_src2();
126353
126494
 
126354
126495
  // ../tool-server/src/utils/window-shake.ts
126355
- var import_node_child_process32 = require("node:child_process");
126496
+ var import_node_child_process33 = require("node:child_process");
126356
126497
  init_src();
126357
126498
  var MICROINTERACTIONS_FLAG = "microinteractions";
126358
126499
  var AMPLITUDE = 22;
@@ -126459,7 +126600,7 @@ end run
126459
126600
  }
126460
126601
  function runOsascript(script) {
126461
126602
  return new Promise((resolve14, reject) => {
126462
- const child = (0, import_node_child_process32.execFile)(
126603
+ const child = (0, import_node_child_process33.execFile)(
126463
126604
  "/usr/bin/osascript",
126464
126605
  ["-"],
126465
126606
  { timeout: OSASCRIPT_TIMEOUT_MS },
@@ -126552,7 +126693,7 @@ async function prepareHostWindowShake(target) {
126552
126693
  }
126553
126694
 
126554
126695
  // ../tool-server/src/tools/shake/platforms/ios.ts
126555
- var execFileAsync25 = (0, import_node_util25.promisify)(import_node_child_process33.execFile);
126696
+ var execFileAsync26 = (0, import_node_util26.promisify)(import_node_child_process34.execFile);
126556
126697
  var SHAKE_NOTIFICATION = "com.apple.UIKit.SimulatorShake";
126557
126698
  var SHAKE_INTERVAL_MS = 400;
126558
126699
  var sleep11 = (ms) => new Promise((r) => setTimeout(r, ms));
@@ -126594,7 +126735,7 @@ var iosImpl4 = {
126594
126735
  if (i > 0) await sleep11(SHAKE_INTERVAL_MS);
126595
126736
  shaker.begin();
126596
126737
  try {
126597
- await execFileAsync25("xcrun", args, { timeout: 15e3 });
126738
+ await execFileAsync26("xcrun", args, { timeout: 15e3 });
126598
126739
  } catch (err) {
126599
126740
  const error52 = err instanceof Error ? err : new Error(String(err));
126600
126741
  throw shakeFailure(udid, error52.message, error52);
@@ -126757,7 +126898,7 @@ var androidImpl6 = {
126757
126898
  };
126758
126899
 
126759
126900
  // ../tool-server/src/tools/shake/index.ts
126760
- var capability19 = {
126901
+ var capability20 = {
126761
126902
  // Simulator only: a physical iPhone's motion is real hardware, with no
126762
126903
  // host-side hook to fake it.
126763
126904
  apple: { simulator: true },
@@ -126791,13 +126932,13 @@ Works on local and remote (sim-remote) iOS simulators.
126791
126932
  Only phone/tablet simulators and emulators are supported.`,
126792
126933
  searchHint: "shake motion accelerometer undo typing dev menu gesture",
126793
126934
  zodSchema: shakeZodSchema,
126794
- capability: capability19,
126935
+ capability: capability20,
126795
126936
  // No simulator-server is resolved: `simctl`/`adb` are called directly, so a
126796
126937
  // tool that never uses one doesn't spawn it or wait for it to be ready.
126797
126938
  services: () => ({}),
126798
126939
  execute: dispatchByPlatform({
126799
126940
  toolId: "shake",
126800
- capability: capability19,
126941
+ capability: capability20,
126801
126942
  ios: iosImpl4,
126802
126943
  iosRemote: iosRemoteImpl6,
126803
126944
  android: androidImpl6
@@ -126811,7 +126952,7 @@ init_device_info();
126811
126952
  var POSTURES = ["closed", "half-open", "open"];
126812
126953
  var POSTURE_ANGLE = { "closed": 0, "half-open": 120, "open": 180 };
126813
126954
  var HINGE_REQUEST_TIMEOUT_MS = 3e4;
126814
- var zodSchema26 = external_exports.object({
126955
+ var zodSchema27 = external_exports.object({
126815
126956
  udid: external_exports.string().describe("Target device id from `list-devices` (a foldable iOS simulator UDID)."),
126816
126957
  posture: external_exports.enum(POSTURES).optional().describe(
126817
126958
  "Where to move the hinge: `closed` (0\xB0, the cover panel), `half-open` (120\xB0) or `open` (180\xB0, the inner panel). Exactly one of `posture` and `angle`."
@@ -126822,7 +126963,7 @@ var zodSchema26 = external_exports.object({
126822
126963
  }).refine((p) => p.posture === void 0 !== (p.angle === void 0), {
126823
126964
  message: "Pass exactly one of `posture` and `angle`."
126824
126965
  });
126825
- var capability20 = {
126966
+ var capability21 = {
126826
126967
  // Local simulators only. A remote (MoQ) simulator is driven on its main
126827
126968
  // screen and carries no hinge message; the server itself rejects a device
126828
126969
  // that is not foldable, with its own reason.
@@ -126891,8 +127032,8 @@ A fold between two angles that are not closed or open can keep the current panel
126891
127032
  Returns { activeScreen, screen: { id, panel, width, height }, posture?, hingeAngle, warning? }. screen names the active panel and gives its size in pixels. posture is set only at 0\xB0, 120\xB0 and 180\xB0. warning is set when argent cannot find the active panel, or when the device did not change to the expected panel.
126892
127033
  Fails if the device is not foldable or is a remote simulator.`,
126893
127034
  searchHint: "fold unfold hinge foldable duo posture open closed half-open panel screen",
126894
- zodSchema: zodSchema26,
126895
- capability: capability20,
127035
+ zodSchema: zodSchema27,
127036
+ capability: capability21,
126896
127037
  services: (params) => ({
126897
127038
  simulatorServer: simulatorServerRef(resolveDevice(params.udid))
126898
127039
  }),
@@ -127044,14 +127185,14 @@ var buttonSchema = external_exports.preprocess(
127044
127185
  ).describe(
127045
127186
  'A single TV-remote button, or a path of them run in one call. Buttons: up/down/left/right (D-pad), select (OK), back, home, menu, playPause, rewind, fastForward, next, previous, volumeUp, volumeDown, mute. The media-transport and volume keys work on Android TV and Vega; on the Apple TV simulator they are rejected (its HID stack ignores them) \u2014 the D-pad/select/back/menu/home/playPause core works on all three. For multi-step navigation pass an array, e.g. ["up","right","right","select"] \u2014 strongly prefer this over multiple `tv-remote` calls: the whole path runs in a single call.'
127046
127187
  );
127047
- var zodSchema27 = external_exports.object({
127188
+ var zodSchema28 = external_exports.object({
127048
127189
  udid: external_exports.string().describe("Target TV device id from `list-devices` (Apple TV, Android TV, or Vega)."),
127049
127190
  button: buttonSchema,
127050
127191
  repeat: external_exports.number().int().min(1).max(50).optional().describe(
127051
127192
  'Repeat the whole `button` value this many times (default 1). Compact for long same-button runs, e.g. { button: "down", repeat: 12 }.'
127052
127193
  )
127053
127194
  });
127054
- var capability21 = {
127195
+ var capability22 = {
127055
127196
  apple: { simulator: true },
127056
127197
  android: { emulator: true, device: true, unknown: true },
127057
127198
  vega: { vvd: true }
@@ -127075,12 +127216,12 @@ Returns { pressed, count }.`,
127075
127216
  // one round-trip at a time on the Apple/Android path — minutes of wall-clock.
127076
127217
  longRunning: true,
127077
127218
  searchHint: "tv remote dpad d-pad navigate focus up down left right select ok back home menu play pause rewind fast forward sequence path apple tv tvos android tv leanback vega fire tv",
127078
- zodSchema: zodSchema27,
127079
- capability: capability21,
127219
+ zodSchema: zodSchema28,
127220
+ capability: capability22,
127080
127221
  services: () => ({}),
127081
127222
  execute: dispatchByPlatform({
127082
127223
  toolId: "tv-remote",
127083
- capability: capability21,
127224
+ capability: capability22,
127084
127225
  ios: makeIosImpl5(registry2),
127085
127226
  android: makeAndroidImpl3(registry2),
127086
127227
  vega: vegaImpl5
@@ -127121,9 +127262,9 @@ async function invokeSubTool(registry2, ctx, toolId, args, extra) {
127121
127262
  }
127122
127263
  function describeNestedParamError(registry2, err, toolId, dispatchedArgs, authoredArgs) {
127123
127264
  if (getFailureSignal(err)?.error_code !== FAILURE_CODES.TOOL_INPUT_INVALID) return void 0;
127124
- const zodSchema79 = registry2.getTool(toolId)?.zodSchema;
127125
- if (!zodSchema79) return void 0;
127126
- const parsed = zodSchema79.safeParse(dispatchedArgs ?? {});
127265
+ const zodSchema80 = registry2.getTool(toolId)?.zodSchema;
127266
+ if (!zodSchema80) return void 0;
127267
+ const parsed = zodSchema80.safeParse(dispatchedArgs ?? {});
127127
127268
  if (parsed.success) return void 0;
127128
127269
  return `Invalid params for tool "${toolId}": ${describeParamIssues(parsed.error, authoredArgs)}`;
127129
127270
  }
@@ -133417,7 +133558,7 @@ function unmetUiWaitCause(result) {
133417
133558
  }
133418
133559
  var DEFAULT_TIMEOUT_MS3 = 5e3;
133419
133560
  var DEFAULT_POLL_INTERVAL_MS = 400;
133420
- var zodSchema28 = external_exports.object({
133561
+ var zodSchema29 = external_exports.object({
133421
133562
  udid: external_exports.string().min(1).describe("Target device id from `list-devices` (iOS UDID, Android serial, or Chromium id)."),
133422
133563
  condition: external_exports.enum(["exists", "visible", "hidden", "text"]).describe(
133423
133564
  "What to wait for. `exists`: selector is anywhere in the tree. `visible`: selector is present with a non-zero on-screen frame. `hidden`: selector is absent or zero-area. `text`: the first visible match in reading order (topmost), falling back to the first match overall if none is visible, contains (or, with textMatch `equals`, exactly matches) expectedText \u2014 if a loose selector hits several elements, only that one is checked, so narrow it to target the intended element."
@@ -133436,7 +133577,7 @@ var zodSchema28 = external_exports.object({
133436
133577
  `Max time to wait for the condition before giving up (default ${DEFAULT_TIMEOUT_MS3}).`
133437
133578
  ),
133438
133579
  pollIntervalMs: external_exports.number().int().min(50).max(5e3).optional().describe(`How often to re-check the tree (default ${DEFAULT_POLL_INTERVAL_MS}).`)
133439
- }).refine((p) => p.condition !== "text" || p.expectedText !== void 0, {
133580
+ }).strict().refine((p) => p.condition !== "text" || p.expectedText !== void 0, {
133440
133581
  message: "condition `text` requires expectedText",
133441
133582
  path: ["expectedText"]
133442
133583
  });
@@ -133465,7 +133606,7 @@ function timeoutCause(condition, lastTrustedReadAt, finalRead, pollIntervalMs) {
133465
133606
  );
133466
133607
  return darkTailMs > tolerance ? "unreadable" : "unmet";
133467
133608
  }
133468
- var capability22 = {
133609
+ var capability23 = {
133469
133610
  apple: { simulator: true, device: true },
133470
133611
  appleRemote: { simulator: true },
133471
133612
  android: { emulator: true, device: true, unknown: true },
@@ -133559,8 +133700,8 @@ tap/navigation to wait for the next screen, or before tapping an element that ap
133559
133700
  alwaysLoad: true,
133560
133701
  searchHint: "wait await poll until visible hidden exists text appears disappears timeout element condition settle",
133561
133702
  longRunning: true,
133562
- zodSchema: zodSchema28,
133563
- capability: capability22,
133703
+ zodSchema: zodSchema29,
133704
+ capability: capability23,
133564
133705
  services: (params) => {
133565
133706
  const device = resolveDevice(params.udid);
133566
133707
  if (device.platform === "chromium") {
@@ -133571,7 +133712,7 @@ tap/navigation to wait for the next screen, or before tapping an element that ap
133571
133712
  async execute(services, params, ctx) {
133572
133713
  const signal = ctx?.signal;
133573
133714
  const device = resolveDevice(params.udid);
133574
- assertSupported(AWAIT_UI_ELEMENT_TOOL_ID, capability22, device);
133715
+ assertSupported(AWAIT_UI_ELEMENT_TOOL_ID, capability23, device);
133575
133716
  if (device.platform === "ios") await ensureDeps(iosRequires);
133576
133717
  else if (device.platform === "ios-remote") await ensureDeps(["sim-remote"]);
133577
133718
  else if (device.platform === "android") await ensureDeps(androidRequires);
@@ -133648,7 +133789,7 @@ var ALLOWED_TOOLS = /* @__PURE__ */ new Set([
133648
133789
  "tv-remote",
133649
133790
  AWAIT_UI_ELEMENT_TOOL_ID
133650
133791
  ]);
133651
- var zodSchema29 = external_exports.object({
133792
+ var zodSchema30 = external_exports.object({
133652
133793
  udid: external_exports.string().describe(
133653
133794
  "Target device id from `list-devices` (iOS UDID, Android serial, Vega serial, or Chromium id) \u2014 shared across all steps."
133654
133795
  ),
@@ -133664,7 +133805,7 @@ var zodSchema29 = external_exports.object({
133664
133805
  })
133665
133806
  ).min(1).describe("Ordered list of interaction steps to execute sequentially")
133666
133807
  });
133667
- var capability23 = {
133808
+ var capability24 = {
133668
133809
  // Physical iOS is a valid outer target. Unsupported steps fail at their own gate, not the whole sequence.
133669
133810
  apple: { simulator: true, device: true },
133670
133811
  appleRemote: { simulator: true },
@@ -133746,8 +133887,8 @@ Stops on the first error (or unmet await-ui-element condition) and returns parti
133746
133887
  alwaysLoad: true,
133747
133888
  longRunning: true,
133748
133889
  searchHint: "batch sequence multiple gesture steps sequentially",
133749
- zodSchema: zodSchema29,
133750
- capability: capability23,
133890
+ zodSchema: zodSchema30,
133891
+ capability: capability24,
133751
133892
  // Each step resolves its own services. An eager resolver can't be used
133752
133893
  // because a tvOS udid shape-classifies as `ios` (there is no `tvos`
133753
133894
  // platform), so declaring simulator-server would spawn a controller it
@@ -133844,7 +133985,7 @@ function debuggerServiceRef(params) {
133844
133985
  }
133845
133986
 
133846
133987
  // ../tool-server/src/tools/debugger/debugger-connect.ts
133847
- var zodSchema30 = external_exports.object({
133988
+ var zodSchema31 = external_exports.object({
133848
133989
  port: metroPortField,
133849
133990
  device_id: external_exports.string().describe(
133850
133991
  "Device id from list-devices: iOS simulator UDID, Android serial, Vega serial (amazon-...), or Chromium device id (chromium-cdp-<port>). Pass this SAME id as device_id to every subsequent debugger-* call to pin them to this device. The returned logicalDeviceId is informational (Metro's own per-connection handle, absent on Vega); you do not switch to it \u2014 forwarding it still resolves here, but the list-devices id is the stable one."
@@ -133859,20 +134000,19 @@ var debuggerConnectTool = {
133859
134000
  },
133860
134001
  description: `Connect to a JS runtime CDP debugger.
133861
134002
  iOS / Android / Vega: connects to Metro's CDP endpoint on the given port. Chromium: re-uses the page CDP session opened by boot-device \u2014 port is ignored.
133862
- Returns connection info including port, projectRoot (empty on Chromium and on legacy Metro, e.g. Vega), deviceName, appName, logicalDeviceId (absent on Vega), and isNewDebugger. If already connected, returns the existing connection.
134003
+ Returns connection info including port, projectRoot (empty on Chromium and on legacy Metro, e.g. Vega), deviceName, appName, logicalDeviceId (absent on Vega), and isNewDebugger, plus a note naming the kept log file when the previous session ended because the app crashed. If already connected, returns the existing connection.
133863
134004
  Use when starting a debug session or before calling other debugger-* tools. Fails if the runtime is unreachable (Metro down, or Chromium CDP terminated).`,
133864
- zodSchema: zodSchema30,
134005
+ zodSchema: zodSchema31,
133865
134006
  capability: DEBUGGER_TOOL_CAPABILITY,
133866
134007
  services: (params) => ({
133867
134008
  debugger: debuggerServiceRef(params)
133868
134009
  }),
133869
134010
  async execute(services, params) {
133870
134011
  const api = services.debugger;
133871
- for (const id of new Set(
133872
- [params.device_id, api.logicalDeviceId].filter((v) => v !== void 0)
133873
- )) {
133874
- takeReapedSession("js-runtime-debugger", id);
133875
- }
134012
+ const reaped2 = takeReapedSessionAnyId("js-runtime-debugger", [
134013
+ params.device_id,
134014
+ api.logicalDeviceId
134015
+ ]);
133876
134016
  return {
133877
134017
  port: api.port,
133878
134018
  projectRoot: api.projectRoot,
@@ -133880,7 +134020,8 @@ Use when starting a debug session or before calling other debugger-* tools. Fail
133880
134020
  appName: api.appName,
133881
134021
  logicalDeviceId: api.logicalDeviceId,
133882
134022
  isNewDebugger: api.isNewDebugger,
133883
- connected: api.cdp.isConnected()
134023
+ connected: api.cdp.isConnected(),
134024
+ ...reaped2?.connectionLost ? { note: describeReapedSession(reaped2, "previous JS-runtime debugger session") } : {}
133884
134025
  };
133885
134026
  }
133886
134027
  };
@@ -133967,7 +134108,7 @@ function isDebuggerNotConnectedResult(toolId, result) {
133967
134108
  }
133968
134109
 
133969
134110
  // ../tool-server/src/tools/debugger/debugger-status.ts
133970
- var zodSchema31 = external_exports.object({
134111
+ var zodSchema32 = external_exports.object({
133971
134112
  port: metroPortField,
133972
134113
  device_id: external_exports.string().describe(
133973
134114
  "Device id from list-devices \u2014 the SAME id you passed to debugger-connect (iOS simulator UDID, Android serial, Vega serial, or Chromium device id). The logicalDeviceId debugger-connect returns also resolves here, but prefer the stable list-devices id."
@@ -133985,7 +134126,7 @@ function createDebuggerStatusTool(registry2) {
133985
134126
  Use when you need to verify connectivity before using other debugger tools. Never fails when the runtime is simply unreachable \u2014 it returns a discriminated result instead:
133986
134127
  - { status: "connected", ... } with port, projectRoot (empty on Chromium and on legacy Metro, e.g. Vega), deviceName, appName, logicalDeviceId (absent on Vega), isNewDebugger (false on the legacy inspector), connected flag, loadedScripts count, and sourceMapReady (always true \u2014 waits for pending source maps before returning; no-op on Chromium).
133987
134128
  - { status: "not_connected", connected: false, reason, detail, guidance } (port omitted on Chromium) when Metro is not running (reason "metro_not_running"), no app is attached ("no_app_connected"), the device_id matches no target ("device_mismatch"), the CDP endpoint is unreachable or answered malformed ("cdp_unreachable"), the runtime accepted the connection but never answered ("runtime_unresponsive"), the cached connection went stale ("stale_connection"), or a reconnect is in flight ("reconnecting"). Follow the guidance field \u2014 do not retry in a loop.`,
133988
- zodSchema: zodSchema31,
134129
+ zodSchema: zodSchema32,
133989
134130
  capability: DEBUGGER_TOOL_CAPABILITY,
133990
134131
  // Resolved manually in execute so a not-connected precondition becomes a
133991
134132
  // structured result instead of a tool failure.
@@ -134042,7 +134183,7 @@ Use when you need to verify connectivity before using other debugger tools. Neve
134042
134183
  // ../tool-server/src/tools/debugger/debugger-evaluate.ts
134043
134184
  init_zod();
134044
134185
  init_src2();
134045
- var zodSchema32 = external_exports.object({
134186
+ var zodSchema33 = external_exports.object({
134046
134187
  port: metroPortField,
134047
134188
  device_id: external_exports.string().describe(
134048
134189
  "Device id from list-devices \u2014 the SAME id you passed to debugger-connect (iOS simulator UDID, Android serial, Vega serial, or Chromium device id). The logicalDeviceId debugger-connect returns also resolves here, but prefer the stable list-devices id."
@@ -134058,7 +134199,7 @@ var debuggerEvaluateTool = {
134058
134199
  },
134059
134200
  description: `Execute arbitrary JavaScript in the app's JS runtime via CDP \u2014 Hermes on iOS / Android / Vega, V8 on Chromium.
134060
134201
  Returns the evaluation result as a JSON-serializable value, along with deviceName, appName, and logicalDeviceId for context. Use when you need to read app state, call app functions, or test logic at runtime. The result is serialized by value, so cyclic objects (many RN runtime values \u2014 fiber nodes, navigation refs, global \u2014 are cyclic) fail with a serialization error rather than returning silently. Fails if the expression throws or the runtime is not connected.`,
134061
- zodSchema: zodSchema32,
134202
+ zodSchema: zodSchema33,
134062
134203
  capability: DEBUGGER_TOOL_CAPABILITY,
134063
134204
  services: (params) => ({
134064
134205
  debugger: debuggerServiceRef(params)
@@ -134095,7 +134236,7 @@ Returns the evaluation result as a JSON-serializable value, along with deviceNam
134095
134236
  // ../tool-server/src/tools/debugger/debugger-reload-metro.ts
134096
134237
  init_zod();
134097
134238
  init_src2();
134098
- var zodSchema33 = external_exports.object({
134239
+ var zodSchema34 = external_exports.object({
134099
134240
  port: metroPortField,
134100
134241
  device_id: external_exports.string().describe(
134101
134242
  "Device id from list-devices \u2014 the SAME id you passed to debugger-connect (iOS simulator UDID or Android serial)."
@@ -134110,7 +134251,7 @@ var debuggerReloadMetroTool = {
134110
134251
  },
134111
134252
  description: `Restart the Metro JS bundle in the connected React Native app without restarting the native process.
134112
134253
  Use when you want to apply code changes or reset JS state. Returns { reloaded, port, method, deviceName, appName, logicalDeviceId } indicating which reload path was used and which device/app was targeted. Fails if Metro is not running on the given port.`,
134113
- zodSchema: zodSchema33,
134254
+ zodSchema: zodSchema34,
134114
134255
  // RN-only: reloading a Chromium page is a different operation from restarting
134115
134256
  // the Metro bundle, so it would need its own tool.
134116
134257
  capability: RN_ONLY_TOOL_CAPABILITY,
@@ -135047,7 +135188,7 @@ async function readTapAxes(registry2, app) {
135047
135188
  clearTimeout(timer);
135048
135189
  }
135049
135190
  }
135050
- var zodSchema34 = external_exports.object({
135191
+ var zodSchema35 = external_exports.object({
135051
135192
  port: metroPortField,
135052
135193
  device_id: external_exports.string().describe(
135053
135194
  "Device id from list-devices \u2014 the SAME id you passed to debugger-connect (iOS simulator UDID or Android serial)."
@@ -135096,7 +135237,7 @@ Set includeSkipped=true to see a summary of all filtered components.
135096
135237
  Use when you need tap coordinates for a React Native UI element. Returns a compact text tree with (tap: x,y) coords. Fails if Metro debugger is not connected.`,
135097
135238
  alwaysLoad: true,
135098
135239
  searchHint: "react native component tree discovery tap coordinates",
135099
- zodSchema: zodSchema34,
135240
+ zodSchema: zodSchema35,
135100
135241
  // RN-only: needs the React DevTools backend from the dev JS bundle. Chromium has
135101
135242
  // no equivalent — use `describe` there.
135102
135243
  capability: RN_ONLY_TOOL_CAPABILITY,
@@ -135574,7 +135715,7 @@ function filterInspectItems(items, includeSkipped = false) {
135574
135715
  }
135575
135716
  return result;
135576
135717
  }
135577
- var zodSchema35 = external_exports.object({
135718
+ var zodSchema36 = external_exports.object({
135578
135719
  port: metroPortField,
135579
135720
  device_id: external_exports.string().describe(
135580
135721
  "Device id from list-devices \u2014 the SAME id you passed to debugger-connect (iOS simulator UDID or Android serial)."
@@ -135612,7 +135753,7 @@ Uses getInspectorDataForViewAtPoint + _debugStack + Metro /symbolicate.
135612
135753
  Set resolveSourceMaps to false to skip symbolication and get raw bundled locations instead.
135613
135754
  Set includeSkipped=true to see filtered items annotated with skip reasons.
135614
135755
  Use when you need the source file and line for a component at a tap coordinate. Fails if the app is not connected or the coordinate is outside the screen.`,
135615
- zodSchema: zodSchema35,
135756
+ zodSchema: zodSchema36,
135616
135757
  // RN-only: needs React Native's internal getInspectorDataForViewAtPoint and
135617
135758
  // Metro's /symbolicate; the Chromium session has no source resolver.
135618
135759
  capability: RN_ONLY_TOOL_CAPABILITY,
@@ -135711,7 +135852,7 @@ Use when you need the source file and line for a component at a tap coordinate.
135711
135852
 
135712
135853
  // ../tool-server/src/tools/debugger/debugger-log-registry.ts
135713
135854
  init_zod();
135714
- var zodSchema36 = external_exports.object({
135855
+ var zodSchema37 = external_exports.object({
135715
135856
  port: metroPortField,
135716
135857
  device_id: external_exports.string().describe(
135717
135858
  "Device id from list-devices \u2014 the SAME id you passed to debugger-connect (iOS simulator UDID, Android serial, Vega serial, or Chromium device id). The logicalDeviceId debugger-connect returns also resolves here, but prefer the stable list-devices id."
@@ -135727,9 +135868,9 @@ function createDebuggerLogRegistryTool(registry2) {
135727
135868
  },
135728
135869
  description: `Get a summary of all console logs captured from the app's JS runtime.
135729
135870
  Returns the log file path, entry counts by level, and message clusters (grouped by similarity). Works against Hermes (iOS / Android / Vega) and V8 (Chromium).
135730
- Use when investigating warnings, errors, or unexpected output \u2014 call this first for an overview, then read the returned file for details. Returns empty stats if no log data has been captured yet \u2014 but check { note }, which is present only when the stats are empty BECAUSE a stop-all-simulator-servers tore the previous debugger session down and deleted its log file. Absent that note, empty really does mean the app has logged nothing.
135731
- When the debugger cannot be reached, this tool does not fail: it returns { status: "not_connected", reason, detail, guidance } with NO log file \u2014 follow the guidance (do not retry in a loop, and do not try to read a log file from this state). A "connected" result's stats may come from a session whose socket has since died \u2014 use debugger-status, not this tool, to judge debugger health.`,
135732
- zodSchema: zodSchema36,
135871
+ Use when investigating warnings, errors, or unexpected output \u2014 call this first for an overview, then read the returned file for details. Returns empty stats if no log data has been captured yet \u2014 but check { note }, which is present only when the stats are empty BECAUSE the previous debugger session ended: torn down (e.g. by stop-all-simulator-servers) with its log file deleted, or cut off by the app crashing with its log file kept at the path the note names. Absent that note, empty really does mean the app has logged nothing.
135872
+ When the debugger cannot be reached, this tool does not fail: it returns { status: "not_connected", reason, detail, guidance } with NO log file \u2014 follow the guidance (do not retry in a loop). Read a log file in this state only when a { note } names one kept from before the app crashed. A "connected" result's stats may come from a session whose socket has since died \u2014 use debugger-status, not this tool, to judge debugger health.`,
135873
+ zodSchema: zodSchema37,
135733
135874
  capability: DEBUGGER_TOOL_CAPABILITY,
135734
135875
  // Resolved manually in execute so a not-connected precondition becomes a
135735
135876
  // structured result instead of a service-resolution tool failure.
@@ -135749,16 +135890,11 @@ When the debugger cannot be reached, this tool does not fail: it returns { statu
135749
135890
  logicalDeviceId: api.logicalDeviceId
135750
135891
  };
135751
135892
  if (stats.totalEntries === 0) {
135752
- const aliases = [
135893
+ const reaped2 = takeReapedSessionAnyId("js-runtime-debugger", [
135753
135894
  canonicalDeviceId(params.device_id),
135754
135895
  params.device_id,
135755
135896
  api.logicalDeviceId
135756
- ].filter((id) => id !== void 0);
135757
- let reaped2;
135758
- for (const id of new Set(aliases)) {
135759
- const entry = takeReapedSession("js-runtime-debugger", id);
135760
- reaped2 ??= entry;
135761
- }
135897
+ ]);
135762
135898
  if (reaped2) response.note = describeReapedSession(reaped2, "JS-runtime debugger session");
135763
135899
  }
135764
135900
  return response;
@@ -135766,7 +135902,17 @@ When the debugger cannot be reached, this tool does not fail: it returns { statu
135766
135902
  const reason = classifyNotConnected(err);
135767
135903
  if (!reason) throw err;
135768
135904
  trackDebuggerOutcome("debugger-log-registry", reason, params, ctx);
135769
- return buildNotConnected(reason, err, params);
135905
+ const result = buildNotConnected(
135906
+ reason,
135907
+ err,
135908
+ params
135909
+ );
135910
+ const reaped2 = takeReapedSessionAnyId("js-runtime-debugger", [
135911
+ canonicalDeviceId(params.device_id),
135912
+ params.device_id
135913
+ ]);
135914
+ if (reaped2) result.note = describeReapedSession(reaped2, "JS-runtime debugger session");
135915
+ return result;
135770
135916
  }
135771
135917
  }
135772
135918
  };
@@ -135832,7 +135978,7 @@ function renderChromiumPage(records, pageIndexParam) {
135832
135978
 
135833
135979
  ${lines.join("\n")}`;
135834
135980
  }
135835
- var zodSchema37 = external_exports.object({
135981
+ var zodSchema38 = external_exports.object({
135836
135982
  port: metroPortField,
135837
135983
  device_id: external_exports.string().describe(
135838
135984
  "Device id from list-devices (iOS simulator UDID or Android serial) \u2014 the same id used with debugger-connect."
@@ -135854,7 +136000,7 @@ Each entry includes a requestId that can be passed to view-network-request-detai
135854
136000
  On React Native (iOS / Android / Vega) interception is injected into the JS runtime \u2014 it captures fetch() calls. On Chromium it reads the browser's native CDP Network domain (the active tab; all request types).
135855
136001
  Use when inspecting outbound HTTP traffic or debugging API calls in the running app.
135856
136002
  Fails if the app is not connected (RN) or the device is not reachable (Chromium).`,
135857
- zodSchema: zodSchema37,
136003
+ zodSchema: zodSchema38,
135858
136004
  capability: DEBUGGER_TOOL_CAPABILITY,
135859
136005
  services: (params) => {
135860
136006
  const device = resolveDevice(params.device_id);
@@ -135926,7 +136072,7 @@ function redactHeaders(headers) {
135926
136072
  return result;
135927
136073
  }
135928
136074
  var MAX_BODY_SIZE = 1e3;
135929
- var zodSchema38 = external_exports.object({
136075
+ var zodSchema39 = external_exports.object({
135930
136076
  port: metroPortField,
135931
136077
  device_id: external_exports.string().describe(
135932
136078
  "Device id from list-devices (iOS simulator UDID or Android serial) \u2014 the same id used with debugger-connect."
@@ -135945,7 +136091,7 @@ var networkRequestTool = {
135945
136091
  Returns request/response headers (sensitive headers redacted), status, timing, and optionally the response body.
135946
136092
  Large response bodies are truncated. Use when you need headers, body, or timing for a specific request after listing logs.
135947
136093
  Returns an error message string if the requestId is not found \u2014 use view-network-logs to get valid requestId values.`,
135948
- zodSchema: zodSchema38,
136094
+ zodSchema: zodSchema39,
135949
136095
  capability: DEBUGGER_TOOL_CAPABILITY,
135950
136096
  services: (params) => {
135951
136097
  const device = resolveDevice(params.device_id);
@@ -136260,7 +136406,7 @@ function withDescription(data) {
136260
136406
  if (data.hint) out.hint = data.hint;
136261
136407
  return out;
136262
136408
  }
136263
- var zodSchema39 = external_exports.object({
136409
+ var zodSchema40 = external_exports.object({
136264
136410
  udid: external_exports.string().min(1).describe(
136265
136411
  "Target device id from `list-devices` (iOS UDID, Android serial, Vega serial, or Chromium id)."
136266
136412
  ),
@@ -136268,7 +136414,7 @@ var zodSchema39 = external_exports.object({
136268
136414
  "Optional app bundle ID. Used as a target hint on iOS when the AX-service returns no elements and the describe tool falls back to native-devtools inspection. If omitted, the fallback auto-detects the frontmost connected app. Ignored on Android / Chromium, and on a physical iOS device."
136269
136415
  )
136270
136416
  });
136271
- var capability24 = {
136417
+ var capability25 = {
136272
136418
  apple: { simulator: true, device: true },
136273
136419
  appleRemote: { simulator: true },
136274
136420
  android: { emulator: true, device: true, unknown: true },
@@ -136278,7 +136424,7 @@ var capability24 = {
136278
136424
  function makeDescribeExecute(registry2) {
136279
136425
  return dispatchByPlatform({
136280
136426
  toolId: "describe",
136281
- capability: capability24,
136427
+ capability: capability25,
136282
136428
  ios: {
136283
136429
  requires: iosRequires,
136284
136430
  handler: async (_services, params, device) => (
@@ -136368,8 +136514,8 @@ since a TV UI has no tap coordinates. Move the highlight with \`tv-remote\` (up/
136368
136514
  back/menu/home), then call describe again to confirm where focus landed.`,
136369
136515
  alwaysLoad: true,
136370
136516
  searchHint: "accessibility element tree ui hierarchy tap coordinates ios android chromium vega dom tv tvos apple tv android tv fire tv focus focusable remote dpad",
136371
- zodSchema: zodSchema39,
136372
- capability: capability24,
136517
+ zodSchema: zodSchema40,
136518
+ capability: capability25,
136373
136519
  services: (params) => {
136374
136520
  const device = resolveDevice(params.udid);
136375
136521
  if (device.platform === "chromium") {
@@ -136846,10 +136992,10 @@ async function readAndroidUiTree(registry2, device) {
136846
136992
  }
136847
136993
 
136848
136994
  // ../tool-server/src/tools/ui-tree/index.ts
136849
- var zodSchema40 = external_exports.object({
136995
+ var zodSchema41 = external_exports.object({
136850
136996
  udid: external_exports.string().min(1).describe("Target device id from `list-devices`.")
136851
136997
  });
136852
- var capability25 = {
136998
+ var capability26 = {
136853
136999
  apple: { simulator: true },
136854
137000
  appleRemote: { simulator: true },
136855
137001
  android: { emulator: true, device: true, unknown: true }
@@ -136867,12 +137013,12 @@ Use when a program needs element ancestry, such as an e2e engine's scoped select
136867
137013
  Returns { schemaVersion, roots, truncated, alertVisible, keyboardVisible, foregroundApp, unsupportedFields }.
136868
137014
  Fails if the iOS ax-service predates the tree command; update argent.`,
136869
137015
  hideFromMcp: true,
136870
- zodSchema: zodSchema40,
136871
- capability: capability25,
137016
+ zodSchema: zodSchema41,
137017
+ capability: capability26,
136872
137018
  services: () => ({}),
136873
137019
  execute: dispatchByPlatform({
136874
137020
  toolId: "ui-tree",
136875
- capability: capability25,
137021
+ capability: capability26,
136876
137022
  ios: {
136877
137023
  requires: iosRequires,
136878
137024
  handler: async (_services, _params, device) => {
@@ -136904,7 +137050,7 @@ var AWAIT_SCREEN_IDLE_TOOL_ID = "await-screen-idle";
136904
137050
  var DEFAULT_TIMEOUT_MS4 = 3e3;
136905
137051
  var DEFAULT_POLL_INTERVAL_MS2 = 200;
136906
137052
  var DEFAULT_MIN_STABLE_MS = 250;
136907
- var zodSchema41 = external_exports.object({
137053
+ var zodSchema42 = external_exports.object({
136908
137054
  udid: external_exports.string().min(1).describe("Target device id from `list-devices` (iOS UDID, Android serial, or Chromium id)."),
136909
137055
  timeoutMs: external_exports.number().int().positive().max(12e4).optional().describe(
136910
137056
  `Max time to wait for the screen to settle before giving up (default ${DEFAULT_TIMEOUT_MS4}).`
@@ -136913,8 +137059,8 @@ var zodSchema41 = external_exports.object({
136913
137059
  minStableMs: external_exports.number().int().min(0).max(1e4).optional().describe(
136914
137060
  `The screen must hold the same content for at least this long to count as settled (default ${DEFAULT_MIN_STABLE_MS}).`
136915
137061
  )
136916
- });
136917
- var capability26 = {
137062
+ }).strict();
137063
+ var capability27 = {
136918
137064
  apple: { simulator: true, device: true },
136919
137065
  appleRemote: { simulator: true },
136920
137066
  android: { emulator: true, device: true, unknown: true },
@@ -136961,8 +137107,8 @@ ${DEFAULT_TIMEOUT_MS4}ms) is reached. Returns { settled, waitedMs, polls } \u201
136961
137107
  still before the timeout. Use after a launch/navigation to wait for the UI to render before screenshotting or tapping.`,
136962
137108
  searchHint: "wait until screen settles idle stable stops changing animation transition rendered ready before screenshot",
136963
137109
  longRunning: true,
136964
- zodSchema: zodSchema41,
136965
- capability: capability26,
137110
+ zodSchema: zodSchema42,
137111
+ capability: capability27,
136966
137112
  services: (params) => {
136967
137113
  const device = resolveDevice(params.udid);
136968
137114
  if (device.platform === "chromium") {
@@ -136972,7 +137118,7 @@ still before the timeout. Use after a launch/navigation to wait for the UI to re
136972
137118
  },
136973
137119
  async execute(services, params, ctx) {
136974
137120
  const device = resolveDevice(params.udid);
136975
- assertSupported(AWAIT_SCREEN_IDLE_TOOL_ID, capability26, device);
137121
+ assertSupported(AWAIT_SCREEN_IDLE_TOOL_ID, capability27, device);
136976
137122
  if (device.platform === "ios") await ensureDeps(iosRequires);
136977
137123
  else if (device.platform === "ios-remote") await ensureDeps(["sim-remote"]);
136978
137124
  else if (device.platform === "android") await ensureDeps(androidRequires);
@@ -137059,7 +137205,7 @@ function bootstrapFailureMessage(bootstrap) {
137059
137205
  // ../tool-server/src/tools/profiler/react/react-profiler-start.ts
137060
137206
  var NO_DEVTOOLS_HOOK_ERROR = "React DevTools hook (__REACT_DEVTOOLS_GLOBAL_HOOK__) is not present in this app's JavaScript runtime. React profiling requires a development build with React DevTools enabled. Likely causes: (1) the app is a release/production build \u2014 DevTools is stripped to reduce bundle size; (2) you connected to the wrong JS runtime; (3) this isn't a React (Native) app. Fix: rebuild in debug/dev mode (e.g. `npx react-native run-ios` without --configuration Release; for Expo, run a dev client). Once the app is running with DevTools attached, call react-profiler-start again.";
137061
137207
  var NO_RENDERERS_ATTACHED_ERROR = "React DevTools hook is present but no React renderer has registered yet. The hook is loaded but no fiber renderer has attached \u2014 typically because the app has not committed its first render, or the DevTools backend has not been bootstrapped on a bridgeless React Native dev build. Fix: ensure the app has rendered (interact with it once, then retry); if it stays empty, call react-profiler-start first \u2014 it will attempt to attach the DevTools backend automatically.";
137062
- var zodSchema42 = external_exports.object({
137208
+ var zodSchema43 = external_exports.object({
137063
137209
  port: metroPortField,
137064
137210
  device_id: external_exports.string().describe(
137065
137211
  "Device id from list-devices \u2014 the SAME id you passed to debugger-connect (iOS simulator UDID or Android serial)."
@@ -137091,7 +137237,7 @@ Before calling this, ask the user if they also want native profiling (native-pro
137091
137237
  After starting, ask the user to perform the interaction to profile, then call react-profiler-stop.
137092
137238
  Returns { started_at, startedAtEpochMs, hermes_version, detected_architecture } on success, or the already_running payload described above.
137093
137239
  Fails if the Hermes runtime is not reachable or the Metro CDP connection cannot be established.`,
137094
- zodSchema: zodSchema42,
137240
+ zodSchema: zodSchema43,
137095
137241
  capability: RN_ONLY_TOOL_CAPABILITY,
137096
137242
  services: () => ({}),
137097
137243
  async execute(_services, params) {
@@ -137362,7 +137508,7 @@ async function readCommitTree(path53) {
137362
137508
  }
137363
137509
 
137364
137510
  // ../tool-server/src/tools/profiler/react/react-profiler-stop.ts
137365
- var zodSchema43 = external_exports.object({
137511
+ var zodSchema44 = external_exports.object({
137366
137512
  port: metroPortField,
137367
137513
  device_id: external_exports.string().describe(
137368
137514
  "Device id from list-devices \u2014 the SAME id you passed to debugger-connect (iOS simulator UDID or Android serial)."
@@ -137451,7 +137597,7 @@ Call react-profiler-start first, then exercise the app, then call this.
137451
137597
  Returns { duration_ms, sample_count, fiber_renders_captured, total_react_commits, hot_commit_indices } summarizing the session.
137452
137598
  When any commit had fibers whose display name could not be resolved at stop time (typically transient components like modals/tooltips/animations that unmounted before stop), the response also includes { unattributed_ms, unattributed_fiber_count, unattributed_commit_count } \u2014 these quantify how much work is not accounted for in the per-component breakdown (the per-commit duration itself remains correct).
137453
137599
  Fails if no active profiling session exists or the CDP connection was lost during recording.`,
137454
- zodSchema: zodSchema43,
137600
+ zodSchema: zodSchema44,
137455
137601
  capability: RN_ONLY_TOOL_CAPABILITY,
137456
137602
  services: () => ({}),
137457
137603
  async execute(_services, params) {
@@ -137676,7 +137822,7 @@ Fails if no active profiling session exists or the CDP connection was lost durin
137676
137822
 
137677
137823
  // ../tool-server/src/tools/profiler/react/react-profiler-status.ts
137678
137824
  init_zod();
137679
- var zodSchema44 = external_exports.object({
137825
+ var zodSchema45 = external_exports.object({
137680
137826
  port: metroPortField,
137681
137827
  device_id: external_exports.string().describe(
137682
137828
  "Device logicalDeviceId from debugger-connect (iOS simulator UDID or Android logicalDeviceId)."
@@ -137691,7 +137837,7 @@ function createReactProfilerStatusTool(registry2) {
137691
137837
  failedMsg: ({ failureSignal: failureSignal2 }) => `Failed to check React profiler: ${failureSignal2.error_code}`
137692
137838
  },
137693
137839
  description: `Check the state of the React profiler session without side effects. Use after an interruption (debugger disconnect, unexpected error, agent pause) to decide whether to continue with react-profiler-stop, start a new session, or reconnect the debugger. Ownership is verified server-side against this tool-server's in-memory session \u2014 no token-threading is required. Returns { session_status, is_running, current_owner, \u2026 }. If this tool-server process restarted after react-profiler-start, status will report 'taken_over'; use react-profiler-start { force: true } to reclaim.`,
137694
- zodSchema: zodSchema44,
137840
+ zodSchema: zodSchema45,
137695
137841
  // RN-only: companion to react-profiler-start.
137696
137842
  capability: RN_ONLY_TOOL_CAPABILITY,
137697
137843
  services: () => ({}),
@@ -139305,7 +139451,7 @@ var annotationSchema = external_exports.object({
139305
139451
  ),
139306
139452
  label: external_exports.string().describe("Description of the action performed")
139307
139453
  });
139308
- var zodSchema45 = external_exports.object({
139454
+ var zodSchema46 = external_exports.object({
139309
139455
  port: metroPortField,
139310
139456
  device_id: external_exports.string().describe(
139311
139457
  "Device logicalDeviceId from debugger-connect (iOS simulator UDID or Android logicalDeviceId)."
@@ -139338,7 +139484,7 @@ where tapTimestampMs is the timestampMs returned by the tap/swipe tool and start
139338
139484
  is returned by react-profiler-start.
139339
139485
  Use when the profiling session is complete and you need to interpret the collected data.
139340
139486
  Fails if react-profiler-stop has not been called or no profiling data is stored.`,
139341
- zodSchema: zodSchema45,
139487
+ zodSchema: zodSchema46,
139342
139488
  // RN-only: reads commit data captured via the React DevTools backend, which
139343
139489
  // Chromium does not have.
139344
139490
  capability: RN_ONLY_TOOL_CAPABILITY,
@@ -139475,7 +139621,7 @@ Fails if react-profiler-stop has not been called or no profiling data is stored.
139475
139621
  // ../tool-server/src/tools/profiler/react/react-profiler-component-source.ts
139476
139622
  init_zod();
139477
139623
  var import_fs6 = require("fs");
139478
- var zodSchema46 = external_exports.object({
139624
+ var zodSchema47 = external_exports.object({
139479
139625
  component_name: external_exports.string().describe("Name of the React component to look up"),
139480
139626
  project_root: external_exports.string().describe("Absolute path to the RN project root")
139481
139627
  });
@@ -139493,7 +139639,7 @@ var reactProfilerComponentSourceTool = {
139493
139639
  Call this per-finding after react-profiler-analyze to inspect source before proposing a fix.
139494
139640
  Returns found: false if the component is not found in user-owned code (e.g. lives in node_modules).
139495
139641
  When several files define a component with the same name (e.g. platform variants like List.tsx and List.web.tsx), returns the primary match and lists the rest under otherMatches[] (file/line/col) \u2014 check it before assuming the returned file is the one you meant.`,
139496
- zodSchema: zodSchema46,
139642
+ zodSchema: zodSchema47,
139497
139643
  // Declared so the tool catalogue groups this with the other react-profiler-*
139498
139644
  // tools; the HTTP gate itself is a no-op here, as there is no device arg to
139499
139645
  // inspect.
@@ -139549,7 +139695,7 @@ When several files define a component with the same name (e.g. platform variants
139549
139695
  // ../tool-server/src/tools/profiler/react/react-profiler-cpu-summary.ts
139550
139696
  init_zod();
139551
139697
  init_src2();
139552
- var zodSchema47 = external_exports.object({
139698
+ var zodSchema48 = external_exports.object({
139553
139699
  port: metroPortField,
139554
139700
  device_id: external_exports.string().describe(
139555
139701
  "Device logicalDeviceId from debugger-connect (iOS simulator UDID or Android logicalDeviceId)."
@@ -139631,7 +139777,7 @@ Use when you specifically need to investigate JS CPU hotspots that are NOT tied
139631
139777
  Call react-profiler-stop first. Reads directly from the stored cpuProfile.
139632
139778
  Returns a markdown table of the top hotspot functions with self-time, total-time, and location.
139633
139779
  Fails if react-profiler-stop has not been called or no CPU profile is stored.`,
139634
- zodSchema: zodSchema47,
139780
+ zodSchema: zodSchema48,
139635
139781
  // RN-only: reads a Hermes CPU profile; Chromium's V8 sample format differs.
139636
139782
  capability: RN_ONLY_TOOL_CAPABILITY,
139637
139783
  services: () => ({}),
@@ -139727,7 +139873,7 @@ function renderMarkdownTable2(entries) {
139727
139873
  );
139728
139874
  return [header, sep5, ...rows].join("\n");
139729
139875
  }
139730
- var zodSchema48 = external_exports.object({
139876
+ var zodSchema49 = external_exports.object({
139731
139877
  port: metroPortField,
139732
139878
  device_id: external_exports.string().describe(
139733
139879
  "Device logicalDeviceId from debugger-connect (iOS simulator UDID or Android logicalDeviceId)."
@@ -139745,7 +139891,7 @@ var reactProfilerRendersTool = {
139745
139891
  Returns a markdown table of the top re-rendering components. No profiling session required \u2014 works on a live connected app.
139746
139892
  Use when you want a quick snapshot of render counts without a full profiling session.
139747
139893
  Fails if the React DevTools hook is not present in the runtime or the app is not connected.`,
139748
- zodSchema: zodSchema48,
139894
+ zodSchema: zodSchema49,
139749
139895
  // RN-only: queries the React DevTools backend hook on the live runtime.
139750
139896
  capability: RN_ONLY_TOOL_CAPABILITY,
139751
139897
  services: (params) => ({
@@ -139902,7 +140048,7 @@ function buildFiberTreeScript(maxDepth, filter) {
139902
140048
  }
139903
140049
  })()`;
139904
140050
  }
139905
- var zodSchema49 = external_exports.object({
140051
+ var zodSchema50 = external_exports.object({
139906
140052
  port: metroPortField,
139907
140053
  device_id: external_exports.string().describe(
139908
140054
  "Device logicalDeviceId from debugger-connect (iOS simulator UDID or Android logicalDeviceId)."
@@ -139921,7 +140067,7 @@ var reactProfilerFiberTreeTool = {
139921
140067
  Use when tracing ancestry of a library component or checking for useMemoCache hook (confirms React Compiler is active on a component).
139922
140068
  Returns a nested JSON tree of fiber nodes with name, tag, actualDuration, selfBaseDuration, and children.
139923
140069
  Fails if the React DevTools hook is not present or no fiber roots have been committed yet.`,
139924
- zodSchema: zodSchema49,
140070
+ zodSchema: zodSchema50,
139925
140071
  // RN-only: walks the fiber tree via the React DevTools backend hook.
139926
140072
  capability: RN_ONLY_TOOL_CAPABILITY,
139927
140073
  services: (params) => ({
@@ -140343,8 +140489,8 @@ var import_util8 = require("util");
140343
140489
  var DEFAULT_EXEC_TIMEOUT_MS = 6e4;
140344
140490
  var DEFAULT_EXEC_MAX_BUFFER = 256 * 1024 * 1024;
140345
140491
  async function execFileAsyncWithTimeout(file2, args, options = {}) {
140346
- const execFileAsync30 = (0, import_util8.promisify)(import_child_process2.execFile);
140347
- const { stdout, stderr } = await execFileAsync30(file2, args, {
140492
+ const execFileAsync31 = (0, import_util8.promisify)(import_child_process2.execFile);
140493
+ const { stdout, stderr } = await execFileAsync31(file2, args, {
140348
140494
  encoding: "utf-8",
140349
140495
  ...options,
140350
140496
  // Applied after ...options so a caller cannot weaken the guards; maxBuffer
@@ -143719,7 +143865,7 @@ function metroDeviceIdParam(description) {
143719
143865
  }
143720
143866
 
143721
143867
  // ../tool-server/src/tools/profiler/native-profiler/native-profiler-start.ts
143722
- var zodSchema50 = external_exports.object({
143868
+ var zodSchema51 = external_exports.object({
143723
143869
  device_id: metroDeviceIdParam(
143724
143870
  "Target device id from `list-devices` (iOS UDID or Android serial)."
143725
143871
  ),
@@ -143733,7 +143879,7 @@ var zodSchema50 = external_exports.object({
143733
143879
  "iOS-only. When true, cold-launches the app under the profiler with Malloc Stack Logging enabled so memory leaks carry an allocation backtrace (responsible frame + library). Without it, leaks are still detected but unattributable \u2014 Instruments reports '<Call stack limit reached>'. Trade-offs: this RESTARTS the app (current state is lost), adds memory/CPU overhead, and makes the app noticeably slow to launch (every startup allocation records a backtrace), so leave it off for pure CPU/hang profiling. Requires a non-degraded Xcode: on Xcode 26.4 and later the cold-launch path is broken, so the call is rejected up front (re-run without the flag, or set ARGENT_IOS_CAPTURE=device to override if the device path works on your host). ARGENT_IOS_CAPTURE=all-processes \u2014 e.g. exported globally for the normal capture path \u2014 also rejects this flag up front, since that fallback cannot cold-launch; unset it (or set it to device) first. Ignored on Android."
143734
143880
  )
143735
143881
  });
143736
- var capability27 = {
143882
+ var capability28 = {
143737
143883
  apple: { simulator: true },
143738
143884
  android: { emulator: true, device: true, unknown: true }
143739
143885
  };
@@ -143744,21 +143890,21 @@ var nativeProfilerStartTool = {
143744
143890
  completedMsg: () => "Started native profiler",
143745
143891
  failedMsg: ({ failureSignal: failureSignal2 }) => `Failed to start native profiler: ${failureSignal2.error_code}`
143746
143892
  },
143747
- capability: capability27,
143893
+ capability: capability28,
143748
143894
  description: `Start native profiling on a booted device. iOS: Instruments via xctrace (CPU, hangs, memory). Android: Perfetto (CPU, jank, RSS-growth weak signal).
143749
143895
  Auto-detects the running app process unless app_process is explicitly provided.
143750
143896
  After starting, let the user interact with the app, then call native-profiler-stop.
143751
143897
  Use when you want to capture native CPU, hang, and memory data for a running app.
143752
143898
  Returns { status, pid, traceFile } confirming the recording has started.
143753
143899
  Fails if no app is running on the device, or the profiler cannot attach to the process.`,
143754
- zodSchema: zodSchema50,
143900
+ zodSchema: zodSchema51,
143755
143901
  services: (params) => ({
143756
143902
  session: nativeProfilerSessionRef(resolveDevice(params.device_id))
143757
143903
  }),
143758
143904
  async execute(services, params) {
143759
143905
  const api = services.session;
143760
143906
  const device = resolveDevice(params.device_id);
143761
- assertSupported("native-profiler-start", capability27, device);
143907
+ assertSupported("native-profiler-start", capability28, device);
143762
143908
  if (api.platform === "ios") {
143763
143909
  await ensureDeps(["xcrun"]);
143764
143910
  return startNativeProfilerIos(api, params);
@@ -143771,12 +143917,12 @@ Fails if no app is running on the device, or the profiler cannot attach to the p
143771
143917
  // ../tool-server/src/tools/profiler/native-profiler/native-profiler-stop.ts
143772
143918
  init_zod();
143773
143919
  init_device_info();
143774
- var zodSchema51 = external_exports.object({
143920
+ var zodSchema52 = external_exports.object({
143775
143921
  device_id: metroDeviceIdParam(
143776
143922
  "Target device id from `list-devices` (iOS UDID or Android serial)."
143777
143923
  )
143778
143924
  });
143779
- var capability28 = {
143925
+ var capability29 = {
143780
143926
  apple: { simulator: true },
143781
143927
  android: { emulator: true, device: true, unknown: true }
143782
143928
  };
@@ -143804,7 +143950,7 @@ var nativeProfilerStopTool = {
143804
143950
  completedMsg: ({ result }) => `Saved native profile ${result.traceFile.filename}`,
143805
143951
  failedMsg: ({ failureSignal: failureSignal2 }) => `Failed to stop native profiler: ${failureSignal2.error_code}`
143806
143952
  },
143807
- capability: capability28,
143953
+ capability: capability29,
143808
143954
  // Packaging plus the export passes routinely exceed the 30s MCP fetch timeout.
143809
143955
  longRunning: true,
143810
143956
  description: `Stop native profiling and export trace data.
@@ -143814,14 +143960,14 @@ Call native-profiler-start first.
143814
143960
  Use when the user has finished the interaction to profile and you need to export the trace.
143815
143961
  Returns { traceFile, exportedFiles, exportDiagnostics? }; traceFile is the raw trace bundle and exportedFiles the exports, all downloadable artifacts materialized to local paths.
143816
143962
  Fails if no active native-profiler-start session exists for the given device_id.`,
143817
- zodSchema: zodSchema51,
143963
+ zodSchema: zodSchema52,
143818
143964
  services: (params) => ({
143819
143965
  session: nativeProfilerSessionRef(resolveDevice(params.device_id))
143820
143966
  }),
143821
143967
  async execute(services, params, ctx) {
143822
143968
  const api = services.session;
143823
143969
  const device = resolveDevice(params.device_id);
143824
- assertSupported("native-profiler-stop", capability28, device);
143970
+ assertSupported("native-profiler-stop", capability29, device);
143825
143971
  if (api.platform === "ios") {
143826
143972
  await ensureDeps(["xcrun"]);
143827
143973
  const ios = await stopNativeProfilerIos(api);
@@ -143849,12 +143995,12 @@ Fails if no active native-profiler-start session exists for the given device_id.
143849
143995
  // ../tool-server/src/tools/profiler/native-profiler/native-profiler-analyze.ts
143850
143996
  init_zod();
143851
143997
  init_device_info();
143852
- var zodSchema52 = external_exports.object({
143998
+ var zodSchema53 = external_exports.object({
143853
143999
  device_id: metroDeviceIdParam(
143854
144000
  "Target device id from `list-devices` (iOS UDID or Android serial)."
143855
144001
  )
143856
144002
  });
143857
- var capability29 = {
144003
+ var capability30 = {
143858
144004
  apple: { simulator: true },
143859
144005
  android: { emulator: true, device: true, unknown: true }
143860
144006
  };
@@ -143865,7 +144011,7 @@ var nativeProfilerAnalyzeTool = {
143865
144011
  completedMsg: () => "Analyzed native profile",
143866
144012
  failedMsg: ({ failureSignal: failureSignal2 }) => `Failed to analyze native profile: ${failureSignal2.error_code}`
143867
144013
  },
143868
- capability: capability29,
144014
+ capability: capability30,
143869
144015
  // Parsing a trace from a recording up to RECORDING_CAP_MS long routinely exceeds
143870
144016
  // the 30s MCP fetch timeout, and an aborted call is replayed, not cancelled.
143871
144017
  longRunning: true,
@@ -143878,14 +144024,14 @@ profiler-stack-query for hang stacks, CPU context, leak details) or implement fi
143878
144024
  Call native-profiler-stop first to export the trace data.
143879
144025
  Use when you need to interpret a completed native profiling recording.
143880
144026
  Fails if native-profiler-stop has not been called first to export trace data.`,
143881
- zodSchema: zodSchema52,
144027
+ zodSchema: zodSchema53,
143882
144028
  services: (params) => ({
143883
144029
  session: nativeProfilerSessionRef(resolveDevice(params.device_id))
143884
144030
  }),
143885
144031
  async execute(services, params, ctx) {
143886
144032
  const api = services.session;
143887
144033
  const device = resolveDevice(params.device_id);
143888
- assertSupported("native-profiler-analyze", capability29, device);
144034
+ assertSupported("native-profiler-analyze", capability30, device);
143889
144035
  let result;
143890
144036
  if (api.platform === "ios") {
143891
144037
  await ensureDeps(["xcrun"]);
@@ -144388,7 +144534,7 @@ var WATERMARK_PNG_HEIGHT = 277;
144388
144534
  var WATERMARK_PNG_BASE64 = "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";
144389
144535
 
144390
144536
  // ../tool-server/src/tools/screen-recording/watermark.ts
144391
- var execFileAsync26 = (0, import_util9.promisify)(import_child_process6.execFile);
144537
+ var execFileAsync27 = (0, import_util9.promisify)(import_child_process6.execFile);
144392
144538
  var OUTPUT_FPS = 30;
144393
144539
  var FFMPEG_FALLBACK_PATHS = [
144394
144540
  "/opt/homebrew/bin/ffmpeg",
@@ -144405,7 +144551,7 @@ var MASK_DARK_MAX_LUMA = 90;
144405
144551
  var MASK_LIGHT_MIN_LUMA = 165;
144406
144552
  async function resolveBinary(name, fallbacks) {
144407
144553
  try {
144408
- await execFileAsync26("/bin/sh", ["-c", `command -v ${name}`], { timeout: 2e3 });
144554
+ await execFileAsync27("/bin/sh", ["-c", `command -v ${name}`], { timeout: 2e3 });
144409
144555
  return name;
144410
144556
  } catch {
144411
144557
  }
@@ -144948,7 +145094,7 @@ var DEFAULT_TIME_LIMIT_SECONDS = 180;
144948
145094
  var MAX_TIME_LIMIT_SECONDS = 600;
144949
145095
  var POINTER_TRAIL_LENGTH = 8;
144950
145096
  var POINTER_REQUEST_TIMEOUT_MS = 2e3;
144951
- var zodSchema53 = external_exports.object({
145097
+ var zodSchema54 = external_exports.object({
144952
145098
  udid: external_exports.string().describe("Target device id from `list-devices` (iOS Simulator UDID or Android serial)."),
144953
145099
  timeLimitSeconds: external_exports.number().int().min(1).max(MAX_TIME_LIMIT_SECONDS).optional().describe(
144954
145100
  `Auto-stop cap in seconds (default ${DEFAULT_TIME_LIMIT_SECONDS}, max ${MAX_TIME_LIMIT_SECONDS}). Set it to slightly more than the interaction you plan to capture.`
@@ -144960,7 +145106,7 @@ var zodSchema53 = external_exports.object({
144960
145106
  "Default true. Draw simulator-server's touch visualizer into the recording: a pulse marks each tap, a comet trail follows swipes and drags, and paired markers show two-finger pinch/rotate, so the video makes clear where every interaction landed. Set false to record the raw screen with no overlay."
144961
145107
  )
144962
145108
  });
144963
- var capability30 = {
145109
+ var capability31 = {
144964
145110
  apple: { simulator: true },
144965
145111
  android: { emulator: true, device: true, unknown: true }
144966
145112
  };
@@ -144972,7 +145118,7 @@ function createScreenRecordingStartTool(registry2) {
144972
145118
  completedMsg: () => "Started screen recording",
144973
145119
  failedMsg: ({ failureSignal: failureSignal2 }) => `Failed to start screen recording: ${failureSignal2.error_code}`
144974
145120
  },
144975
- capability: capability30,
145121
+ capability: capability31,
144976
145122
  description: `Start recording the device screen to a video file (h264 mp4, 30fps at the device's native resolution).
144977
145123
  By default stretches where the screen does not change are trimmed out (see trimStatic), so a long session with only brief activity comes back as a short clip instead of minutes of dead air.
144978
145124
  By default every tap, swipe, drag, pinch and rotate is drawn into the video as an on-screen touch marker (see showTouches), so the recording shows where each interaction landed.
@@ -144981,7 +145127,7 @@ Use when the user wants a video of an interaction, animation, or app behavior \u
144981
145127
  Returns { status: "recording", timeLimitSeconds, outputFile } \u2014 the video is retrieved later by \`screen-recording-stop\`, not by reading outputFile directly.
144982
145128
  Fails if a recording is already running on the device, the device is not booted, ffmpeg is not installed, or the platform cannot be recorded (tvOS, Chromium, Vega and remote simulators are unsupported).`,
144983
145129
  searchHint: "record video screen capture movie mp4 start filming screencast",
144984
- zodSchema: zodSchema53,
145130
+ zodSchema: zodSchema54,
144985
145131
  // Resolved inside execute, not declared eagerly: a tvOS udid classifies as
144986
145132
  // iOS by shape, so an eager service would spawn simulator-server for a
144987
145133
  // device it cannot drive and hang on its ready timeout (as in `screenshot`).
@@ -144991,7 +145137,7 @@ Fails if a recording is already running on the device, the device is not booted,
144991
145137
  async execute(services, params) {
144992
145138
  const api = services.session;
144993
145139
  const device = resolveDevice(params.udid);
144994
- assertSupported("screen-recording-start", capability30, device);
145140
+ assertSupported("screen-recording-start", capability31, device);
144995
145141
  if (device.platform === "ios" && await isTvOsSimulator(params.udid)) {
144996
145142
  throw new FailureError(
144997
145143
  `Screen recording is not supported on tvOS simulators (device ${params.udid}).`,
@@ -145080,11 +145226,11 @@ function makePointerControl(simulator) {
145080
145226
  var import_node_path22 = require("node:path");
145081
145227
  init_zod();
145082
145228
  init_device_info();
145083
- var zodSchema54 = external_exports.object({
145229
+ var zodSchema55 = external_exports.object({
145084
145230
  udid: external_exports.string().describe("Target device id from `list-devices` (iOS Simulator UDID or Android serial).")
145085
145231
  });
145086
145232
  var RECORDINGS_DIR = ".argent/recordings";
145087
- var capability31 = {
145233
+ var capability32 = {
145088
145234
  apple: { simulator: true },
145089
145235
  android: { emulator: true, device: true, unknown: true }
145090
145236
  };
@@ -145095,21 +145241,21 @@ var screenRecordingStopTool = {
145095
145241
  completedMsg: ({ result }) => `Saved screen recording ${result.video.filename}`,
145096
145242
  failedMsg: ({ failureSignal: failureSignal2 }) => `Failed to stop screen recording: ${failureSignal2.error_code}`
145097
145243
  },
145098
- capability: capability31,
145244
+ capability: capability32,
145099
145245
  description: `Stop the screen recording started by \`screen-recording-start\` and retrieve the video: frame capture ends and ffmpeg finalizes the mp4.
145100
145246
  Also retrieves the video when the recording already ended on its own (time limit reached, capture process died) \u2014 call it even after the cap fired.
145101
145247
  Use when the interaction being captured is finished, or a tool-result note reminds you a recording is still running.
145102
145248
  Returns { video, durationMs, wallClockMs?, trimmedMs?, panelSwitches?, warning? }; video is a downloadable artifact materialized to a local path. When static-frame trimming removed dead air, durationMs is the trimmed video length and wallClockMs/trimmedMs report the real duration and how much was cut. On a foldable simulator, the recording follows the panel that shows the UI. panelSwitches gives the number of panel changes. The video keeps the size of the first panel. warning is set when argent could not find that panel during the recording.
145103
145249
  Fails if no recording (running or finished-but-unretrieved) exists for the given udid.`,
145104
145250
  searchHint: "stop end finish screen recording video capture save retrieve",
145105
- zodSchema: zodSchema54,
145251
+ zodSchema: zodSchema55,
145106
145252
  services: (params) => ({
145107
145253
  session: screenRecordingSessionRef(resolveDevice(params.udid))
145108
145254
  }),
145109
145255
  async execute(services, params, ctx) {
145110
145256
  const api = services.session;
145111
145257
  const device = resolveDevice(params.udid);
145112
- assertSupported("screen-recording-stop", capability31, device);
145258
+ assertSupported("screen-recording-stop", capability32, device);
145113
145259
  const stopped = await stopCapture(api);
145114
145260
  const artifacts = requireArtifacts(ctx);
145115
145261
  const video = await artifacts.register({
@@ -145141,7 +145287,7 @@ var timeWindowSchema = external_exports.object({
145141
145287
  "End of window in ms since profiling started \u2014 the same clock profiler-commit-query prints"
145142
145288
  )
145143
145289
  });
145144
- var zodSchema55 = external_exports.object({
145290
+ var zodSchema56 = external_exports.object({
145145
145291
  port: metroPortField,
145146
145292
  device_id: metroDeviceIdParam(
145147
145293
  "Device logicalDeviceId from debugger-connect (iOS simulator UDID or Android logicalDeviceId)."
@@ -145430,7 +145576,7 @@ Every table states how many samples it covers and how much of that was idle.
145430
145576
  Use when investigating JS CPU hotspots or correlating CPU cost with specific components.
145431
145577
  Returns a markdown table of CPU hotspots, call tree, or per-component CPU breakdown.
145432
145578
  Fails if no CPU profile is stored \u2014 run react-profiler-stop first.`,
145433
- zodSchema: zodSchema55,
145579
+ zodSchema: zodSchema56,
145434
145580
  // RN-only: reads Hermes-format CPU profiles; Chromium's V8 sample format differs.
145435
145581
  capability: RN_ONLY_TOOL_CAPABILITY,
145436
145582
  services: () => ({}),
@@ -145516,7 +145662,7 @@ var timeRangeSchema = external_exports.object({
145516
145662
  "End of range in ms since profiling started \u2014 the same clock profiler-commit-query prints"
145517
145663
  )
145518
145664
  });
145519
- var zodSchema56 = external_exports.object({
145665
+ var zodSchema57 = external_exports.object({
145520
145666
  port: metroPortField,
145521
145667
  device_id: metroDeviceIdParam(
145522
145668
  "Device logicalDeviceId from debugger-connect (iOS simulator UDID or Android logicalDeviceId)."
@@ -145789,7 +145935,7 @@ Modes:
145789
145935
  Use when drilling into specific components or time windows after react-profiler-analyze.
145790
145936
  Returns a markdown table or tree of commit data matching the requested mode.
145791
145937
  Fails if react-profiler-stop has not been called or no commit data is stored.`,
145792
- zodSchema: zodSchema56,
145938
+ zodSchema: zodSchema57,
145793
145939
  // Reads React commit data captured via the React DevTools backend.
145794
145940
  capability: RN_ONLY_TOOL_CAPABILITY,
145795
145941
  services: () => ({}),
@@ -145860,7 +146006,7 @@ Fails if react-profiler-stop has not been called or no commit data is stored.`,
145860
146006
  init_zod();
145861
146007
  init_src2();
145862
146008
  init_device_info();
145863
- var zodSchema57 = external_exports.object({
146009
+ var zodSchema58 = external_exports.object({
145864
146010
  device_id: metroDeviceIdParam("iOS Simulator UDID or Android serial."),
145865
146011
  mode: external_exports.enum(["hang_stacks", "function_callers", "thread_breakdown", "leak_stacks"]).describe(
145866
146012
  "Query mode: hang_stacks (full CPU context during a hang), function_callers (who calls a native function), thread_breakdown (CPU split by thread), leak_stacks (leak details by object type)"
@@ -146178,7 +146324,7 @@ Modes:
146178
146324
  Use when drilling into native hang stacks, thread CPU breakdown, or memory leaks after native-profiler-analyze.
146179
146325
  Returns a markdown report with native call stacks, thread weights, or leak details for the selected mode.
146180
146326
  Fails if native-profiler-analyze has not been run or no parsed trace data is in memory.`,
146181
- zodSchema: zodSchema57,
146327
+ zodSchema: zodSchema58,
146182
146328
  // No chromium entry: it has no native trace capture.
146183
146329
  capability: {
146184
146330
  apple: { simulator: true },
@@ -146248,7 +146394,7 @@ function buildPerfettoAnchor(wallClockStartMs) {
146248
146394
  }
146249
146395
 
146250
146396
  // ../tool-server/src/tools/profiler/combined/profiler-combined-report.ts
146251
- var zodSchema58 = external_exports.object({
146397
+ var zodSchema59 = external_exports.object({
146252
146398
  port: metroPortField,
146253
146399
  device_id: metroDeviceIdParam("iOS Simulator/device UDID or Android serial")
146254
146400
  });
@@ -146265,7 +146411,7 @@ Requires both react-profiler-analyze and native-profiler-analyze to have been ca
146265
146411
  Call this tool when both profilers were run in parallel on the same session.
146266
146412
  Returns a markdown report correlating hangs with React commits, memory leaks, and investigation hints.
146267
146413
  Fails if either react-profiler-analyze or native-profiler-analyze has not been called first.`,
146268
- zodSchema: zodSchema58,
146414
+ zodSchema: zodSchema59,
146269
146415
  // iOS reads xctrace output; Android re-queries the Perfetto .pftrace via
146270
146416
  // loadAndroidCombinedData. Chromium has no native trace capture.
146271
146417
  capability: {
@@ -146589,7 +146735,7 @@ function assertSafeSessionId(sessionId) {
146589
146735
  );
146590
146736
  }
146591
146737
  }
146592
- var zodSchema59 = external_exports.object({
146738
+ var zodSchema60 = external_exports.object({
146593
146739
  mode: external_exports.enum(["list", "load_react", "load_native"]).describe(
146594
146740
  "list: show available sessions on disk. load_react: load a React profiler session into memory for query tools. load_native: re-parse native profiler XML files (xctrace on iOS) into memory for query tools."
146595
146741
  ),
@@ -146950,7 +147096,7 @@ Modes:
146950
147096
  For Android .pftrace restores, pass app_process for older sessions that do not have a metadata sidecar.
146951
147097
  Returns a summary of the loaded session or a session list for the list mode.
146952
147098
  Fails if the session_id is not found or required XML files are missing from disk.`,
146953
- zodSchema: zodSchema59,
147099
+ zodSchema: zodSchema60,
146954
147100
  // The Hermes, xctrace and perfetto formats this loads have no Chromium
146955
147101
  // equivalent; the gate fails at the call site, not inside the trace parser.
146956
147102
  capability: RN_ONLY_TOOL_CAPABILITY,
@@ -147079,7 +147225,7 @@ function unnameableSessionUrns(urns) {
147079
147225
  }
147080
147226
 
147081
147227
  // ../tool-server/src/tools/simulator/stop-simulator-server.ts
147082
- var zodSchema60 = external_exports.object({
147228
+ var zodSchema61 = external_exports.object({
147083
147229
  udid: external_exports.string().describe(
147084
147230
  "Target device id (iOS UDID, Android serial, or Chromium id) whose transport session to stop"
147085
147231
  )
@@ -147093,7 +147239,7 @@ function createStopSimulatorServerTool(registry2) {
147093
147239
  failedMsg: ({ params, failureSignal: failureSignal2 }) => `Failed to stop simulator server for ${params.udid}: ${failureSignal2.error_code}`
147094
147240
  },
147095
147241
  description: `Stop the transport session for a specific device (iOS simulator / Android: simulator-server process; physical iOS: the on-device runner; Chromium: CDP WebSocket) and free its resources; on a TV target it also reaps that device's TV-control daemons. Use when you are done interacting with one device but want to keep others running, or to restart a wedged transport. On iOS / Android / TV it deliberately leaves this device's native-devtools, accessibility, profiler and debugger services running - to drain those as well, use stop-all-simulator-servers with \`devices\`. On CHROMIUM that does not hold: the JS-runtime debugger declares the CDP session as a dependency, so stopping the transport cascades to it and its captured console history goes with it - reconnect with debugger-connect afterwards. Returns { stopped, udid }. Fails silently if no session is open for the given id.`,
147096
- zodSchema: zodSchema60,
147242
+ zodSchema: zodSchema61,
147097
147243
  services: () => ({}),
147098
147244
  async execute(_services, params) {
147099
147245
  const udid = params.udid;
@@ -147124,7 +147270,7 @@ function createStopSimulatorServerTool(registry2) {
147124
147270
  init_zod();
147125
147271
  init_src2();
147126
147272
  init_external_devices();
147127
- var zodSchema61 = external_exports.object({
147273
+ var zodSchema62 = external_exports.object({
147128
147274
  devices: external_exports.array(external_exports.string()).optional().describe(
147129
147275
  "Device ids (iOS UDID / Android serial / Chromium id) to scope the teardown to \u2014 pass the devices THIS session actually used. Omit only for a deliberate machine-wide cleanup: one tool-server serves every agent using this argent install, so an unscoped stop also kills devices another agent is mid-session on."
147130
147276
  )
@@ -147163,7 +147309,7 @@ function createStopAllSimulatorServersTool(registry2) {
147163
147309
  PASS \`devices\` with the device ids this session used \u2014 one tool-server serves every agent, subagent and CLI call using this argent install, and an unscoped call tears down THEIR devices too (a mid-recording devtools teardown degrades another agent's flow to brittle coordinate taps; that agent is warned, but its recorded steps are already the worse kind). Omit \`devices\` only when a machine-wide cleanup is what you actually want. Passing an EMPTY array scopes to nothing and stops nothing - it is not a way to ask for the machine-wide sweep.
147164
147310
  A JS-runtime debugger session is keyed by the id you called \`debugger-connect\` with. On a Metro serving two or more devices that id is not a udid or serial - connect refuses those and tells you to re-target with the \`logicalDeviceId\` it returns - so a scope built from \`list-devices\` ids cannot reach that session. Pass any such \`logicalDeviceId\` in \`devices\` ALONGSIDE the device id; { left_running } names the ones you missed.
147165
147311
  Returns { stopped } - the URNs of the services that were actually live and got shut down; an ERROR node is disposed too but never appears there, so an empty \`stopped\` only means nothing was still running. { unmatched } lists supplied ids that own no service here, so a mistyped id - or a device NAME passed where an id was expected - does not read as a clean machine. It is NOT proof the id is wrong: a Vega device is driven through CLI/adb shell-outs, so one you only booted and drove with the remote registers no service and always lands here \u2014 as does a real device of any platform this session never started anything on. Present ONLY when \`devices\` was supplied AND at least one id matched nothing - absent on an unscoped call and when every id matched. Stopping the same device twice does not report it unmatched: ownership counts regardless of service state. { left_running } lists live debugger sessions (and the network inspectors / React profiler sessions riding on them) whose id no device scope can name - re-call with that id to reap them. { aborted: true } means the caller cancelled the request part-way, so the rest of the machine was left untouched and neither of the other two fields was computed. Past the schema - which rejects an unknown key outright, so the \`udids\` slip is an error rather than a silent machine-wide sweep - the call always succeeds; reaping nothing is a result, not a failure.`,
147166
- zodSchema: zodSchema61,
147312
+ zodSchema: zodSchema62,
147167
147313
  services: () => ({}),
147168
147314
  async execute(_services, params, ctx) {
147169
147315
  const devices = params.devices;
@@ -147211,7 +147357,7 @@ Returns { stopped } - the URNs of the services that were actually live and got s
147211
147357
 
147212
147358
  // ../tool-server/src/tools/simulator/stop-metro.ts
147213
147359
  init_zod();
147214
- var import_node_child_process34 = require("node:child_process");
147360
+ var import_node_child_process35 = require("node:child_process");
147215
147361
  function parseNetstatListeningPids(netstatOutput, port) {
147216
147362
  const pids = /* @__PURE__ */ new Set();
147217
147363
  for (const line of netstatOutput.split(/\r?\n/)) {
@@ -147227,7 +147373,7 @@ function parseNetstatListeningPids(netstatOutput, port) {
147227
147373
  }
147228
147374
  function listeningPids(port) {
147229
147375
  if (process.platform === "win32") {
147230
- const output2 = (0, import_node_child_process34.execFileSync)("netstat", ["-ano"], {
147376
+ const output2 = (0, import_node_child_process35.execFileSync)("netstat", ["-ano"], {
147231
147377
  encoding: "utf-8",
147232
147378
  timeout: 5e3,
147233
147379
  // `netstat -ano` dumps every socket on the host; overflowing Node's
@@ -147236,14 +147382,14 @@ function listeningPids(port) {
147236
147382
  });
147237
147383
  return parseNetstatListeningPids(output2, port);
147238
147384
  }
147239
- const output = (0, import_node_child_process34.execFileSync)("lsof", ["-ti", `tcp:${port}`, "-sTCP:LISTEN"], {
147385
+ const output = (0, import_node_child_process35.execFileSync)("lsof", ["-ti", `tcp:${port}`, "-sTCP:LISTEN"], {
147240
147386
  encoding: "utf-8",
147241
147387
  timeout: 5e3
147242
147388
  }).trim();
147243
147389
  if (!output) return [];
147244
147390
  return output.split("\n").map((s) => parseInt(s.trim(), 10)).filter((n) => !Number.isNaN(n));
147245
147391
  }
147246
- var zodSchema62 = external_exports.object({
147392
+ var zodSchema63 = external_exports.object({
147247
147393
  port: external_exports.number().int().min(1).max(65535).default(8081).describe("TCP port Metro is listening on (default 8081)")
147248
147394
  });
147249
147395
  var stopMetroTool = {
@@ -147254,7 +147400,7 @@ var stopMetroTool = {
147254
147400
  failedMsg: ({ params, failureSignal: failureSignal2 }) => `Failed to stop Metro on port ${params.port}: ${failureSignal2.error_code}`
147255
147401
  },
147256
147402
  description: `Stop the Metro bundler process listening on a given port (default 8081). Use when ending a React Native session or when Metro must be restarted. Returns { stopped, port, pids }; stopped=false if no process is found on the port. Fails if the port lookup command times out or the process cannot be killed. This is DESTRUCTIVE \u2014 always ask the user for confirmation before calling this tool.`,
147257
- zodSchema: zodSchema62,
147403
+ zodSchema: zodSchema63,
147258
147404
  services: () => ({}),
147259
147405
  async execute(_services, params) {
147260
147406
  const port = params.port;
@@ -149598,7 +149744,7 @@ async function appendStepToFlow(session, step) {
149598
149744
  }
149599
149745
 
149600
149746
  // ../tool-server/src/tools/flows/flow-start-recording.ts
149601
- var zodSchema63 = external_exports.object({
149747
+ var zodSchema64 = external_exports.object({
149602
149748
  name: external_exports.string().describe(
149603
149749
  'Name for this flow (e.g. "settings-explore") \u2014 letters, digits, underscore and hyphen only.'
149604
149750
  ),
@@ -149655,7 +149801,7 @@ recording. Over a link, the next recorded step writes over your edit.
149655
149801
  Without a link, the recorder reads the file again before each step, but an
149656
149802
  edit that renumbers the steps drops the warnings that flow-finish-recording
149657
149803
  reports for those steps.`,
149658
- zodSchema: zodSchema63,
149804
+ zodSchema: zodSchema64,
149659
149805
  fileInputs: fileInputs2,
149660
149806
  services: () => ({}),
149661
149807
  async execute(_services, params, ctx) {
@@ -152155,7 +152301,7 @@ function stepAnchor(step) {
152155
152301
 
152156
152302
  // ../tool-server/src/tools/flows/flow-add-step.ts
152157
152303
  init_device_info();
152158
- var zodSchema64 = external_exports.object({
152304
+ var zodSchema65 = external_exports.object({
152159
152305
  name: external_exports.string().describe("Name of the flow being recorded \u2014 the one passed to flow-start-recording."),
152160
152306
  project_root: external_exports.string().describe(
152161
152307
  "Absolute path to the project root of the flow being recorded \u2014 the same value passed to flow-start-recording. Together with `name` it identifies which recording this step belongs to."
@@ -152614,7 +152760,7 @@ Returns { message, stepCount, recorded, savedTo }; \`recorded\`, not the status,
152614
152760
  // more times — and every retry re-runs the action and appends another step,
152615
152761
  // because an aborted request still appends its first.
152616
152762
  longRunning: true,
152617
- zodSchema: zodSchema64,
152763
+ zodSchema: zodSchema65,
152618
152764
  fileInputs: fileInputs3,
152619
152765
  services: () => ({}),
152620
152766
  async execute(_services, params, ctx) {
@@ -152803,7 +152949,7 @@ Returns { message, stepCount, recorded, savedTo }; \`recorded\`, not the status,
152803
152949
 
152804
152950
  // ../tool-server/src/tools/flows/flow-insert-echo.ts
152805
152951
  init_zod();
152806
- var zodSchema65 = external_exports.object({
152952
+ var zodSchema66 = external_exports.object({
152807
152953
  name: external_exports.string().describe("Name of the flow being recorded \u2014 the one passed to flow-start-recording."),
152808
152954
  project_root: external_exports.string().describe(
152809
152955
  "Absolute path to the project root of the flow being recorded \u2014 the same value passed to flow-start-recording. Together with `name` it identifies which recording this echo belongs to."
@@ -152821,7 +152967,7 @@ var flowInsertEchoTool = {
152821
152967
  description: `Record an echo step in the flow named by \`name\` + \`project_root\`. Echo steps print a message when the flow is replayed \u2014 useful as labels between tool calls.
152822
152968
  Use when you want to annotate a recorded flow with a human-readable label or checkpoint message.
152823
152969
  Returns { message, stepCount, savedTo }. Fails if that flow has no recording in progress.`,
152824
- zodSchema: zodSchema65,
152970
+ zodSchema: zodSchema66,
152825
152971
  services: () => ({}),
152826
152972
  async execute(_services, params) {
152827
152973
  const session = await requireRecordingSession(params.project_root, params.name);
@@ -152849,7 +152995,7 @@ var import_node_url4 = require("node:url");
152849
152995
  init_src2();
152850
152996
 
152851
152997
  // ../tool-server/src/tools/flows/script/flow-script-executor.ts
152852
- var import_node_child_process35 = require("node:child_process");
152998
+ var import_node_child_process36 = require("node:child_process");
152853
152999
  var fs58 = __toESM(require("node:fs"));
152854
153000
  var os17 = __toESM(require("node:os"));
152855
153001
  var path44 = __toESM(require("node:path"));
@@ -153234,14 +153380,14 @@ var FlowScriptExecutor = class {
153234
153380
  detached: process.platform !== "win32",
153235
153381
  windowsHide: process.platform === "win32"
153236
153382
  };
153237
- child = (0, import_node_child_process35.fork)(scriptPath, [], forkOptions);
153383
+ child = (0, import_node_child_process36.fork)(scriptPath, [], forkOptions);
153238
153384
  } catch (err) {
153239
153385
  return emptyResult(
153240
153386
  { kind: "spawn", message: `Could not start the script process: ${errorMessage(err)}` },
153241
153387
  { notes, durationMs: Date.now() - startedAt }
153242
153388
  );
153243
153389
  }
153244
- const lifeline = child.stdio[4];
153390
+ const lifeline = child.stdio?.[4];
153245
153391
  lifeline?.unref?.();
153246
153392
  let startedSeen = false;
153247
153393
  let terminal = null;
@@ -153675,7 +153821,7 @@ async function stopProcessTree(child, graceMs) {
153675
153821
  if (process.platform === "win32") {
153676
153822
  if (hasExited(child)) return;
153677
153823
  tryKill(() => {
153678
- const killer = (0, import_node_child_process35.spawn)("taskkill", ["/pid", String(pid), "/t", "/f"], {
153824
+ const killer = (0, import_node_child_process36.spawn)("taskkill", ["/pid", String(pid), "/t", "/f"], {
153679
153825
  windowsHide: true,
153680
153826
  stdio: "ignore"
153681
153827
  });
@@ -154124,7 +154270,7 @@ function errMsg3(err) {
154124
154270
 
154125
154271
  // ../tool-server/src/tools/flows/flow-add-script.ts
154126
154272
  var OUTPUT_RENDER_LIMIT_BYTES = 64 * 1024;
154127
- var zodSchema66 = external_exports.object({
154273
+ var zodSchema67 = external_exports.object({
154128
154274
  name: external_exports.string().describe("Flow name passed to flow-start-recording."),
154129
154275
  project_root: external_exports.string().describe("Absolute project root passed to flow-start-recording."),
154130
154276
  path: external_exports.string().describe(
@@ -154181,7 +154327,7 @@ var flowAddScriptTool = {
154181
154327
  // The flag only skips the adapter's own abort timer; its retry loop is
154182
154328
  // untouched, so a call that fails some other way is still re-POSTed.
154183
154329
  longRunning: true,
154184
- zodSchema: zodSchema66,
154330
+ zodSchema: zodSchema67,
154185
154331
  services: () => ({}),
154186
154332
  async execute(_services, params, ctx) {
154187
154333
  const session = await requireRecordingSession(params.project_root, params.name);
@@ -154271,7 +154417,7 @@ var flowAddScriptTool = {
154271
154417
  // ../tool-server/src/tools/flows/flow-finish-recording.ts
154272
154418
  init_zod();
154273
154419
  var fs60 = __toESM(require("node:fs/promises"));
154274
- var zodSchema67 = external_exports.object({
154420
+ var zodSchema68 = external_exports.object({
154275
154421
  name: external_exports.string().describe("Name of the flow being recorded \u2014 the one passed to flow-start-recording."),
154276
154422
  project_root: external_exports.string().describe(
154277
154423
  "Absolute path to the project root of the flow being recorded \u2014 the same value passed to flow-start-recording. Together with `name` it identifies which recording to finish."
@@ -154330,7 +154476,7 @@ var flowFinishRecordingTool = {
154330
154476
  description: `Finish recording the flow named by \`name\` + \`project_root\`, leaving recordings under any other key untouched. Returns { message, path, executionPrerequisite, steps, summary, flowFile, savedTo } - a summary of all recorded steps plus the final YAML. Use when you have added all desired steps and want to finalize the flow file. Fails if that flow has no recording in progress.
154331
154477
  A warning flow-add-step raised on a recorded \`await-ui-element\` is repeated in \`summary\` as a \`warning:\` line of its own, right below the step it judges, and \`message\` counts them by kind. A warning is repeated only while the step it judges is still identifiable by its number: hand-editing the .yaml during the recording moves the steps, so those warnings are DROPPED rather than pinned on whichever step inherited the number, and \`message\` says how many were dropped. A step that carries a cross-tree warning was re-probed against the runner's tree: read it before converting that wait to \`await:\`/\`assert:\`, which is what the verdict is about and what this moment is for. A step that recorded a wait which did not pass was never probed at all, and its own warning names the CAUSE, because only one of them judges the condition: an unmet wait was read and found false, and it stops the run at replay; a wait whose tree source could not be read, or one that was cancelled, observed nothing and leaves the condition UNKNOWN rather than known-bad. Read those before replaying.
154332
154478
  You can still edit the .yaml file directly afterwards to remove or reorder steps.`,
154333
- zodSchema: zodSchema67,
154479
+ zodSchema: zodSchema68,
154334
154480
  services: () => ({}),
154335
154481
  async execute(_services, params) {
154336
154482
  const { filePath, flowFile, savedTo, flow, summary, headline } = await withFlowFileLock(
@@ -154395,7 +154541,7 @@ init_src2();
154395
154541
  // ../tool-server/src/tools/screenshot-diff/screenshot-diff-ocr.ts
154396
154542
  var import_child_process8 = require("child_process");
154397
154543
  var import_util10 = require("util");
154398
- var execFileAsync27 = (0, import_util10.promisify)(import_child_process8.execFile);
154544
+ var execFileAsync28 = (0, import_util10.promisify)(import_child_process8.execFile);
154399
154545
  var OCR_TIMEOUT_MS = 1e4;
154400
154546
  var OCR_MAX_BUFFER_BYTES = 32 * 1024 * 1024;
154401
154547
  var TESSERACT_BINARY = "tesseract";
@@ -154440,7 +154586,7 @@ async function extractOcrTextBlocks(imagePath) {
154440
154586
  }
154441
154587
  }
154442
154588
  async function recognizeTsv(imagePath) {
154443
- const { stdout } = await execFileAsync27(
154589
+ const { stdout } = await execFileAsync28(
154444
154590
  TESSERACT_BINARY,
154445
154591
  [
154446
154592
  imagePath,
@@ -155665,7 +155811,7 @@ function formatScreenshotDiffSummary(result) {
155665
155811
  const shownRegions = result.regions.slice(0, MAX_SUMMARY_REGIONS);
155666
155812
  const coordinateSpace = coordinateSpaceForSummary(result.imageSize);
155667
155813
  const lines = ["Screenshot diff summary", "", "Overall:"];
155668
- lines.push(`- status: ${status}`);
155814
+ lines.push(statusLine(status));
155669
155815
  if (result.sizeNormalization) {
155670
155816
  const { baseline, current, comparedAt } = result.sizeNormalization;
155671
155817
  lines.push(
@@ -155726,6 +155872,12 @@ function formatScreenshotDiffSummary(result) {
155726
155872
  }
155727
155873
  return lines.join("\n");
155728
155874
  }
155875
+ function statusLine(status) {
155876
+ return `- status: ${status}`;
155877
+ }
155878
+ function summaryReportsDimensionMismatch(summary) {
155879
+ return summary.split("\n").includes(statusLine("dimension_mismatch"));
155880
+ }
155729
155881
  function screenshotDiffStatus(result) {
155730
155882
  if (result.dimensionMismatch) return "dimension_mismatch";
155731
155883
  if (!Number.isFinite(result.totalPixels) || !Number.isFinite(result.differentPixels) || !Number.isFinite(result.mismatchPercentage)) {
@@ -156716,11 +156868,11 @@ async function runSnapshot(env, opts) {
156716
156868
  }
156717
156869
 
156718
156870
  // ../tool-server/src/utils/status-bar.ts
156719
- var import_node_child_process36 = require("node:child_process");
156720
- var import_node_util26 = require("node:util");
156871
+ var import_node_child_process37 = require("node:child_process");
156872
+ var import_node_util27 = require("node:util");
156721
156873
  init_adb();
156722
156874
  init_device_info();
156723
- var execFileAsync28 = (0, import_node_util26.promisify)(import_node_child_process36.execFile);
156875
+ var execFileAsync29 = (0, import_node_util27.promisify)(import_node_child_process37.execFile);
156724
156876
  var DEMO_BROADCAST = "am broadcast -a com.android.systemui.demo";
156725
156877
  var IOS_STATUS_BAR_OVERRIDE = [
156726
156878
  "override",
@@ -156744,7 +156896,7 @@ async function pinStatusBar(device, signal) {
156744
156896
  if (isIosPhysicalDevice(device)) return false;
156745
156897
  try {
156746
156898
  if (device.platform === "ios") {
156747
- await execFileAsync28(
156899
+ await execFileAsync29(
156748
156900
  "xcrun",
156749
156901
  await simctlArgsForUdid(device.id, ["status_bar", device.id, ...IOS_STATUS_BAR_OVERRIDE])
156750
156902
  );
@@ -156780,7 +156932,7 @@ async function pinStatusBar(device, signal) {
156780
156932
  async function restoreStatusBar(device) {
156781
156933
  try {
156782
156934
  if (device.platform === "ios") {
156783
- await execFileAsync28(
156935
+ await execFileAsync29(
156784
156936
  "xcrun",
156785
156937
  await simctlArgsForUdid(device.id, ["status_bar", device.id, "clear"])
156786
156938
  );
@@ -156802,7 +156954,7 @@ async function restoreStatusBar(device) {
156802
156954
  }
156803
156955
 
156804
156956
  // ../tool-server/src/tools/flows/flow-run.ts
156805
- var zodSchema68 = external_exports.object({
156957
+ var zodSchema69 = external_exports.object({
156806
156958
  name: external_exports.string().optional().describe(
156807
156959
  'Name of a saved flow to run from `.argent/flows` (e.g. "settings-explore"). Omit when flow_path is set.'
156808
156960
  ),
@@ -157309,7 +157461,7 @@ one-off interaction use the gesture tools instead, and to author a flow use flow
157309
157461
  exactly one flow source: name (under project_root) or flow_path.
157310
157462
  Returns a per-step report: the first failure stops the run and the rest report as skipped.`,
157311
157463
  longRunning: true,
157312
- zodSchema: zodSchema68,
157464
+ zodSchema: zodSchema69,
157313
157465
  fileInputs: fileInputs4,
157314
157466
  services: () => ({}),
157315
157467
  async execute(_services, params, ctx) {
@@ -158286,7 +158438,7 @@ async function resolveFlowSource(params, fileInput, flowPathInput) {
158286
158438
  // ../tool-server/src/tools/flows/flow-read-prerequisite.ts
158287
158439
  init_zod();
158288
158440
  var fs64 = __toESM(require("node:fs/promises"));
158289
- var zodSchema69 = external_exports.object({
158441
+ var zodSchema70 = external_exports.object({
158290
158442
  name: external_exports.string().optional().describe(
158291
158443
  'Name of a saved flow to inspect from `.argent/flows` (e.g. "settings-explore"). Omit when flow_path is set.'
158292
158444
  ),
@@ -158342,7 +158494,7 @@ Touches no device: nothing is launched, tapped, dispatched or torn down, and no
158342
158494
  needs booting, so calling this costs nothing but a file read.
158343
158495
  Fails if the flow file does not exist.
158344
158496
  Address the flow exactly as you will address it in flow-execute: name or flow_path, one and only one; supplying both or neither is rejected. The name goes in \`name\`, which resolves <project_root>/.argent/flows/<name>.yaml.`,
158345
- zodSchema: zodSchema69,
158497
+ zodSchema: zodSchema70,
158346
158498
  fileInputs: fileInputs5,
158347
158499
  services: () => ({}),
158348
158500
  async execute(_services, params, ctx) {
@@ -158365,7 +158517,7 @@ init_zod();
158365
158517
  // ../tool-server/src/utils/workspace-reader.ts
158366
158518
  var import_promises12 = require("node:fs/promises");
158367
158519
  var import_node_path23 = require("node:path");
158368
- var import_node_child_process37 = require("node:child_process");
158520
+ var import_node_child_process38 = require("node:child_process");
158369
158521
  var import_dotenv2 = __toESM(require_main());
158370
158522
  async function exists(path53) {
158371
158523
  try {
@@ -158409,7 +158561,7 @@ async function listDir(path53) {
158409
158561
  var COMMAND_TIMEOUT_MS = 3e3;
158410
158562
  function runVersionCommand(cmd, args, cwd) {
158411
158563
  return new Promise((resolve14) => {
158412
- const child = (0, import_node_child_process37.execFile)(cmd, args, { cwd, timeout: COMMAND_TIMEOUT_MS }, (err, stdout) => {
158564
+ const child = (0, import_node_child_process38.execFile)(cmd, args, { cwd, timeout: COMMAND_TIMEOUT_MS }, (err, stdout) => {
158413
158565
  if (err) {
158414
158566
  resolve14(null);
158415
158567
  return;
@@ -158658,7 +158810,7 @@ async function readWorkspaceSnapshot(workspacePath) {
158658
158810
  }
158659
158811
 
158660
158812
  // ../tool-server/src/tools/workspace/gather-workspace-data.ts
158661
- var zodSchema70 = external_exports.object({
158813
+ var zodSchema71 = external_exports.object({
158662
158814
  workspacePath: external_exports.string().describe("Absolute path to the project root directory to inspect (e.g. /Users/dev/MyApp)")
158663
158815
  });
158664
158816
  var fileInputs6 = [
@@ -158689,7 +158841,7 @@ exploration of anything the snapshot surfaces.
158689
158841
  Use when you need to inspect project configuration without manually reading multiple files.
158690
158842
  Returns partial data if workspacePath does not exist or is not readable; missing items are represented as null or empty collections.
158691
158843
  Fails if the workspacePath is not an absolute path or the directory cannot be accessed.`,
158692
- zodSchema: zodSchema70,
158844
+ zodSchema: zodSchema71,
158693
158845
  fileInputs: fileInputs6,
158694
158846
  services: () => ({}),
158695
158847
  async execute(_services, params) {
@@ -158698,7 +158850,7 @@ Fails if the workspacePath is not an absolute path or the directory cannot be ac
158698
158850
  };
158699
158851
 
158700
158852
  // ../tool-server/src/tools/system/update-argent.ts
158701
- var import_node_child_process38 = require("node:child_process");
158853
+ var import_node_child_process39 = require("node:child_process");
158702
158854
  var fs65 = __toESM(require("node:fs"));
158703
158855
  var path49 = __toESM(require("node:path"));
158704
158856
  init_zod();
@@ -158763,7 +158915,7 @@ function targetFlagsFor(target) {
158763
158915
  if (target === "both") return ["--global", "--local"];
158764
158916
  return [`--${target}`];
158765
158917
  }
158766
- var zodSchema71 = external_exports.object({
158918
+ var zodSchema72 = external_exports.object({
158767
158919
  target: external_exports.enum(["auto", "global", "local", "both"]).optional().describe(
158768
158920
  "Which install to update. 'auto' (default) updates the install serving this session \u2014 the global PATH install or this project's local devDependency, whichever this server runs from. Pass 'global' / 'local' to force one, or 'both' when the user has both and wants each updated."
158769
158921
  )
@@ -158777,7 +158929,7 @@ var updateArgentTool = {
158777
158929
  failedMsg: ({ failureSignal: failureSignal2 }) => `Failed to update Argent: ${failureSignal2.error_code}`
158778
158930
  },
158779
158931
  description: "Apply a pending Argent update. Only call this tool when the user has explicitly consented to updating Argent in this conversation. Use when an update notification indicates a new version is available and the user agrees to update. By default updates the install serving this session; pass `target` to choose global/local/both. Returns { message } with the update status and version info. The tool server will restart automatically after the update. Fails if no update is available or an update is already in progress.",
158780
- zodSchema: zodSchema71,
158932
+ zodSchema: zodSchema72,
158781
158933
  services: () => ({}),
158782
158934
  async execute(_services, params, _options) {
158783
158935
  const { updateAvailable, updateInstallable, currentVersion, installableVersion } = getUpdateState();
@@ -158833,7 +158985,7 @@ var updateArgentTool = {
158833
158985
  if (spawnRoot) updateArgs.push("--project-root", spawnRoot);
158834
158986
  const cmd = cliEntry ? process.execPath : "argent";
158835
158987
  const args = cliEntry ? [cliEntry, ...updateArgs] : updateArgs;
158836
- const child = (0, import_node_child_process38.spawn)(cmd, args, {
158988
+ const child = (0, import_node_child_process39.spawn)(cmd, args, {
158837
158989
  detached: true,
158838
158990
  stdio: "ignore",
158839
158991
  env: { ...process.env, ARGENT_UPDATE_TRIGGER: "mcp_update" }
@@ -158862,7 +159014,7 @@ var updateArgentTool = {
158862
159014
 
158863
159015
  // ../tool-server/src/tools/system/dismiss-update.ts
158864
159016
  init_zod();
158865
- var zodSchema72 = external_exports.object({
159017
+ var zodSchema73 = external_exports.object({
158866
159018
  hours: external_exports.number().min(0).describe("Number of hours to suppress the update notification")
158867
159019
  });
158868
159020
  var dismissUpdateTool = {
@@ -158873,7 +159025,7 @@ var dismissUpdateTool = {
158873
159025
  failedMsg: ({ failureSignal: failureSignal2 }) => `Failed to dismiss Argent update: ${failureSignal2.error_code}`
158874
159026
  },
158875
159027
  description: "Clear the Argent update notification for the given number of hours. Use when the user asks to postpone or silence update reminders. Returns { message } confirming the suppression duration. Fails if the hours value is negative or the suppression state cannot be persisted.",
158876
- zodSchema: zodSchema72,
159028
+ zodSchema: zodSchema73,
158877
159029
  services: () => ({}),
158878
159030
  async execute(_services, params, _options) {
158879
159031
  const durationMs = params.hours * 60 * 60 * 1e3;
@@ -158892,7 +159044,7 @@ var import_path8 = __toESM(require("path"));
158892
159044
  init_zod();
158893
159045
  init_src2();
158894
159046
  init_device_info();
158895
- var zodSchema73 = external_exports.object({
159047
+ var zodSchema74 = external_exports.object({
158896
159048
  baselinePath: external_exports.string().min(1).optional().describe("Path to the baseline PNG file. Required unless captureBaseline is true."),
158897
159049
  currentPath: external_exports.string().min(1).optional().describe("Path to the current PNG file. Required unless captureCurrent is true."),
158898
159050
  udid: external_exports.string().min(1).describe("Target device id from `list-devices` (iOS UDID or Android serial)."),
@@ -158909,7 +159061,7 @@ var zodSchema73 = external_exports.object({
158909
159061
  "Directory where diff artifacts should be written. Optional \u2014 defaults to a temp directory; the diff images are returned in the result either way."
158910
159062
  )
158911
159063
  }).strict();
158912
- var capability32 = {
159064
+ var capability33 = {
158913
159065
  apple: { simulator: true, device: true },
158914
159066
  android: { emulator: true, device: true, unknown: true }
158915
159067
  };
@@ -158922,7 +159074,7 @@ var screenshotDiffTool = {
158922
159074
  id: "screenshot-diff",
158923
159075
  interaction: {
158924
159076
  startedMsg: () => "Comparing screenshots",
158925
- completedMsg: () => "Compared screenshots",
159077
+ completedMsg: ({ result }) => summaryReportsDimensionMismatch(result.summary) ? "Skipped comparison - screenshot dimensions differ" : "Compared screenshots",
158926
159078
  failedMsg: ({ failureSignal: failureSignal2 }) => `Failed to compare screenshots: ${failureSignal2.error_code}`
158927
159079
  },
158928
159080
  description: `Compare two PNG screenshots and return a compact visual-diff summary.
@@ -158934,8 +159086,8 @@ Returns { summary, diffPath, contextDiffPath }. The summary uses normalized [0,1
158934
159086
  Ignores the fixed top status-bar band for both pixel and OCR text comparisons.
158935
159087
  Fails if the input sources are invalid, PNG files cannot be read, outputDir cannot be written, or the simulator-server / emulator backend is not reachable.`,
158936
159088
  searchHint: "compare screenshots png diff visual UI changes UI regression visual regression screenshot diff changed regions text ocr live capture",
158937
- zodSchema: zodSchema73,
158938
- capability: capability32,
159089
+ zodSchema: zodSchema74,
159090
+ capability: capability33,
158939
159091
  fileInputs: fileInputs7,
158940
159092
  services: (params) => {
158941
159093
  if (params.captureBaseline || params.captureCurrent) {
@@ -159248,7 +159400,7 @@ async function captureElementFrame(registry2, udid, match, opts = {}) {
159248
159400
  }
159249
159401
 
159250
159402
  // ../tool-server/src/tools/variants/propose-variant.ts
159251
- var zodSchema74 = external_exports.object({
159403
+ var zodSchema75 = external_exports.object({
159252
159404
  element: external_exports.string().min(1).max(200).describe(
159253
159405
  'Human name of the on-screen element this variant targets, e.g. "Foo button" or "profile header". Repeated calls with the same element accumulate multiple variants on it. Used as the default screen matcher when `match` is omitted.'
159254
159406
  ),
@@ -159308,7 +159460,7 @@ arrives as a follow-up message (this is the case in an \`argent lens\` CLI sessi
159308
159460
  Returns { round, elementId, variantId, element, variantCount, totalElements } \u2014 confirmation only;
159309
159461
  it does not wait for the user.`,
159310
159462
  searchHint: "propose design variant alternative option for element non-blocking ab choice",
159311
- zodSchema: zodSchema74,
159463
+ zodSchema: zodSchema75,
159312
159464
  services: () => ({}),
159313
159465
  async execute(_services, params) {
159314
159466
  let frame = params.variant.frame;
@@ -159332,7 +159484,7 @@ it does not wait for the user.`,
159332
159484
 
159333
159485
  // ../tool-server/src/tools/variants/await-user-selection.ts
159334
159486
  init_zod();
159335
- var zodSchema75 = external_exports.object({
159487
+ var zodSchema76 = external_exports.object({
159336
159488
  timeoutSeconds: external_exports.number().int().min(5).max(86400).optional().describe(
159337
159489
  "Max seconds to block this call before returning a re-awaitable { status: 'pending' } result (default 1800). The user's proposals stay live across timeouts \u2014 on 'pending' just call await_user_selection again. Lower this if your MCP client enforces a short request timeout."
159338
159490
  )
@@ -159373,7 +159525,7 @@ This tool is long-running; it intentionally holds the request open. It honors cl
159373
159525
  disconnects (aborts cleanly).`,
159374
159526
  searchHint: "await wait user selection choice variant blocking confirm picks complete",
159375
159527
  longRunning: true,
159376
- zodSchema: zodSchema75,
159528
+ zodSchema: zodSchema76,
159377
159529
  services: () => ({}),
159378
159530
  async execute(_services, params, options) {
159379
159531
  const timeoutMs = (params.timeoutSeconds ?? 1800) * 1e3;
@@ -159388,7 +159540,7 @@ disconnects (aborts cleanly).`,
159388
159540
  init_zod();
159389
159541
  init_src2();
159390
159542
  init_device_info();
159391
- var zodSchema76 = external_exports.object({
159543
+ var zodSchema77 = external_exports.object({
159392
159544
  udid: external_exports.string().describe("Chromium device id from `list-devices` (e.g. `chromium-cdp-9222`)."),
159393
159545
  action: external_exports.enum(["list", "select", "new", "close"]).describe(
159394
159546
  "list: enumerate tabs/windows. select: make a tab active (every other tool then acts on it). new: open a tab. close: close a tab."
@@ -159421,7 +159573,7 @@ var tabAction = {
159421
159573
  failure: "close"
159422
159574
  }
159423
159575
  };
159424
- var capability33 = {
159576
+ var capability34 = {
159425
159577
  chromium: { app: true }
159426
159578
  };
159427
159579
  var chromiumTabsTool = {
@@ -159439,8 +159591,8 @@ var chromiumTabsTool = {
159439
159591
  Use when an app exposes multiple windows or tabs and you need to inspect or drive one other than the current page, or to open/close a page during a flow. tabIds are stable for the session and never reused.
159440
159592
  Returns { tabs: [{ tabId, targetId, title, url, active, label? }] }. Fails if the device is not a Chromium (CDP) device, or the requested tabId/label no longer matches a live tab. Chromium-only.`,
159441
159593
  searchHint: "tab tabs window windows switch select close new open multi-tab chromium electron",
159442
- zodSchema: zodSchema76,
159443
- capability: capability33,
159594
+ zodSchema: zodSchema77,
159595
+ capability: capability34,
159444
159596
  services: (params) => {
159445
159597
  const device = resolveDevice(params.udid);
159446
159598
  if (device.platform === "chromium") {
@@ -159541,7 +159693,7 @@ async function clearStorage(cdp, type) {
159541
159693
  }
159542
159694
 
159543
159695
  // ../tool-server/src/tools/chromium-cookies/index.ts
159544
- var zodSchema77 = external_exports.object({
159696
+ var zodSchema78 = external_exports.object({
159545
159697
  udid: external_exports.string().describe("Chromium device id from `list-devices` (e.g. `chromium-cdp-9222`)."),
159546
159698
  action: external_exports.enum(["get", "set", "delete", "clear"]).describe(
159547
159699
  "get: read cookies. set: create/update a cookie. delete: remove a named cookie. clear: remove all browser cookies."
@@ -159564,7 +159716,7 @@ var cookieAction = {
159564
159716
  delete: { started: "Deleting", completed: "Deleted", failure: "delete" },
159565
159717
  clear: { started: "Clearing", completed: "Cleared", failure: "clear" }
159566
159718
  };
159567
- var capability34 = {
159719
+ var capability35 = {
159568
159720
  chromium: { app: true }
159569
159721
  };
159570
159722
  var chromiumCookiesTool = {
@@ -159582,8 +159734,8 @@ var chromiumCookiesTool = {
159582
159734
  Use when seeding an authenticated session before a flow (set the session cookie, then navigate) or asserting cookie state after one.
159583
159735
  Returns { cookies, count } for get, or a small status object ({ set } / { deleted } / { cleared }) otherwise. Fails if the device is not a Chromium (CDP) device, or set is missing name/value. Chromium-only.`,
159584
159736
  searchHint: "cookies cookie get set delete clear httponly samesite session auth chromium",
159585
- zodSchema: zodSchema77,
159586
- capability: capability34,
159737
+ zodSchema: zodSchema78,
159738
+ capability: capability35,
159587
159739
  services: (params) => {
159588
159740
  const device = resolveDevice(params.udid);
159589
159741
  if (device.platform === "chromium") {
@@ -159648,7 +159800,7 @@ Returns { cookies, count } for get, or a small status object ({ set } / { delete
159648
159800
  init_zod();
159649
159801
  init_src2();
159650
159802
  init_device_info();
159651
- var zodSchema78 = external_exports.object({
159803
+ var zodSchema79 = external_exports.object({
159652
159804
  udid: external_exports.string().describe("Chromium device id from `list-devices` (e.g. `chromium-cdp-9222`)."),
159653
159805
  store: external_exports.enum(["local", "session"]).describe("Which Web Storage area: `local` (localStorage) or `session` (sessionStorage)."),
159654
159806
  action: external_exports.enum(["get", "set", "remove", "clear"]).describe(
@@ -159663,7 +159815,7 @@ var storageAction = {
159663
159815
  remove: { started: "Removing from", completed: "Removed from", failure: "remove from" },
159664
159816
  clear: { started: "Clearing", completed: "Cleared", failure: "clear" }
159665
159817
  };
159666
- var capability35 = {
159818
+ var capability36 = {
159667
159819
  chromium: { app: true }
159668
159820
  };
159669
159821
  var chromiumStorageTool = {
@@ -159682,8 +159834,8 @@ Set \`store\` to "local" or "session". Storage is per-origin, so it reflects the
159682
159834
  Use when seeding feature flags / auth tokens before a flow or asserting persisted app state after one.
159683
159835
  Returns { value } for a single key, { entries, count } for all, or a status object ({ set } / { removed } / { cleared }) otherwise. Fails if the device is not a Chromium (CDP) device, or set is missing key/value. Chromium-only.`,
159684
159836
  searchHint: "storage localstorage sessionstorage local session get set remove clear key value chromium",
159685
- zodSchema: zodSchema78,
159686
- capability: capability35,
159837
+ zodSchema: zodSchema79,
159838
+ capability: capability36,
159687
159839
  services: (params) => {
159688
159840
  const device = resolveDevice(params.udid);
159689
159841
  if (device.platform === "chromium") {
@@ -159758,6 +159910,7 @@ function createRegistry() {
159758
159910
  registry2.registerTool(createBootDeviceTool(registry2));
159759
159911
  registry2.registerTool(createLaunchAppTool(registry2));
159760
159912
  registry2.registerTool(createRestartAppTool(registry2));
159913
+ registry2.registerTool(terminateAppTool);
159761
159914
  registry2.registerTool(reinstallAppTool);
159762
159915
  registry2.registerTool(settingsPermissionsTool);
159763
159916
  registry2.registerTool(openUrlTool);
@@ -159864,13 +160017,13 @@ function probeArgentToolServer(host, port, timeoutMs = 500) {
159864
160017
 
159865
160018
  // ../tool-server/src/utils/simulator-watcher.ts
159866
160019
  var fs67 = __toESM(require("node:fs"));
159867
- var import_node_child_process39 = require("node:child_process");
159868
- var import_node_util27 = require("node:util");
160020
+ var import_node_child_process40 = require("node:child_process");
160021
+ var import_node_util28 = require("node:util");
159869
160022
  init_external_devices();
159870
- var execFileAsync29 = (0, import_node_util27.promisify)(import_node_child_process39.execFile);
160023
+ var execFileAsync30 = (0, import_node_util28.promisify)(import_node_child_process40.execFile);
159871
160024
  var POLL_INTERVAL_MS2 = 1e4;
159872
160025
  async function getBootedUdidsInSet(deviceSet) {
159873
- const { stdout } = await execFileAsync29("xcrun", [
160026
+ const { stdout } = await execFileAsync30("xcrun", [
159874
160027
  ...simctlPrefix(deviceSet),
159875
160028
  "list",
159876
160029
  "devices",
@@ -159989,7 +160142,7 @@ function startSimulatorWatcher(registry2) {
159989
160142
  }
159990
160143
 
159991
160144
  // ../tool-server/src/utils/preview-window.ts
159992
- var import_node_child_process40 = require("node:child_process");
160145
+ var import_node_child_process41 = require("node:child_process");
159993
160146
  var fs68 = __toESM(require("node:fs"));
159994
160147
  var os20 = __toESM(require("node:os"));
159995
160148
  var path51 = __toESM(require("node:path"));
@@ -160021,10 +160174,10 @@ function ensureLensAppBundle(electronBin) {
160021
160174
  fs68.copyFileSync(path51.join(realContents, "Info.plist"), plist);
160022
160175
  const setPlist = (entry, value) => {
160023
160176
  try {
160024
- (0, import_node_child_process40.execFileSync)("/usr/libexec/PlistBuddy", ["-c", `Set :${entry} ${value}`, plist]);
160177
+ (0, import_node_child_process41.execFileSync)("/usr/libexec/PlistBuddy", ["-c", `Set :${entry} ${value}`, plist]);
160025
160178
  } catch {
160026
160179
  try {
160027
- (0, import_node_child_process40.execFileSync)("/usr/libexec/PlistBuddy", ["-c", `Add :${entry} string ${value}`, plist]);
160180
+ (0, import_node_child_process41.execFileSync)("/usr/libexec/PlistBuddy", ["-c", `Add :${entry} string ${value}`, plist]);
160028
160181
  } catch {
160029
160182
  }
160030
160183
  }
@@ -160063,9 +160216,9 @@ function createPreviewWindowManager(opts = {}) {
160063
160216
  if (fs68.existsSync(bundled)) return bundled;
160064
160217
  return require.resolve("@argent/preview-window/dist/main.js");
160065
160218
  };
160066
- const isAlive = (c) => c !== null && c.exitCode === null && !c.killed;
160219
+ const isAlive2 = (c) => c !== null && c.exitCode === null && !c.killed;
160067
160220
  const ensureOpen = (url2) => {
160068
- if (isAlive(child) && !closing) {
160221
+ if (isAlive2(child) && !closing) {
160069
160222
  send({ cmd: "foreground", url: url2 });
160070
160223
  return;
160071
160224
  }
@@ -160083,7 +160236,7 @@ function createPreviewWindowManager(opts = {}) {
160083
160236
  const wrapperBin = ensureLensAppBundle(electronBin);
160084
160237
  const launchBin = wrapperBin ?? electronBin;
160085
160238
  const launchArgs = wrapperBin ? ["--no-sandbox", mainScript] : [mainScript];
160086
- const next = (0, import_node_child_process40.spawn)(launchBin, launchArgs, {
160239
+ const next = (0, import_node_child_process41.spawn)(launchBin, launchArgs, {
160087
160240
  // Strips ELECTRON_RUN_AS_NODE, which an Electron-based MCP host leaves in
160088
160241
  // our env, so the child boots as a GUI app instead of bare Node.
160089
160242
  env: electronGuiChildEnv({ ARGENT_PREVIEW_URL: url2 }),
@@ -160110,12 +160263,12 @@ function createPreviewWindowManager(opts = {}) {
160110
160263
  closing = false;
160111
160264
  };
160112
160265
  const requestClose = () => {
160113
- if (!isAlive(child)) return;
160266
+ if (!isAlive2(child)) return;
160114
160267
  closing = true;
160115
160268
  send({ cmd: "close" });
160116
160269
  };
160117
160270
  const dispose = () => {
160118
- if (isAlive(child)) child.kill();
160271
+ if (isAlive2(child)) child.kill();
160119
160272
  child = null;
160120
160273
  closing = false;
160121
160274
  };