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

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 = (zodSchema80) => {
13227
- const seen = ctx.seen.get(zodSchema80);
13226
+ const flattenRef = (zodSchema81) => {
13227
+ const seen = ctx.seen.get(zodSchema81);
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 = zodSchema80._zod.parent === ref;
13245
+ const isParentRef = zodSchema81._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 = zodSchema80._zod.parent;
13265
+ const parent = zodSchema81._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: zodSchema80,
13283
+ zodSchema: zodSchema81,
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 zodSchema81 = convertSchema(resolved, ctx);
16085
- ctx.refs.set(refPath, zodSchema81);
16084
+ const zodSchema82 = convertSchema(resolved, ctx);
16085
+ ctx.refs.set(refPath, zodSchema82);
16086
16086
  ctx.processing.delete(refPath);
16087
- return zodSchema81;
16087
+ return zodSchema82;
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 zodSchema80;
16129
+ let zodSchema81;
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
- zodSchema80 = stringSchema;
16192
+ zodSchema81 = 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
- zodSchema80 = numberSchema;
16217
+ zodSchema81 = numberSchema;
16218
16218
  break;
16219
16219
  }
16220
16220
  case "boolean": {
16221
- zodSchema80 = z.boolean();
16221
+ zodSchema81 = z.boolean();
16222
16222
  break;
16223
16223
  }
16224
16224
  case "null": {
16225
- zodSchema80 = z.null();
16225
+ zodSchema81 = 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
- zodSchema80 = z.record(keySchema, valueSchema);
16240
+ zodSchema81 = 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
- zodSchema80 = z.intersection(objectSchema2, recordSchema);
16245
+ zodSchema81 = 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
- zodSchema80 = z.object({}).passthrough();
16263
+ zodSchema81 = z.object({}).passthrough();
16264
16264
  } else if (schemasToIntersect.length === 1) {
16265
- zodSchema80 = schemasToIntersect[0];
16265
+ zodSchema81 = 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
- zodSchema80 = result;
16271
+ zodSchema81 = result;
16272
16272
  }
16273
16273
  break;
16274
16274
  }
16275
16275
  const objectSchema = z.object(shape);
16276
16276
  if (schema.additionalProperties === false) {
16277
- zodSchema80 = objectSchema.strict();
16277
+ zodSchema81 = objectSchema.strict();
16278
16278
  } else if (typeof schema.additionalProperties === "object") {
16279
- zodSchema80 = objectSchema.catchall(convertSchema(schema.additionalProperties, ctx));
16279
+ zodSchema81 = objectSchema.catchall(convertSchema(schema.additionalProperties, ctx));
16280
16280
  } else {
16281
- zodSchema80 = objectSchema.passthrough();
16281
+ zodSchema81 = 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
- zodSchema80 = z.tuple(tupleItems).rest(rest);
16292
+ zodSchema81 = z.tuple(tupleItems).rest(rest);
16293
16293
  } else {
16294
- zodSchema80 = z.tuple(tupleItems);
16294
+ zodSchema81 = z.tuple(tupleItems);
16295
16295
  }
16296
16296
  if (typeof schema.minItems === "number") {
16297
- zodSchema80 = zodSchema80.check(z.minLength(schema.minItems));
16297
+ zodSchema81 = zodSchema81.check(z.minLength(schema.minItems));
16298
16298
  }
16299
16299
  if (typeof schema.maxItems === "number") {
16300
- zodSchema80 = zodSchema80.check(z.maxLength(schema.maxItems));
16300
+ zodSchema81 = zodSchema81.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
- zodSchema80 = z.tuple(tupleItems).rest(rest);
16306
+ zodSchema81 = z.tuple(tupleItems).rest(rest);
16307
16307
  } else {
16308
- zodSchema80 = z.tuple(tupleItems);
16308
+ zodSchema81 = z.tuple(tupleItems);
16309
16309
  }
16310
16310
  if (typeof schema.minItems === "number") {
16311
- zodSchema80 = zodSchema80.check(z.minLength(schema.minItems));
16311
+ zodSchema81 = zodSchema81.check(z.minLength(schema.minItems));
16312
16312
  }
16313
16313
  if (typeof schema.maxItems === "number") {
16314
- zodSchema80 = zodSchema80.check(z.maxLength(schema.maxItems));
16314
+ zodSchema81 = zodSchema81.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
- zodSchema80 = arraySchema;
16325
+ zodSchema81 = arraySchema;
16326
16326
  } else {
16327
- zodSchema80 = z.array(z.any());
16327
+ zodSchema81 = 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 zodSchema80;
16334
+ return zodSchema81;
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, capability37) {
73659
- assertExternalCapabilitySync(namespace, device, capability37);
73658
+ async function assertExternalCapability(namespace, device, capability38) {
73659
+ assertExternalCapabilitySync(namespace, device, capability38);
73660
73660
  }
73661
- function assertExternalCapabilitySync(namespace, device, capability37) {
73661
+ function assertExternalCapabilitySync(namespace, device, capability38) {
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(capability37)) return;
73665
+ if (externalDevice.capabilities.has(capability38)) return;
73666
73666
  throw new FailureError(
73667
- `${namespace} is not available on '${externalDevice.name}': ${externalDevice.provider.name} did not grant the '${capability37}' capability for this device.`,
73667
+ `${namespace} is not available on '${externalDevice.name}': ${externalDevice.provider.name} did not grant the '${capability38}' 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.10";
94923
+ return "0.28.1-next.12";
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 capability37 = options?.granted ?? "simctl";
96698
- assertExternalCapabilitySync(capability37, udid, capability37);
96697
+ const capability38 = options?.granted ?? "simctl";
96698
+ assertExternalCapabilitySync(capability38, udid, capability38);
96699
96699
  }
96700
96700
  async function simctlTargetForUdid(udid, options) {
96701
96701
  assertSimctlEntitlement(udid, options);
@@ -97760,6 +97760,9 @@ var axServiceBlueprint = {
97760
97760
  treeVersion: result.treeVersion
97761
97761
  };
97762
97762
  },
97763
+ async foregroundApp() {
97764
+ return await query("foreground_app");
97765
+ },
97763
97766
  async livePanel() {
97764
97767
  const result = await query("live_panel", LIVE_PANEL_TIMEOUT_MS);
97765
97768
  if (result.error) {
@@ -97869,23 +97872,23 @@ var InvalidToolInputError = class extends Error {
97869
97872
  });
97870
97873
  }
97871
97874
  };
97872
- function platformMatrix(platform, capability37) {
97875
+ function platformMatrix(platform, capability38) {
97873
97876
  switch (platform) {
97874
97877
  case "ios":
97875
- return capability37.apple;
97878
+ return capability38.apple;
97876
97879
  case "ios-remote":
97877
- return capability37.appleRemote;
97880
+ return capability38.appleRemote;
97878
97881
  case "android":
97879
- return capability37.android;
97882
+ return capability38.android;
97880
97883
  case "chromium":
97881
- return capability37.chromium;
97884
+ return capability38.chromium;
97882
97885
  case "vega":
97883
- return capability37.vega;
97886
+ return capability38.vega;
97884
97887
  }
97885
97888
  }
97886
- function assertSupported(toolId, capability37, device) {
97887
- if (!capability37) return;
97888
- const matrix = platformMatrix(device.platform, capability37);
97889
+ function assertSupported(toolId, capability38, device) {
97890
+ if (!capability38) return;
97891
+ const matrix = platformMatrix(device.platform, capability38);
97889
97892
  if (!matrix) {
97890
97893
  throw new UnsupportedOperationError(toolId, device, `no ${device.platform} support declared`);
97891
97894
  }
@@ -97893,7 +97896,7 @@ function assertSupported(toolId, capability37, device) {
97893
97896
  if (!supported) {
97894
97897
  throw new UnsupportedOperationError(toolId, device, `kind '${device.kind}' not supported`);
97895
97898
  }
97896
- if (capability37.supports && !capability37.supports(device)) {
97899
+ if (capability38.supports && !capability38.supports(device)) {
97897
97900
  throw new UnsupportedOperationError(toolId, device, "supports() refiner rejected device");
97898
97901
  }
97899
97902
  }
@@ -124889,7 +124892,6 @@ var gestureScrollTool = {
124889
124892
  description: `Scroll content in a Chromium app by dispatching mouse-wheel events at a point. Anchor x/y are normalized 0.0\u20131.0 (fractions of the window, not pixels), same coordinate space as gesture-tap and describe. Deltas are fractions of the window too: deltaY 0.5 scrolls down half a window; negative scrolls back up.
124890
124893
  Use when content is below/above the fold (describe shows off-screen elements with zero height) or a list needs scrolling. Chromium only \u2014 on iOS/Android use gesture-swipe.
124891
124894
  Returns { scrolled: true, timestampMs }. Fails if the Chromium CDP session is not reachable for the given device.`,
124892
- alwaysLoad: true,
124893
124895
  searchHint: "scroll wheel list page chromium mouse down up content fold",
124894
124896
  zodSchema: zodSchema19,
124895
124897
  capability: capability11,
@@ -124956,7 +124958,6 @@ var gestureDragTool = {
124956
124958
  description: `Press the left mouse button at a start point, move to an end point, and release \u2014 a desktop mouse drag in a Chromium app. All positions are normalized 0.0\u20131.0 (fractions of the window, not pixels), same coordinate space as gesture-tap and describe, except that a coordinate of exactly 1.0 lands one pixel inside the window edge (gesture-tap maps it to the edge itself). Interpolates mouse-move events at ~60fps over durationMs for a natural drag (a momentum-free drag samples more finely when durationMs is short, so its ease-out has a curve).
124957
124959
  Use for slider thumbs, drag-and-drop, text selection, or draggable UI elements. Dragging never scrolls content on desktop \u2014 use gesture-scroll for lists/pages. Chromium only \u2014 on iOS/Android use gesture-swipe.
124958
124960
  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.`,
124959
- alwaysLoad: true,
124960
124961
  searchHint: "drag drop slider mouse press move release chromium select",
124961
124962
  zodSchema: zodSchema20,
124962
124963
  capability: capability12,
@@ -127211,7 +127212,6 @@ Single press: { button: "down" }. Repeat the same button: { button: "down", repe
127211
127212
  Multi-step navigation: pass a path as { button: ["up","right","right","select"] } \u2014 it runs in one tool call, far cheaper than separate presses.
127212
127213
  Read the screen with \`describe\` before and after to see where focus landed.
127213
127214
  Returns { pressed, count }.`,
127214
- alwaysLoad: true,
127215
127215
  // A path (≤64 buttons) × repeat (≤50) flattens to thousands of presses, sent
127216
127216
  // one round-trip at a time on the Apple/Android path — minutes of wall-clock.
127217
127217
  longRunning: true,
@@ -127262,9 +127262,9 @@ async function invokeSubTool(registry2, ctx, toolId, args, extra) {
127262
127262
  }
127263
127263
  function describeNestedParamError(registry2, err, toolId, dispatchedArgs, authoredArgs) {
127264
127264
  if (getFailureSignal(err)?.error_code !== FAILURE_CODES.TOOL_INPUT_INVALID) return void 0;
127265
- const zodSchema80 = registry2.getTool(toolId)?.zodSchema;
127266
- if (!zodSchema80) return void 0;
127267
- const parsed = zodSchema80.safeParse(dispatchedArgs ?? {});
127265
+ const zodSchema81 = registry2.getTool(toolId)?.zodSchema;
127266
+ if (!zodSchema81) return void 0;
127267
+ const parsed = zodSchema81.safeParse(dispatchedArgs ?? {});
127268
127268
  if (parsed.success) return void 0;
127269
127269
  return `Invalid params for tool "${toolId}": ${describeParamIssues(parsed.error, authoredArgs)}`;
127270
127270
  }
@@ -137042,6 +137042,73 @@ Fails if the iOS ax-service predates the tree command; update argent.`,
137042
137042
  };
137043
137043
  }
137044
137044
 
137045
+ // ../tool-server/src/tools/foreground-app/index.ts
137046
+ init_zod();
137047
+ var zodSchema42 = external_exports.object({
137048
+ udid: external_exports.string().min(1).describe("Target device id from `list-devices`.")
137049
+ });
137050
+ var capability27 = {
137051
+ apple: { simulator: true },
137052
+ appleRemote: { simulator: true },
137053
+ android: { emulator: true, device: true, unknown: true }
137054
+ };
137055
+ async function readIosForegroundApp(registry2, device) {
137056
+ const ref = axServiceRef(device);
137057
+ const ax = await registry2.resolveService(ref.urn, ref.options);
137058
+ const { bundleId, name, alertVisible } = await ax.foregroundApp();
137059
+ return { bundleId, name, alertVisible };
137060
+ }
137061
+ async function readAndroidForegroundApp(registry2, device) {
137062
+ const ref = androidDevtoolsRef(device);
137063
+ const devtools = await registry2.resolveService(ref.urn, ref.options);
137064
+ const [capture, size] = await Promise.all([
137065
+ // The default settle, as ui-tree: free on a settled screen, and it keeps a
137066
+ // mid-transition window list (right after home or a launch) from naming the old app.
137067
+ devtools.getHierarchy({ maxDepth: 0, clearCache: true }),
137068
+ devtools.getScreenSize()
137069
+ ]);
137070
+ const tree = adaptAndroidTree({ ...capture, truncated: false }, size);
137071
+ return { bundleId: tree.foregroundApp, alertVisible: tree.alertVisible };
137072
+ }
137073
+ function createForegroundAppTool(registry2) {
137074
+ return {
137075
+ id: "foreground-app",
137076
+ interaction: {
137077
+ startedMsg: () => "Reading foreground app",
137078
+ completedMsg: () => "Read foreground app",
137079
+ failedMsg: ({ failureSignal: failureSignal2 }) => `Failed to read foreground app: ${failureSignal2.error_code}`
137080
+ },
137081
+ description: `Read which app is in front, for SDK callers.
137082
+ Returns { bundleId, name, alertVisible }; under a system alert, bundleId is the app it covers.
137083
+ A field is unset when it is unknown.`,
137084
+ hideFromMcp: true,
137085
+ zodSchema: zodSchema42,
137086
+ capability: capability27,
137087
+ services: () => ({}),
137088
+ execute: dispatchByPlatform({
137089
+ toolId: "foreground-app",
137090
+ capability: capability27,
137091
+ ios: {
137092
+ requires: iosRequires,
137093
+ handler: async (_services, _params, device) => {
137094
+ if (await isTvOsSimulator(device.id)) {
137095
+ throw new UnsupportedOperationError("foreground-app", device, "tvOS");
137096
+ }
137097
+ return readIosForegroundApp(registry2, device);
137098
+ }
137099
+ },
137100
+ iosRemote: {
137101
+ requires: ["sim-remote"],
137102
+ handler: async (_services, _params, device) => readIosForegroundApp(registry2, device)
137103
+ },
137104
+ android: {
137105
+ requires: androidRequires,
137106
+ handler: async (_services, _params, device) => readAndroidForegroundApp(registry2, device)
137107
+ }
137108
+ })
137109
+ };
137110
+ }
137111
+
137045
137112
  // ../tool-server/src/tools/await-screen-idle/index.ts
137046
137113
  init_zod();
137047
137114
  init_device_info();
@@ -137050,7 +137117,7 @@ var AWAIT_SCREEN_IDLE_TOOL_ID = "await-screen-idle";
137050
137117
  var DEFAULT_TIMEOUT_MS4 = 3e3;
137051
137118
  var DEFAULT_POLL_INTERVAL_MS2 = 200;
137052
137119
  var DEFAULT_MIN_STABLE_MS = 250;
137053
- var zodSchema42 = external_exports.object({
137120
+ var zodSchema43 = external_exports.object({
137054
137121
  udid: external_exports.string().min(1).describe("Target device id from `list-devices` (iOS UDID, Android serial, or Chromium id)."),
137055
137122
  timeoutMs: external_exports.number().int().positive().max(12e4).optional().describe(
137056
137123
  `Max time to wait for the screen to settle before giving up (default ${DEFAULT_TIMEOUT_MS4}).`
@@ -137060,7 +137127,7 @@ var zodSchema42 = external_exports.object({
137060
137127
  `The screen must hold the same content for at least this long to count as settled (default ${DEFAULT_MIN_STABLE_MS}).`
137061
137128
  )
137062
137129
  }).strict();
137063
- var capability27 = {
137130
+ var capability28 = {
137064
137131
  apple: { simulator: true, device: true },
137065
137132
  appleRemote: { simulator: true },
137066
137133
  android: { emulator: true, device: true, unknown: true },
@@ -137107,8 +137174,8 @@ ${DEFAULT_TIMEOUT_MS4}ms) is reached. Returns { settled, waitedMs, polls } \u201
137107
137174
  still before the timeout. Use after a launch/navigation to wait for the UI to render before screenshotting or tapping.`,
137108
137175
  searchHint: "wait until screen settles idle stable stops changing animation transition rendered ready before screenshot",
137109
137176
  longRunning: true,
137110
- zodSchema: zodSchema42,
137111
- capability: capability27,
137177
+ zodSchema: zodSchema43,
137178
+ capability: capability28,
137112
137179
  services: (params) => {
137113
137180
  const device = resolveDevice(params.udid);
137114
137181
  if (device.platform === "chromium") {
@@ -137118,7 +137185,7 @@ still before the timeout. Use after a launch/navigation to wait for the UI to re
137118
137185
  },
137119
137186
  async execute(services, params, ctx) {
137120
137187
  const device = resolveDevice(params.udid);
137121
- assertSupported(AWAIT_SCREEN_IDLE_TOOL_ID, capability27, device);
137188
+ assertSupported(AWAIT_SCREEN_IDLE_TOOL_ID, capability28, device);
137122
137189
  if (device.platform === "ios") await ensureDeps(iosRequires);
137123
137190
  else if (device.platform === "ios-remote") await ensureDeps(["sim-remote"]);
137124
137191
  else if (device.platform === "android") await ensureDeps(androidRequires);
@@ -137205,7 +137272,7 @@ function bootstrapFailureMessage(bootstrap) {
137205
137272
  // ../tool-server/src/tools/profiler/react/react-profiler-start.ts
137206
137273
  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.";
137207
137274
  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.";
137208
- var zodSchema43 = external_exports.object({
137275
+ var zodSchema44 = external_exports.object({
137209
137276
  port: metroPortField,
137210
137277
  device_id: external_exports.string().describe(
137211
137278
  "Device id from list-devices \u2014 the SAME id you passed to debugger-connect (iOS simulator UDID or Android serial)."
@@ -137237,7 +137304,7 @@ Before calling this, ask the user if they also want native profiling (native-pro
137237
137304
  After starting, ask the user to perform the interaction to profile, then call react-profiler-stop.
137238
137305
  Returns { started_at, startedAtEpochMs, hermes_version, detected_architecture } on success, or the already_running payload described above.
137239
137306
  Fails if the Hermes runtime is not reachable or the Metro CDP connection cannot be established.`,
137240
- zodSchema: zodSchema43,
137307
+ zodSchema: zodSchema44,
137241
137308
  capability: RN_ONLY_TOOL_CAPABILITY,
137242
137309
  services: () => ({}),
137243
137310
  async execute(_services, params) {
@@ -137508,7 +137575,7 @@ async function readCommitTree(path53) {
137508
137575
  }
137509
137576
 
137510
137577
  // ../tool-server/src/tools/profiler/react/react-profiler-stop.ts
137511
- var zodSchema44 = external_exports.object({
137578
+ var zodSchema45 = external_exports.object({
137512
137579
  port: metroPortField,
137513
137580
  device_id: external_exports.string().describe(
137514
137581
  "Device id from list-devices \u2014 the SAME id you passed to debugger-connect (iOS simulator UDID or Android serial)."
@@ -137597,7 +137664,7 @@ Call react-profiler-start first, then exercise the app, then call this.
137597
137664
  Returns { duration_ms, sample_count, fiber_renders_captured, total_react_commits, hot_commit_indices } summarizing the session.
137598
137665
  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).
137599
137666
  Fails if no active profiling session exists or the CDP connection was lost during recording.`,
137600
- zodSchema: zodSchema44,
137667
+ zodSchema: zodSchema45,
137601
137668
  capability: RN_ONLY_TOOL_CAPABILITY,
137602
137669
  services: () => ({}),
137603
137670
  async execute(_services, params) {
@@ -137822,7 +137889,7 @@ Fails if no active profiling session exists or the CDP connection was lost durin
137822
137889
 
137823
137890
  // ../tool-server/src/tools/profiler/react/react-profiler-status.ts
137824
137891
  init_zod();
137825
- var zodSchema45 = external_exports.object({
137892
+ var zodSchema46 = external_exports.object({
137826
137893
  port: metroPortField,
137827
137894
  device_id: external_exports.string().describe(
137828
137895
  "Device logicalDeviceId from debugger-connect (iOS simulator UDID or Android logicalDeviceId)."
@@ -137837,7 +137904,7 @@ function createReactProfilerStatusTool(registry2) {
137837
137904
  failedMsg: ({ failureSignal: failureSignal2 }) => `Failed to check React profiler: ${failureSignal2.error_code}`
137838
137905
  },
137839
137906
  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.`,
137840
- zodSchema: zodSchema45,
137907
+ zodSchema: zodSchema46,
137841
137908
  // RN-only: companion to react-profiler-start.
137842
137909
  capability: RN_ONLY_TOOL_CAPABILITY,
137843
137910
  services: () => ({}),
@@ -139451,7 +139518,7 @@ var annotationSchema = external_exports.object({
139451
139518
  ),
139452
139519
  label: external_exports.string().describe("Description of the action performed")
139453
139520
  });
139454
- var zodSchema46 = external_exports.object({
139521
+ var zodSchema47 = external_exports.object({
139455
139522
  port: metroPortField,
139456
139523
  device_id: external_exports.string().describe(
139457
139524
  "Device logicalDeviceId from debugger-connect (iOS simulator UDID or Android logicalDeviceId)."
@@ -139484,7 +139551,7 @@ where tapTimestampMs is the timestampMs returned by the tap/swipe tool and start
139484
139551
  is returned by react-profiler-start.
139485
139552
  Use when the profiling session is complete and you need to interpret the collected data.
139486
139553
  Fails if react-profiler-stop has not been called or no profiling data is stored.`,
139487
- zodSchema: zodSchema46,
139554
+ zodSchema: zodSchema47,
139488
139555
  // RN-only: reads commit data captured via the React DevTools backend, which
139489
139556
  // Chromium does not have.
139490
139557
  capability: RN_ONLY_TOOL_CAPABILITY,
@@ -139621,7 +139688,7 @@ Fails if react-profiler-stop has not been called or no profiling data is stored.
139621
139688
  // ../tool-server/src/tools/profiler/react/react-profiler-component-source.ts
139622
139689
  init_zod();
139623
139690
  var import_fs6 = require("fs");
139624
- var zodSchema47 = external_exports.object({
139691
+ var zodSchema48 = external_exports.object({
139625
139692
  component_name: external_exports.string().describe("Name of the React component to look up"),
139626
139693
  project_root: external_exports.string().describe("Absolute path to the RN project root")
139627
139694
  });
@@ -139639,7 +139706,7 @@ var reactProfilerComponentSourceTool = {
139639
139706
  Call this per-finding after react-profiler-analyze to inspect source before proposing a fix.
139640
139707
  Returns found: false if the component is not found in user-owned code (e.g. lives in node_modules).
139641
139708
  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.`,
139642
- zodSchema: zodSchema47,
139709
+ zodSchema: zodSchema48,
139643
139710
  // Declared so the tool catalogue groups this with the other react-profiler-*
139644
139711
  // tools; the HTTP gate itself is a no-op here, as there is no device arg to
139645
139712
  // inspect.
@@ -139695,7 +139762,7 @@ When several files define a component with the same name (e.g. platform variants
139695
139762
  // ../tool-server/src/tools/profiler/react/react-profiler-cpu-summary.ts
139696
139763
  init_zod();
139697
139764
  init_src2();
139698
- var zodSchema48 = external_exports.object({
139765
+ var zodSchema49 = external_exports.object({
139699
139766
  port: metroPortField,
139700
139767
  device_id: external_exports.string().describe(
139701
139768
  "Device logicalDeviceId from debugger-connect (iOS simulator UDID or Android logicalDeviceId)."
@@ -139777,7 +139844,7 @@ Use when you specifically need to investigate JS CPU hotspots that are NOT tied
139777
139844
  Call react-profiler-stop first. Reads directly from the stored cpuProfile.
139778
139845
  Returns a markdown table of the top hotspot functions with self-time, total-time, and location.
139779
139846
  Fails if react-profiler-stop has not been called or no CPU profile is stored.`,
139780
- zodSchema: zodSchema48,
139847
+ zodSchema: zodSchema49,
139781
139848
  // RN-only: reads a Hermes CPU profile; Chromium's V8 sample format differs.
139782
139849
  capability: RN_ONLY_TOOL_CAPABILITY,
139783
139850
  services: () => ({}),
@@ -139873,7 +139940,7 @@ function renderMarkdownTable2(entries) {
139873
139940
  );
139874
139941
  return [header, sep5, ...rows].join("\n");
139875
139942
  }
139876
- var zodSchema49 = external_exports.object({
139943
+ var zodSchema50 = external_exports.object({
139877
139944
  port: metroPortField,
139878
139945
  device_id: external_exports.string().describe(
139879
139946
  "Device logicalDeviceId from debugger-connect (iOS simulator UDID or Android logicalDeviceId)."
@@ -139891,7 +139958,7 @@ var reactProfilerRendersTool = {
139891
139958
  Returns a markdown table of the top re-rendering components. No profiling session required \u2014 works on a live connected app.
139892
139959
  Use when you want a quick snapshot of render counts without a full profiling session.
139893
139960
  Fails if the React DevTools hook is not present in the runtime or the app is not connected.`,
139894
- zodSchema: zodSchema49,
139961
+ zodSchema: zodSchema50,
139895
139962
  // RN-only: queries the React DevTools backend hook on the live runtime.
139896
139963
  capability: RN_ONLY_TOOL_CAPABILITY,
139897
139964
  services: (params) => ({
@@ -140048,7 +140115,7 @@ function buildFiberTreeScript(maxDepth, filter) {
140048
140115
  }
140049
140116
  })()`;
140050
140117
  }
140051
- var zodSchema50 = external_exports.object({
140118
+ var zodSchema51 = external_exports.object({
140052
140119
  port: metroPortField,
140053
140120
  device_id: external_exports.string().describe(
140054
140121
  "Device logicalDeviceId from debugger-connect (iOS simulator UDID or Android logicalDeviceId)."
@@ -140067,7 +140134,7 @@ var reactProfilerFiberTreeTool = {
140067
140134
  Use when tracing ancestry of a library component or checking for useMemoCache hook (confirms React Compiler is active on a component).
140068
140135
  Returns a nested JSON tree of fiber nodes with name, tag, actualDuration, selfBaseDuration, and children.
140069
140136
  Fails if the React DevTools hook is not present or no fiber roots have been committed yet.`,
140070
- zodSchema: zodSchema50,
140137
+ zodSchema: zodSchema51,
140071
140138
  // RN-only: walks the fiber tree via the React DevTools backend hook.
140072
140139
  capability: RN_ONLY_TOOL_CAPABILITY,
140073
140140
  services: (params) => ({
@@ -143865,7 +143932,7 @@ function metroDeviceIdParam(description) {
143865
143932
  }
143866
143933
 
143867
143934
  // ../tool-server/src/tools/profiler/native-profiler/native-profiler-start.ts
143868
- var zodSchema51 = external_exports.object({
143935
+ var zodSchema52 = external_exports.object({
143869
143936
  device_id: metroDeviceIdParam(
143870
143937
  "Target device id from `list-devices` (iOS UDID or Android serial)."
143871
143938
  ),
@@ -143879,7 +143946,7 @@ var zodSchema51 = external_exports.object({
143879
143946
  "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."
143880
143947
  )
143881
143948
  });
143882
- var capability28 = {
143949
+ var capability29 = {
143883
143950
  apple: { simulator: true },
143884
143951
  android: { emulator: true, device: true, unknown: true }
143885
143952
  };
@@ -143890,21 +143957,21 @@ var nativeProfilerStartTool = {
143890
143957
  completedMsg: () => "Started native profiler",
143891
143958
  failedMsg: ({ failureSignal: failureSignal2 }) => `Failed to start native profiler: ${failureSignal2.error_code}`
143892
143959
  },
143893
- capability: capability28,
143960
+ capability: capability29,
143894
143961
  description: `Start native profiling on a booted device. iOS: Instruments via xctrace (CPU, hangs, memory). Android: Perfetto (CPU, jank, RSS-growth weak signal).
143895
143962
  Auto-detects the running app process unless app_process is explicitly provided.
143896
143963
  After starting, let the user interact with the app, then call native-profiler-stop.
143897
143964
  Use when you want to capture native CPU, hang, and memory data for a running app.
143898
143965
  Returns { status, pid, traceFile } confirming the recording has started.
143899
143966
  Fails if no app is running on the device, or the profiler cannot attach to the process.`,
143900
- zodSchema: zodSchema51,
143967
+ zodSchema: zodSchema52,
143901
143968
  services: (params) => ({
143902
143969
  session: nativeProfilerSessionRef(resolveDevice(params.device_id))
143903
143970
  }),
143904
143971
  async execute(services, params) {
143905
143972
  const api = services.session;
143906
143973
  const device = resolveDevice(params.device_id);
143907
- assertSupported("native-profiler-start", capability28, device);
143974
+ assertSupported("native-profiler-start", capability29, device);
143908
143975
  if (api.platform === "ios") {
143909
143976
  await ensureDeps(["xcrun"]);
143910
143977
  return startNativeProfilerIos(api, params);
@@ -143917,12 +143984,12 @@ Fails if no app is running on the device, or the profiler cannot attach to the p
143917
143984
  // ../tool-server/src/tools/profiler/native-profiler/native-profiler-stop.ts
143918
143985
  init_zod();
143919
143986
  init_device_info();
143920
- var zodSchema52 = external_exports.object({
143987
+ var zodSchema53 = external_exports.object({
143921
143988
  device_id: metroDeviceIdParam(
143922
143989
  "Target device id from `list-devices` (iOS UDID or Android serial)."
143923
143990
  )
143924
143991
  });
143925
- var capability29 = {
143992
+ var capability30 = {
143926
143993
  apple: { simulator: true },
143927
143994
  android: { emulator: true, device: true, unknown: true }
143928
143995
  };
@@ -143950,7 +144017,7 @@ var nativeProfilerStopTool = {
143950
144017
  completedMsg: ({ result }) => `Saved native profile ${result.traceFile.filename}`,
143951
144018
  failedMsg: ({ failureSignal: failureSignal2 }) => `Failed to stop native profiler: ${failureSignal2.error_code}`
143952
144019
  },
143953
- capability: capability29,
144020
+ capability: capability30,
143954
144021
  // Packaging plus the export passes routinely exceed the 30s MCP fetch timeout.
143955
144022
  longRunning: true,
143956
144023
  description: `Stop native profiling and export trace data.
@@ -143960,14 +144027,14 @@ Call native-profiler-start first.
143960
144027
  Use when the user has finished the interaction to profile and you need to export the trace.
143961
144028
  Returns { traceFile, exportedFiles, exportDiagnostics? }; traceFile is the raw trace bundle and exportedFiles the exports, all downloadable artifacts materialized to local paths.
143962
144029
  Fails if no active native-profiler-start session exists for the given device_id.`,
143963
- zodSchema: zodSchema52,
144030
+ zodSchema: zodSchema53,
143964
144031
  services: (params) => ({
143965
144032
  session: nativeProfilerSessionRef(resolveDevice(params.device_id))
143966
144033
  }),
143967
144034
  async execute(services, params, ctx) {
143968
144035
  const api = services.session;
143969
144036
  const device = resolveDevice(params.device_id);
143970
- assertSupported("native-profiler-stop", capability29, device);
144037
+ assertSupported("native-profiler-stop", capability30, device);
143971
144038
  if (api.platform === "ios") {
143972
144039
  await ensureDeps(["xcrun"]);
143973
144040
  const ios = await stopNativeProfilerIos(api);
@@ -143995,12 +144062,12 @@ Fails if no active native-profiler-start session exists for the given device_id.
143995
144062
  // ../tool-server/src/tools/profiler/native-profiler/native-profiler-analyze.ts
143996
144063
  init_zod();
143997
144064
  init_device_info();
143998
- var zodSchema53 = external_exports.object({
144065
+ var zodSchema54 = external_exports.object({
143999
144066
  device_id: metroDeviceIdParam(
144000
144067
  "Target device id from `list-devices` (iOS UDID or Android serial)."
144001
144068
  )
144002
144069
  });
144003
- var capability30 = {
144070
+ var capability31 = {
144004
144071
  apple: { simulator: true },
144005
144072
  android: { emulator: true, device: true, unknown: true }
144006
144073
  };
@@ -144011,7 +144078,7 @@ var nativeProfilerAnalyzeTool = {
144011
144078
  completedMsg: () => "Analyzed native profile",
144012
144079
  failedMsg: ({ failureSignal: failureSignal2 }) => `Failed to analyze native profile: ${failureSignal2.error_code}`
144013
144080
  },
144014
- capability: capability30,
144081
+ capability: capability31,
144015
144082
  // Parsing a trace from a recording up to RECORDING_CAP_MS long routinely exceeds
144016
144083
  // the 30s MCP fetch timeout, and an aborted call is replayed, not cancelled.
144017
144084
  longRunning: true,
@@ -144024,14 +144091,14 @@ profiler-stack-query for hang stacks, CPU context, leak details) or implement fi
144024
144091
  Call native-profiler-stop first to export the trace data.
144025
144092
  Use when you need to interpret a completed native profiling recording.
144026
144093
  Fails if native-profiler-stop has not been called first to export trace data.`,
144027
- zodSchema: zodSchema53,
144094
+ zodSchema: zodSchema54,
144028
144095
  services: (params) => ({
144029
144096
  session: nativeProfilerSessionRef(resolveDevice(params.device_id))
144030
144097
  }),
144031
144098
  async execute(services, params, ctx) {
144032
144099
  const api = services.session;
144033
144100
  const device = resolveDevice(params.device_id);
144034
- assertSupported("native-profiler-analyze", capability30, device);
144101
+ assertSupported("native-profiler-analyze", capability31, device);
144035
144102
  let result;
144036
144103
  if (api.platform === "ios") {
144037
144104
  await ensureDeps(["xcrun"]);
@@ -145094,7 +145161,7 @@ var DEFAULT_TIME_LIMIT_SECONDS = 180;
145094
145161
  var MAX_TIME_LIMIT_SECONDS = 600;
145095
145162
  var POINTER_TRAIL_LENGTH = 8;
145096
145163
  var POINTER_REQUEST_TIMEOUT_MS = 2e3;
145097
- var zodSchema54 = external_exports.object({
145164
+ var zodSchema55 = external_exports.object({
145098
145165
  udid: external_exports.string().describe("Target device id from `list-devices` (iOS Simulator UDID or Android serial)."),
145099
145166
  timeLimitSeconds: external_exports.number().int().min(1).max(MAX_TIME_LIMIT_SECONDS).optional().describe(
145100
145167
  `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.`
@@ -145106,7 +145173,7 @@ var zodSchema54 = external_exports.object({
145106
145173
  "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."
145107
145174
  )
145108
145175
  });
145109
- var capability31 = {
145176
+ var capability32 = {
145110
145177
  apple: { simulator: true },
145111
145178
  android: { emulator: true, device: true, unknown: true }
145112
145179
  };
@@ -145118,7 +145185,7 @@ function createScreenRecordingStartTool(registry2) {
145118
145185
  completedMsg: () => "Started screen recording",
145119
145186
  failedMsg: ({ failureSignal: failureSignal2 }) => `Failed to start screen recording: ${failureSignal2.error_code}`
145120
145187
  },
145121
- capability: capability31,
145188
+ capability: capability32,
145122
145189
  description: `Start recording the device screen to a video file (h264 mp4, 30fps at the device's native resolution).
145123
145190
  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.
145124
145191
  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.
@@ -145127,7 +145194,7 @@ Use when the user wants a video of an interaction, animation, or app behavior \u
145127
145194
  Returns { status: "recording", timeLimitSeconds, outputFile } \u2014 the video is retrieved later by \`screen-recording-stop\`, not by reading outputFile directly.
145128
145195
  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).`,
145129
145196
  searchHint: "record video screen capture movie mp4 start filming screencast",
145130
- zodSchema: zodSchema54,
145197
+ zodSchema: zodSchema55,
145131
145198
  // Resolved inside execute, not declared eagerly: a tvOS udid classifies as
145132
145199
  // iOS by shape, so an eager service would spawn simulator-server for a
145133
145200
  // device it cannot drive and hang on its ready timeout (as in `screenshot`).
@@ -145137,7 +145204,7 @@ Fails if a recording is already running on the device, the device is not booted,
145137
145204
  async execute(services, params) {
145138
145205
  const api = services.session;
145139
145206
  const device = resolveDevice(params.udid);
145140
- assertSupported("screen-recording-start", capability31, device);
145207
+ assertSupported("screen-recording-start", capability32, device);
145141
145208
  if (device.platform === "ios" && await isTvOsSimulator(params.udid)) {
145142
145209
  throw new FailureError(
145143
145210
  `Screen recording is not supported on tvOS simulators (device ${params.udid}).`,
@@ -145226,11 +145293,11 @@ function makePointerControl(simulator) {
145226
145293
  var import_node_path22 = require("node:path");
145227
145294
  init_zod();
145228
145295
  init_device_info();
145229
- var zodSchema55 = external_exports.object({
145296
+ var zodSchema56 = external_exports.object({
145230
145297
  udid: external_exports.string().describe("Target device id from `list-devices` (iOS Simulator UDID or Android serial).")
145231
145298
  });
145232
145299
  var RECORDINGS_DIR = ".argent/recordings";
145233
- var capability32 = {
145300
+ var capability33 = {
145234
145301
  apple: { simulator: true },
145235
145302
  android: { emulator: true, device: true, unknown: true }
145236
145303
  };
@@ -145241,21 +145308,21 @@ var screenRecordingStopTool = {
145241
145308
  completedMsg: ({ result }) => `Saved screen recording ${result.video.filename}`,
145242
145309
  failedMsg: ({ failureSignal: failureSignal2 }) => `Failed to stop screen recording: ${failureSignal2.error_code}`
145243
145310
  },
145244
- capability: capability32,
145311
+ capability: capability33,
145245
145312
  description: `Stop the screen recording started by \`screen-recording-start\` and retrieve the video: frame capture ends and ffmpeg finalizes the mp4.
145246
145313
  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.
145247
145314
  Use when the interaction being captured is finished, or a tool-result note reminds you a recording is still running.
145248
145315
  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.
145249
145316
  Fails if no recording (running or finished-but-unretrieved) exists for the given udid.`,
145250
145317
  searchHint: "stop end finish screen recording video capture save retrieve",
145251
- zodSchema: zodSchema55,
145318
+ zodSchema: zodSchema56,
145252
145319
  services: (params) => ({
145253
145320
  session: screenRecordingSessionRef(resolveDevice(params.udid))
145254
145321
  }),
145255
145322
  async execute(services, params, ctx) {
145256
145323
  const api = services.session;
145257
145324
  const device = resolveDevice(params.udid);
145258
- assertSupported("screen-recording-stop", capability32, device);
145325
+ assertSupported("screen-recording-stop", capability33, device);
145259
145326
  const stopped = await stopCapture(api);
145260
145327
  const artifacts = requireArtifacts(ctx);
145261
145328
  const video = await artifacts.register({
@@ -145287,7 +145354,7 @@ var timeWindowSchema = external_exports.object({
145287
145354
  "End of window in ms since profiling started \u2014 the same clock profiler-commit-query prints"
145288
145355
  )
145289
145356
  });
145290
- var zodSchema56 = external_exports.object({
145357
+ var zodSchema57 = external_exports.object({
145291
145358
  port: metroPortField,
145292
145359
  device_id: metroDeviceIdParam(
145293
145360
  "Device logicalDeviceId from debugger-connect (iOS simulator UDID or Android logicalDeviceId)."
@@ -145576,7 +145643,7 @@ Every table states how many samples it covers and how much of that was idle.
145576
145643
  Use when investigating JS CPU hotspots or correlating CPU cost with specific components.
145577
145644
  Returns a markdown table of CPU hotspots, call tree, or per-component CPU breakdown.
145578
145645
  Fails if no CPU profile is stored \u2014 run react-profiler-stop first.`,
145579
- zodSchema: zodSchema56,
145646
+ zodSchema: zodSchema57,
145580
145647
  // RN-only: reads Hermes-format CPU profiles; Chromium's V8 sample format differs.
145581
145648
  capability: RN_ONLY_TOOL_CAPABILITY,
145582
145649
  services: () => ({}),
@@ -145662,7 +145729,7 @@ var timeRangeSchema = external_exports.object({
145662
145729
  "End of range in ms since profiling started \u2014 the same clock profiler-commit-query prints"
145663
145730
  )
145664
145731
  });
145665
- var zodSchema57 = external_exports.object({
145732
+ var zodSchema58 = external_exports.object({
145666
145733
  port: metroPortField,
145667
145734
  device_id: metroDeviceIdParam(
145668
145735
  "Device logicalDeviceId from debugger-connect (iOS simulator UDID or Android logicalDeviceId)."
@@ -145935,7 +146002,7 @@ Modes:
145935
146002
  Use when drilling into specific components or time windows after react-profiler-analyze.
145936
146003
  Returns a markdown table or tree of commit data matching the requested mode.
145937
146004
  Fails if react-profiler-stop has not been called or no commit data is stored.`,
145938
- zodSchema: zodSchema57,
146005
+ zodSchema: zodSchema58,
145939
146006
  // Reads React commit data captured via the React DevTools backend.
145940
146007
  capability: RN_ONLY_TOOL_CAPABILITY,
145941
146008
  services: () => ({}),
@@ -146006,7 +146073,7 @@ Fails if react-profiler-stop has not been called or no commit data is stored.`,
146006
146073
  init_zod();
146007
146074
  init_src2();
146008
146075
  init_device_info();
146009
- var zodSchema58 = external_exports.object({
146076
+ var zodSchema59 = external_exports.object({
146010
146077
  device_id: metroDeviceIdParam("iOS Simulator UDID or Android serial."),
146011
146078
  mode: external_exports.enum(["hang_stacks", "function_callers", "thread_breakdown", "leak_stacks"]).describe(
146012
146079
  "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)"
@@ -146324,7 +146391,7 @@ Modes:
146324
146391
  Use when drilling into native hang stacks, thread CPU breakdown, or memory leaks after native-profiler-analyze.
146325
146392
  Returns a markdown report with native call stacks, thread weights, or leak details for the selected mode.
146326
146393
  Fails if native-profiler-analyze has not been run or no parsed trace data is in memory.`,
146327
- zodSchema: zodSchema58,
146394
+ zodSchema: zodSchema59,
146328
146395
  // No chromium entry: it has no native trace capture.
146329
146396
  capability: {
146330
146397
  apple: { simulator: true },
@@ -146394,7 +146461,7 @@ function buildPerfettoAnchor(wallClockStartMs) {
146394
146461
  }
146395
146462
 
146396
146463
  // ../tool-server/src/tools/profiler/combined/profiler-combined-report.ts
146397
- var zodSchema59 = external_exports.object({
146464
+ var zodSchema60 = external_exports.object({
146398
146465
  port: metroPortField,
146399
146466
  device_id: metroDeviceIdParam("iOS Simulator/device UDID or Android serial")
146400
146467
  });
@@ -146411,7 +146478,7 @@ Requires both react-profiler-analyze and native-profiler-analyze to have been ca
146411
146478
  Call this tool when both profilers were run in parallel on the same session.
146412
146479
  Returns a markdown report correlating hangs with React commits, memory leaks, and investigation hints.
146413
146480
  Fails if either react-profiler-analyze or native-profiler-analyze has not been called first.`,
146414
- zodSchema: zodSchema59,
146481
+ zodSchema: zodSchema60,
146415
146482
  // iOS reads xctrace output; Android re-queries the Perfetto .pftrace via
146416
146483
  // loadAndroidCombinedData. Chromium has no native trace capture.
146417
146484
  capability: {
@@ -146735,7 +146802,7 @@ function assertSafeSessionId(sessionId) {
146735
146802
  );
146736
146803
  }
146737
146804
  }
146738
- var zodSchema60 = external_exports.object({
146805
+ var zodSchema61 = external_exports.object({
146739
146806
  mode: external_exports.enum(["list", "load_react", "load_native"]).describe(
146740
146807
  "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."
146741
146808
  ),
@@ -147096,7 +147163,7 @@ Modes:
147096
147163
  For Android .pftrace restores, pass app_process for older sessions that do not have a metadata sidecar.
147097
147164
  Returns a summary of the loaded session or a session list for the list mode.
147098
147165
  Fails if the session_id is not found or required XML files are missing from disk.`,
147099
- zodSchema: zodSchema60,
147166
+ zodSchema: zodSchema61,
147100
147167
  // The Hermes, xctrace and perfetto formats this loads have no Chromium
147101
147168
  // equivalent; the gate fails at the call site, not inside the trace parser.
147102
147169
  capability: RN_ONLY_TOOL_CAPABILITY,
@@ -147225,7 +147292,7 @@ function unnameableSessionUrns(urns) {
147225
147292
  }
147226
147293
 
147227
147294
  // ../tool-server/src/tools/simulator/stop-simulator-server.ts
147228
- var zodSchema61 = external_exports.object({
147295
+ var zodSchema62 = external_exports.object({
147229
147296
  udid: external_exports.string().describe(
147230
147297
  "Target device id (iOS UDID, Android serial, or Chromium id) whose transport session to stop"
147231
147298
  )
@@ -147239,7 +147306,7 @@ function createStopSimulatorServerTool(registry2) {
147239
147306
  failedMsg: ({ params, failureSignal: failureSignal2 }) => `Failed to stop simulator server for ${params.udid}: ${failureSignal2.error_code}`
147240
147307
  },
147241
147308
  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.`,
147242
- zodSchema: zodSchema61,
147309
+ zodSchema: zodSchema62,
147243
147310
  services: () => ({}),
147244
147311
  async execute(_services, params) {
147245
147312
  const udid = params.udid;
@@ -147270,7 +147337,7 @@ function createStopSimulatorServerTool(registry2) {
147270
147337
  init_zod();
147271
147338
  init_src2();
147272
147339
  init_external_devices();
147273
- var zodSchema62 = external_exports.object({
147340
+ var zodSchema63 = external_exports.object({
147274
147341
  devices: external_exports.array(external_exports.string()).optional().describe(
147275
147342
  "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."
147276
147343
  )
@@ -147309,7 +147376,7 @@ function createStopAllSimulatorServersTool(registry2) {
147309
147376
  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.
147310
147377
  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.
147311
147378
  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.`,
147312
- zodSchema: zodSchema62,
147379
+ zodSchema: zodSchema63,
147313
147380
  services: () => ({}),
147314
147381
  async execute(_services, params, ctx) {
147315
147382
  const devices = params.devices;
@@ -147389,7 +147456,7 @@ function listeningPids(port) {
147389
147456
  if (!output) return [];
147390
147457
  return output.split("\n").map((s) => parseInt(s.trim(), 10)).filter((n) => !Number.isNaN(n));
147391
147458
  }
147392
- var zodSchema63 = external_exports.object({
147459
+ var zodSchema64 = external_exports.object({
147393
147460
  port: external_exports.number().int().min(1).max(65535).default(8081).describe("TCP port Metro is listening on (default 8081)")
147394
147461
  });
147395
147462
  var stopMetroTool = {
@@ -147400,7 +147467,7 @@ var stopMetroTool = {
147400
147467
  failedMsg: ({ params, failureSignal: failureSignal2 }) => `Failed to stop Metro on port ${params.port}: ${failureSignal2.error_code}`
147401
147468
  },
147402
147469
  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.`,
147403
- zodSchema: zodSchema63,
147470
+ zodSchema: zodSchema64,
147404
147471
  services: () => ({}),
147405
147472
  async execute(_services, params) {
147406
147473
  const port = params.port;
@@ -149744,7 +149811,7 @@ async function appendStepToFlow(session, step) {
149744
149811
  }
149745
149812
 
149746
149813
  // ../tool-server/src/tools/flows/flow-start-recording.ts
149747
- var zodSchema64 = external_exports.object({
149814
+ var zodSchema65 = external_exports.object({
149748
149815
  name: external_exports.string().describe(
149749
149816
  'Name for this flow (e.g. "settings-explore") \u2014 letters, digits, underscore and hyphen only.'
149750
149817
  ),
@@ -149801,7 +149868,7 @@ recording. Over a link, the next recorded step writes over your edit.
149801
149868
  Without a link, the recorder reads the file again before each step, but an
149802
149869
  edit that renumbers the steps drops the warnings that flow-finish-recording
149803
149870
  reports for those steps.`,
149804
- zodSchema: zodSchema64,
149871
+ zodSchema: zodSchema65,
149805
149872
  fileInputs: fileInputs2,
149806
149873
  services: () => ({}),
149807
149874
  async execute(_services, params, ctx) {
@@ -152301,7 +152368,7 @@ function stepAnchor(step) {
152301
152368
 
152302
152369
  // ../tool-server/src/tools/flows/flow-add-step.ts
152303
152370
  init_device_info();
152304
- var zodSchema65 = external_exports.object({
152371
+ var zodSchema66 = external_exports.object({
152305
152372
  name: external_exports.string().describe("Name of the flow being recorded \u2014 the one passed to flow-start-recording."),
152306
152373
  project_root: external_exports.string().describe(
152307
152374
  "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."
@@ -152760,7 +152827,7 @@ Returns { message, stepCount, recorded, savedTo }; \`recorded\`, not the status,
152760
152827
  // more times — and every retry re-runs the action and appends another step,
152761
152828
  // because an aborted request still appends its first.
152762
152829
  longRunning: true,
152763
- zodSchema: zodSchema65,
152830
+ zodSchema: zodSchema66,
152764
152831
  fileInputs: fileInputs3,
152765
152832
  services: () => ({}),
152766
152833
  async execute(_services, params, ctx) {
@@ -152949,7 +153016,7 @@ Returns { message, stepCount, recorded, savedTo }; \`recorded\`, not the status,
152949
153016
 
152950
153017
  // ../tool-server/src/tools/flows/flow-insert-echo.ts
152951
153018
  init_zod();
152952
- var zodSchema66 = external_exports.object({
153019
+ var zodSchema67 = external_exports.object({
152953
153020
  name: external_exports.string().describe("Name of the flow being recorded \u2014 the one passed to flow-start-recording."),
152954
153021
  project_root: external_exports.string().describe(
152955
153022
  "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."
@@ -152967,7 +153034,7 @@ var flowInsertEchoTool = {
152967
153034
  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.
152968
153035
  Use when you want to annotate a recorded flow with a human-readable label or checkpoint message.
152969
153036
  Returns { message, stepCount, savedTo }. Fails if that flow has no recording in progress.`,
152970
- zodSchema: zodSchema66,
153037
+ zodSchema: zodSchema67,
152971
153038
  services: () => ({}),
152972
153039
  async execute(_services, params) {
152973
153040
  const session = await requireRecordingSession(params.project_root, params.name);
@@ -154270,7 +154337,7 @@ function errMsg3(err) {
154270
154337
 
154271
154338
  // ../tool-server/src/tools/flows/flow-add-script.ts
154272
154339
  var OUTPUT_RENDER_LIMIT_BYTES = 64 * 1024;
154273
- var zodSchema67 = external_exports.object({
154340
+ var zodSchema68 = external_exports.object({
154274
154341
  name: external_exports.string().describe("Flow name passed to flow-start-recording."),
154275
154342
  project_root: external_exports.string().describe("Absolute project root passed to flow-start-recording."),
154276
154343
  path: external_exports.string().describe(
@@ -154327,7 +154394,7 @@ var flowAddScriptTool = {
154327
154394
  // The flag only skips the adapter's own abort timer; its retry loop is
154328
154395
  // untouched, so a call that fails some other way is still re-POSTed.
154329
154396
  longRunning: true,
154330
- zodSchema: zodSchema67,
154397
+ zodSchema: zodSchema68,
154331
154398
  services: () => ({}),
154332
154399
  async execute(_services, params, ctx) {
154333
154400
  const session = await requireRecordingSession(params.project_root, params.name);
@@ -154417,7 +154484,7 @@ var flowAddScriptTool = {
154417
154484
  // ../tool-server/src/tools/flows/flow-finish-recording.ts
154418
154485
  init_zod();
154419
154486
  var fs60 = __toESM(require("node:fs/promises"));
154420
- var zodSchema68 = external_exports.object({
154487
+ var zodSchema69 = external_exports.object({
154421
154488
  name: external_exports.string().describe("Name of the flow being recorded \u2014 the one passed to flow-start-recording."),
154422
154489
  project_root: external_exports.string().describe(
154423
154490
  "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."
@@ -154476,7 +154543,7 @@ var flowFinishRecordingTool = {
154476
154543
  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.
154477
154544
  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.
154478
154545
  You can still edit the .yaml file directly afterwards to remove or reorder steps.`,
154479
- zodSchema: zodSchema68,
154546
+ zodSchema: zodSchema69,
154480
154547
  services: () => ({}),
154481
154548
  async execute(_services, params) {
154482
154549
  const { filePath, flowFile, savedTo, flow, summary, headline } = await withFlowFileLock(
@@ -156954,7 +157021,7 @@ async function restoreStatusBar(device) {
156954
157021
  }
156955
157022
 
156956
157023
  // ../tool-server/src/tools/flows/flow-run.ts
156957
- var zodSchema69 = external_exports.object({
157024
+ var zodSchema70 = external_exports.object({
156958
157025
  name: external_exports.string().optional().describe(
156959
157026
  'Name of a saved flow to run from `.argent/flows` (e.g. "settings-explore"). Omit when flow_path is set.'
156960
157027
  ),
@@ -157461,7 +157528,7 @@ one-off interaction use the gesture tools instead, and to author a flow use flow
157461
157528
  exactly one flow source: name (under project_root) or flow_path.
157462
157529
  Returns a per-step report: the first failure stops the run and the rest report as skipped.`,
157463
157530
  longRunning: true,
157464
- zodSchema: zodSchema69,
157531
+ zodSchema: zodSchema70,
157465
157532
  fileInputs: fileInputs4,
157466
157533
  services: () => ({}),
157467
157534
  async execute(_services, params, ctx) {
@@ -158438,7 +158505,7 @@ async function resolveFlowSource(params, fileInput, flowPathInput) {
158438
158505
  // ../tool-server/src/tools/flows/flow-read-prerequisite.ts
158439
158506
  init_zod();
158440
158507
  var fs64 = __toESM(require("node:fs/promises"));
158441
- var zodSchema70 = external_exports.object({
158508
+ var zodSchema71 = external_exports.object({
158442
158509
  name: external_exports.string().optional().describe(
158443
158510
  'Name of a saved flow to inspect from `.argent/flows` (e.g. "settings-explore"). Omit when flow_path is set.'
158444
158511
  ),
@@ -158494,7 +158561,7 @@ Touches no device: nothing is launched, tapped, dispatched or torn down, and no
158494
158561
  needs booting, so calling this costs nothing but a file read.
158495
158562
  Fails if the flow file does not exist.
158496
158563
  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.`,
158497
- zodSchema: zodSchema70,
158564
+ zodSchema: zodSchema71,
158498
158565
  fileInputs: fileInputs5,
158499
158566
  services: () => ({}),
158500
158567
  async execute(_services, params, ctx) {
@@ -158810,7 +158877,7 @@ async function readWorkspaceSnapshot(workspacePath) {
158810
158877
  }
158811
158878
 
158812
158879
  // ../tool-server/src/tools/workspace/gather-workspace-data.ts
158813
- var zodSchema71 = external_exports.object({
158880
+ var zodSchema72 = external_exports.object({
158814
158881
  workspacePath: external_exports.string().describe("Absolute path to the project root directory to inspect (e.g. /Users/dev/MyApp)")
158815
158882
  });
158816
158883
  var fileInputs6 = [
@@ -158841,7 +158908,7 @@ exploration of anything the snapshot surfaces.
158841
158908
  Use when you need to inspect project configuration without manually reading multiple files.
158842
158909
  Returns partial data if workspacePath does not exist or is not readable; missing items are represented as null or empty collections.
158843
158910
  Fails if the workspacePath is not an absolute path or the directory cannot be accessed.`,
158844
- zodSchema: zodSchema71,
158911
+ zodSchema: zodSchema72,
158845
158912
  fileInputs: fileInputs6,
158846
158913
  services: () => ({}),
158847
158914
  async execute(_services, params) {
@@ -158915,7 +158982,7 @@ function targetFlagsFor(target) {
158915
158982
  if (target === "both") return ["--global", "--local"];
158916
158983
  return [`--${target}`];
158917
158984
  }
158918
- var zodSchema72 = external_exports.object({
158985
+ var zodSchema73 = external_exports.object({
158919
158986
  target: external_exports.enum(["auto", "global", "local", "both"]).optional().describe(
158920
158987
  "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."
158921
158988
  )
@@ -158929,7 +158996,7 @@ var updateArgentTool = {
158929
158996
  failedMsg: ({ failureSignal: failureSignal2 }) => `Failed to update Argent: ${failureSignal2.error_code}`
158930
158997
  },
158931
158998
  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.",
158932
- zodSchema: zodSchema72,
158999
+ zodSchema: zodSchema73,
158933
159000
  services: () => ({}),
158934
159001
  async execute(_services, params, _options) {
158935
159002
  const { updateAvailable, updateInstallable, currentVersion, installableVersion } = getUpdateState();
@@ -159014,7 +159081,7 @@ var updateArgentTool = {
159014
159081
 
159015
159082
  // ../tool-server/src/tools/system/dismiss-update.ts
159016
159083
  init_zod();
159017
- var zodSchema73 = external_exports.object({
159084
+ var zodSchema74 = external_exports.object({
159018
159085
  hours: external_exports.number().min(0).describe("Number of hours to suppress the update notification")
159019
159086
  });
159020
159087
  var dismissUpdateTool = {
@@ -159025,7 +159092,7 @@ var dismissUpdateTool = {
159025
159092
  failedMsg: ({ failureSignal: failureSignal2 }) => `Failed to dismiss Argent update: ${failureSignal2.error_code}`
159026
159093
  },
159027
159094
  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.",
159028
- zodSchema: zodSchema73,
159095
+ zodSchema: zodSchema74,
159029
159096
  services: () => ({}),
159030
159097
  async execute(_services, params, _options) {
159031
159098
  const durationMs = params.hours * 60 * 60 * 1e3;
@@ -159044,7 +159111,7 @@ var import_path8 = __toESM(require("path"));
159044
159111
  init_zod();
159045
159112
  init_src2();
159046
159113
  init_device_info();
159047
- var zodSchema74 = external_exports.object({
159114
+ var zodSchema75 = external_exports.object({
159048
159115
  baselinePath: external_exports.string().min(1).optional().describe("Path to the baseline PNG file. Required unless captureBaseline is true."),
159049
159116
  currentPath: external_exports.string().min(1).optional().describe("Path to the current PNG file. Required unless captureCurrent is true."),
159050
159117
  udid: external_exports.string().min(1).describe("Target device id from `list-devices` (iOS UDID or Android serial)."),
@@ -159061,7 +159128,7 @@ var zodSchema74 = external_exports.object({
159061
159128
  "Directory where diff artifacts should be written. Optional \u2014 defaults to a temp directory; the diff images are returned in the result either way."
159062
159129
  )
159063
159130
  }).strict();
159064
- var capability33 = {
159131
+ var capability34 = {
159065
159132
  apple: { simulator: true, device: true },
159066
159133
  android: { emulator: true, device: true, unknown: true }
159067
159134
  };
@@ -159086,8 +159153,8 @@ Returns { summary, diffPath, contextDiffPath }. The summary uses normalized [0,1
159086
159153
  Ignores the fixed top status-bar band for both pixel and OCR text comparisons.
159087
159154
  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.`,
159088
159155
  searchHint: "compare screenshots png diff visual UI changes UI regression visual regression screenshot diff changed regions text ocr live capture",
159089
- zodSchema: zodSchema74,
159090
- capability: capability33,
159156
+ zodSchema: zodSchema75,
159157
+ capability: capability34,
159091
159158
  fileInputs: fileInputs7,
159092
159159
  services: (params) => {
159093
159160
  if (params.captureBaseline || params.captureCurrent) {
@@ -159400,7 +159467,7 @@ async function captureElementFrame(registry2, udid, match, opts = {}) {
159400
159467
  }
159401
159468
 
159402
159469
  // ../tool-server/src/tools/variants/propose-variant.ts
159403
- var zodSchema75 = external_exports.object({
159470
+ var zodSchema76 = external_exports.object({
159404
159471
  element: external_exports.string().min(1).max(200).describe(
159405
159472
  '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.'
159406
159473
  ),
@@ -159460,7 +159527,7 @@ arrives as a follow-up message (this is the case in an \`argent lens\` CLI sessi
159460
159527
  Returns { round, elementId, variantId, element, variantCount, totalElements } \u2014 confirmation only;
159461
159528
  it does not wait for the user.`,
159462
159529
  searchHint: "propose design variant alternative option for element non-blocking ab choice",
159463
- zodSchema: zodSchema75,
159530
+ zodSchema: zodSchema76,
159464
159531
  services: () => ({}),
159465
159532
  async execute(_services, params) {
159466
159533
  let frame = params.variant.frame;
@@ -159484,7 +159551,7 @@ it does not wait for the user.`,
159484
159551
 
159485
159552
  // ../tool-server/src/tools/variants/await-user-selection.ts
159486
159553
  init_zod();
159487
- var zodSchema76 = external_exports.object({
159554
+ var zodSchema77 = external_exports.object({
159488
159555
  timeoutSeconds: external_exports.number().int().min(5).max(86400).optional().describe(
159489
159556
  "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."
159490
159557
  )
@@ -159525,7 +159592,7 @@ This tool is long-running; it intentionally holds the request open. It honors cl
159525
159592
  disconnects (aborts cleanly).`,
159526
159593
  searchHint: "await wait user selection choice variant blocking confirm picks complete",
159527
159594
  longRunning: true,
159528
- zodSchema: zodSchema76,
159595
+ zodSchema: zodSchema77,
159529
159596
  services: () => ({}),
159530
159597
  async execute(_services, params, options) {
159531
159598
  const timeoutMs = (params.timeoutSeconds ?? 1800) * 1e3;
@@ -159540,7 +159607,7 @@ disconnects (aborts cleanly).`,
159540
159607
  init_zod();
159541
159608
  init_src2();
159542
159609
  init_device_info();
159543
- var zodSchema77 = external_exports.object({
159610
+ var zodSchema78 = external_exports.object({
159544
159611
  udid: external_exports.string().describe("Chromium device id from `list-devices` (e.g. `chromium-cdp-9222`)."),
159545
159612
  action: external_exports.enum(["list", "select", "new", "close"]).describe(
159546
159613
  "list: enumerate tabs/windows. select: make a tab active (every other tool then acts on it). new: open a tab. close: close a tab."
@@ -159573,7 +159640,7 @@ var tabAction = {
159573
159640
  failure: "close"
159574
159641
  }
159575
159642
  };
159576
- var capability34 = {
159643
+ var capability35 = {
159577
159644
  chromium: { app: true }
159578
159645
  };
159579
159646
  var chromiumTabsTool = {
@@ -159591,8 +159658,8 @@ var chromiumTabsTool = {
159591
159658
  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.
159592
159659
  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.`,
159593
159660
  searchHint: "tab tabs window windows switch select close new open multi-tab chromium electron",
159594
- zodSchema: zodSchema77,
159595
- capability: capability34,
159661
+ zodSchema: zodSchema78,
159662
+ capability: capability35,
159596
159663
  services: (params) => {
159597
159664
  const device = resolveDevice(params.udid);
159598
159665
  if (device.platform === "chromium") {
@@ -159693,7 +159760,7 @@ async function clearStorage(cdp, type) {
159693
159760
  }
159694
159761
 
159695
159762
  // ../tool-server/src/tools/chromium-cookies/index.ts
159696
- var zodSchema78 = external_exports.object({
159763
+ var zodSchema79 = external_exports.object({
159697
159764
  udid: external_exports.string().describe("Chromium device id from `list-devices` (e.g. `chromium-cdp-9222`)."),
159698
159765
  action: external_exports.enum(["get", "set", "delete", "clear"]).describe(
159699
159766
  "get: read cookies. set: create/update a cookie. delete: remove a named cookie. clear: remove all browser cookies."
@@ -159716,7 +159783,7 @@ var cookieAction = {
159716
159783
  delete: { started: "Deleting", completed: "Deleted", failure: "delete" },
159717
159784
  clear: { started: "Clearing", completed: "Cleared", failure: "clear" }
159718
159785
  };
159719
- var capability35 = {
159786
+ var capability36 = {
159720
159787
  chromium: { app: true }
159721
159788
  };
159722
159789
  var chromiumCookiesTool = {
@@ -159734,8 +159801,8 @@ var chromiumCookiesTool = {
159734
159801
  Use when seeding an authenticated session before a flow (set the session cookie, then navigate) or asserting cookie state after one.
159735
159802
  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.`,
159736
159803
  searchHint: "cookies cookie get set delete clear httponly samesite session auth chromium",
159737
- zodSchema: zodSchema78,
159738
- capability: capability35,
159804
+ zodSchema: zodSchema79,
159805
+ capability: capability36,
159739
159806
  services: (params) => {
159740
159807
  const device = resolveDevice(params.udid);
159741
159808
  if (device.platform === "chromium") {
@@ -159800,7 +159867,7 @@ Returns { cookies, count } for get, or a small status object ({ set } / { delete
159800
159867
  init_zod();
159801
159868
  init_src2();
159802
159869
  init_device_info();
159803
- var zodSchema79 = external_exports.object({
159870
+ var zodSchema80 = external_exports.object({
159804
159871
  udid: external_exports.string().describe("Chromium device id from `list-devices` (e.g. `chromium-cdp-9222`)."),
159805
159872
  store: external_exports.enum(["local", "session"]).describe("Which Web Storage area: `local` (localStorage) or `session` (sessionStorage)."),
159806
159873
  action: external_exports.enum(["get", "set", "remove", "clear"]).describe(
@@ -159815,7 +159882,7 @@ var storageAction = {
159815
159882
  remove: { started: "Removing from", completed: "Removed from", failure: "remove from" },
159816
159883
  clear: { started: "Clearing", completed: "Cleared", failure: "clear" }
159817
159884
  };
159818
- var capability36 = {
159885
+ var capability37 = {
159819
159886
  chromium: { app: true }
159820
159887
  };
159821
159888
  var chromiumStorageTool = {
@@ -159834,8 +159901,8 @@ Set \`store\` to "local" or "session". Storage is per-origin, so it reflects the
159834
159901
  Use when seeding feature flags / auth tokens before a flow or asserting persisted app state after one.
159835
159902
  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.`,
159836
159903
  searchHint: "storage localstorage sessionstorage local session get set remove clear key value chromium",
159837
- zodSchema: zodSchema79,
159838
- capability: capability36,
159904
+ zodSchema: zodSchema80,
159905
+ capability: capability37,
159839
159906
  services: (params) => {
159840
159907
  const device = resolveDevice(params.udid);
159841
159908
  if (device.platform === "chromium") {
@@ -159947,6 +160014,7 @@ function createRegistry() {
159947
160014
  registry2.registerTool(networkRequestTool);
159948
160015
  registry2.registerTool(createDescribeTool(registry2));
159949
160016
  registry2.registerTool(createUiTreeTool(registry2));
160017
+ registry2.registerTool(createForegroundAppTool(registry2));
159950
160018
  registry2.registerTool(createAwaitUiElementTool(registry2));
159951
160019
  registry2.registerTool(createAwaitScreenIdleTool(registry2));
159952
160020
  registry2.registerTool(createReactProfilerStartTool(registry2));