@swmansion/argent 0.30.2-next.13 → 0.30.2-next.15

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.
@@ -1584,6 +1584,7 @@ var init_failure_codes = __esm({
1584
1584
  REACT_PROFILER_DEVTOOLS_RENDERER_MISSING: "REACT_PROFILER_DEVTOOLS_RENDERER_MISSING",
1585
1585
  REACT_PROFILER_START_FAILED: "REACT_PROFILER_START_FAILED",
1586
1586
  REACT_PROFILER_START_VERIFY_FAILED: "REACT_PROFILER_START_VERIFY_FAILED",
1587
+ REACT_PROFILER_SESSION_TORN_DOWN: "REACT_PROFILER_SESSION_TORN_DOWN",
1587
1588
  REACT_PROFILER_HOOK_ERROR: "REACT_PROFILER_HOOK_ERROR",
1588
1589
  REACT_PROFILER_ANALYZE_NO_DATA: "REACT_PROFILER_ANALYZE_NO_DATA",
1589
1590
  NATIVE_PROFILER_FACTORY_OPTIONS_MISSING: "NATIVE_PROFILER_FACTORY_OPTIONS_MISSING",
@@ -100944,7 +100945,7 @@ var _CI_VENDOR_COUNT_FOR_TEST = vendors_default.length;
100944
100945
  var SESSION_ID = (0, import_node_crypto3.randomUUID)();
100945
100946
  function readCliVersion() {
100946
100947
  if (true) {
100947
- return "0.30.2-next.13";
100948
+ return "0.30.2-next.15";
100948
100949
  }
100949
100950
  return "0.0.0";
100950
100951
  }
@@ -122219,6 +122220,52 @@ function settleWithin(p, ms, signal) {
122219
122220
  // ../tool-server/src/utils/simulator-client.ts
122220
122221
  init_external_devices();
122221
122222
 
122223
+ // ../tool-server/src/utils/profiling-devices.ts
122224
+ var runs = /* @__PURE__ */ new Map();
122225
+ var servers = /* @__PURE__ */ new Map();
122226
+ function trackProfilingRun(deviceId, run2) {
122227
+ let set2 = runs.get(deviceId);
122228
+ if (!set2) {
122229
+ set2 = /* @__PURE__ */ new Set();
122230
+ runs.set(deviceId, set2);
122231
+ }
122232
+ set2.add(run2);
122233
+ syncCaptureOnDemand();
122234
+ }
122235
+ function isProfiling(deviceId) {
122236
+ syncCaptureOnDemand();
122237
+ return runs.has(deviceId);
122238
+ }
122239
+ function syncCaptureOnDemand() {
122240
+ for (const [deviceId, set2] of runs) {
122241
+ for (const run2 of set2) {
122242
+ if (!run2.profilingActive) set2.delete(run2);
122243
+ }
122244
+ if (set2.size === 0) runs.delete(deviceId);
122245
+ }
122246
+ for (const [deviceId, server] of servers) {
122247
+ const profiling = runs.has(deviceId);
122248
+ if (server.onDemand !== profiling) {
122249
+ server.onDemand = profiling;
122250
+ server.send(profiling);
122251
+ }
122252
+ }
122253
+ }
122254
+ function registerCaptureOnDemandSender(deviceId, endpoint, send) {
122255
+ const entry = { endpoint, send, onDemand: false };
122256
+ servers.set(deviceId, entry);
122257
+ syncCaptureOnDemand();
122258
+ return () => {
122259
+ if (servers.get(deviceId) !== entry) return;
122260
+ servers.delete(deviceId);
122261
+ if (entry.onDemand) entry.send(false);
122262
+ };
122263
+ }
122264
+ function captureOnDemandDropped(deviceId, endpoint) {
122265
+ const server = servers.get(deviceId);
122266
+ if (server?.endpoint === endpoint) server.onDemand = false;
122267
+ }
122268
+
122222
122269
  // ../tool-server/src/utils/foldable.ts
122223
122270
  var import_node_child_process13 = require("node:child_process");
122224
122271
  var fs17 = __toESM(require("node:fs"));
@@ -122461,6 +122508,14 @@ var FIRST_FRAME_POLL_MS = 250;
122461
122508
  var COMMAND_ACK_TIMEOUT_MS = 5e3;
122462
122509
  var connections = /* @__PURE__ */ new Map();
122463
122510
  var cmdId = 0;
122511
+ function pendingIdNamedBy(conn, message) {
122512
+ const named = message?.match(/unknown variant `([^`]+)`/)?.[1];
122513
+ if (named === void 0) return void 0;
122514
+ for (const [id, entry] of conn.pending) {
122515
+ if (entry.cmd === named) return id;
122516
+ }
122517
+ return void 0;
122518
+ }
122464
122519
  function failAllPending(conn, makeError) {
122465
122520
  const entries = [...conn.pending.values()];
122466
122521
  conn.pending.clear();
@@ -122507,7 +122562,7 @@ function getOrCreateConnection(api) {
122507
122562
  }
122508
122563
  if (ack.status !== "ok" && ack.status !== "error") return;
122509
122564
  if (ack.id != null && !conn.pending.has(ack.id)) return;
122510
- const id = ack.id ?? conn.pending.keys().next().value;
122565
+ const id = ack.id ?? pendingIdNamedBy(conn, ack.message) ?? conn.pending.keys().next().value;
122511
122566
  if (id == null) return;
122512
122567
  const entry = conn.pending.get(id);
122513
122568
  if (entry == null) return;
@@ -122536,6 +122591,7 @@ function getOrCreateConnection(api) {
122536
122591
  ws.on("close", () => {
122537
122592
  connections.delete(key2);
122538
122593
  failAllPending(conn, (cmd) => transportError(cmd, key2, "the connection closed"));
122594
+ if (api.deviceId) captureOnDemandDropped(api.deviceId, key2);
122539
122595
  });
122540
122596
  connections.set(key2, conn);
122541
122597
  return conn;
@@ -123211,6 +123267,19 @@ async function spawnSimulatorServerProcess(udid, subcommand) {
123211
123267
  }, READY_TIMEOUT_MS);
123212
123268
  });
123213
123269
  }
123270
+ function withCaptureOnDemand(deviceId, instance) {
123271
+ const unregister = registerCaptureOnDemandSender(deviceId, instance.api.apiUrl, (enabled) => {
123272
+ sendCommand(instance.api, { cmd: "capture_on_demand", enabled }).catch(() => {
123273
+ });
123274
+ });
123275
+ return {
123276
+ ...instance,
123277
+ dispose: async () => {
123278
+ unregister();
123279
+ await instance.dispose();
123280
+ }
123281
+ };
123282
+ }
123214
123283
  var simulatorServerBlueprint = {
123215
123284
  namespace: SIMULATOR_SERVER_NAMESPACE,
123216
123285
  getURN(device) {
@@ -123255,7 +123324,7 @@ var simulatorServerBlueprint = {
123255
123324
  }
123256
123325
  const claim2 = externalClaimForAnyId(device.id);
123257
123326
  if (claim2) {
123258
- return buildAttachedInstance(device, claim2);
123327
+ return withCaptureOnDemand(device.id, await buildAttachedInstance(device, claim2));
123259
123328
  }
123260
123329
  if (device.platform === "ios-remote") {
123261
123330
  return buildRemoteInstance(device);
@@ -123313,7 +123382,7 @@ var simulatorServerBlueprint = {
123313
123382
  events
123314
123383
  };
123315
123384
  await attachFoldableDisplay(instance.api, device);
123316
- return instance;
123385
+ return withCaptureOnDemand(device.id, instance);
123317
123386
  }
123318
123387
  };
123319
123388
 
@@ -125977,6 +126046,7 @@ Chromium apps are discovered by probing CDP debugging ports (default 9222; exten
125977
126046
  Booted/ready devices are listed first. Platforms whose CLI is unavailable are silently omitted; an empty result usually means xcode-select, Android platform-tools, <flag:harmonyos>DevEco Studio, </flag:harmonyos>or the Vega SDK is not installed.`,
125978
126047
  alwaysLoad: true,
125979
126048
  searchHint: "list devices simulators emulators avd serial udid ios android chromium vega <flag:harmonyos>harmony harmonyos </flag:harmonyos>app fire tv session start",
126049
+ readOnly: true,
125980
126050
  zodSchema,
125981
126051
  services: () => ({}),
125982
126052
  async execute(_services, _params) {
@@ -130727,6 +130797,7 @@ function createHttpApp(registry2, options) {
130727
130797
  if (def.searchHint) entry.searchHint = renderFlagGated(def.searchHint, isFlagEnabled);
130728
130798
  if (def.longRunning) entry.longRunning = true;
130729
130799
  if (def.hideFromMcp) entry.hideFromMcp = true;
130800
+ if (def.readOnly) entry.readOnly = true;
130730
130801
  const aliases = (def.aliases ?? []).map((alias) => ({
130731
130802
  ...entry,
130732
130803
  name: alias,
@@ -130974,11 +131045,12 @@ function createHttpApp(registry2, options) {
130974
131045
  const toolNote = takeToolNote(data);
130975
131046
  if (toolNote) notes.push(toolNote);
130976
131047
  const notePayload = notes.length > 0 ? { note: notes.join("\n\n") } : {};
131048
+ const profilingPayload = deviceArg && isProfiling(canonicalDeviceId(deviceArg) ?? deviceArg) ? { profiling: true } : {};
130977
131049
  if (wantsStream) {
130978
- writeLine({ event: "result", data, ...notePayload });
131050
+ writeLine({ event: "result", data, ...notePayload, ...profilingPayload });
130979
131051
  res.end();
130980
131052
  } else {
130981
- res.json({ data, ...notePayload });
131053
+ res.json({ data, ...notePayload, ...profilingPayload });
130982
131054
  }
130983
131055
  } catch (err) {
130984
131056
  const attribute = (message) => {
@@ -133830,6 +133902,7 @@ If state is connecting: do NOT restart the app. Launching it is what starts the
133830
133902
  If state is indeterminate: the process could not be inspected, so restart-app is worth one attempt. If this call still reports it after that restart, do NOT restart the app again: the service is stale rather than the app uninjected, so restart the tool-server (\`argent server stop && argent server start --detach\`) and retry. Remote simulators can never inspect the process, so this is the only unconnected state a running app reaches there.
133831
133903
  Returns { status: "init_failed", message, attempts } instead when the simulator's native-devtools environment failed to initialize.
133832
133904
  Fails if the simulator server is not running for the given UDID.`,
133905
+ readOnly: true,
133833
133906
  zodSchema: zodSchema2,
133834
133907
  services: (params) => ({
133835
133908
  nativeDevtools: nativeDevtoolsRef(resolveDevice(params.udid))
@@ -133987,6 +134060,7 @@ Returns { status: "ok", matches } with matching views including their frames, pr
133987
134060
  At least one of className, identifier, label, tag, or nativeID must be provided.
133988
134061
  If status is restart_required: follow the message (usually restart-app), then retry. If status is service_stale: the app is already injected, so restarting it cannot help. Restart the tool-server (\`argent server stop && argent server start --detach\`) and retry. If the same status comes back after that restart, stop restarting: follow the message, which names the terminal fallback. If status is connect_pending: the app is injected and still connecting. Do not restart it, wait a few seconds and retry. If status is init_failed: the simulator's native-devtools environment could not be initialised. Follow the message (re-boot the simulator) rather than retrying this tool.
133989
134062
  A not-connected or not-running app comes back as one of those statuses rather than a failure. Failures are separate: an Apple system app is rejected outright (terminal: never retry it), and the hierarchy query itself can error or time out.`,
134063
+ readOnly: true,
133990
134064
  zodSchema: zodSchema4,
133991
134065
  services: (params) => ({
133992
134066
  nativeDevtools: nativeDevtoolsRef(resolveDevice(params.udid))
@@ -134057,6 +134131,7 @@ Use when you need deep layout debugging, finding views with no accessibility lab
134057
134131
  Returns { status: "ok", windows, screen } with the full view hierarchy. screen gives the screen size in points on its portrait axes, and the interfaceOrientation of the UI (portrait, portraitUpsideDown, landscapeLeft, landscapeRight). Each screenFrame uses the portrait axes of the screen. Each windowFrame uses the axes of its window, which turn with the UI.
134058
134132
  If status is restart_required: follow the message (usually restart-app), then retry. If status is service_stale: the app is already injected, so restarting it cannot help. Restart the tool-server (\`argent server stop && argent server start --detach\`) and retry. If the same status comes back after that restart, stop restarting: follow the message, which names the terminal fallback. If status is connect_pending: the app is injected and still connecting. Do not restart it, wait a few seconds and retry. If status is init_failed: the simulator's native-devtools environment could not be initialised. Follow the message (re-boot the simulator) rather than retrying this tool.
134059
134133
  A not-connected or not-running app comes back as one of those statuses rather than a failure. Failures are separate: an Apple system app is rejected outright (terminal: never retry it), and the hierarchy query itself can error or time out.`,
134134
+ readOnly: true,
134060
134135
  zodSchema: zodSchema5,
134061
134136
  services: (params) => ({
134062
134137
  nativeDevtools: nativeDevtoolsRef(resolveDevice(params.udid))
@@ -134126,6 +134201,7 @@ normalized contract.
134126
134201
 
134127
134202
  If status is restart_required: follow the message (usually restart-app), then retry. If status is service_stale: the app is already injected, so restarting it cannot help. Restart the tool-server (\`argent server stop && argent server start --detach\`) and retry. If the same status comes back after that restart, stop restarting: follow the message, which names the terminal fallback. If status is connect_pending: the app is injected and still connecting. Do not restart it, wait a few seconds and retry. If status is init_failed: the simulator's native-devtools environment could not be initialised. Follow the message (re-boot the simulator) rather than retrying this tool.
134128
134203
  A not-connected or not-running app comes back as one of those statuses rather than a failure. Failures are separate: an Apple system app is rejected outright (terminal: never retry it), and the screen query itself can error or time out.`,
134204
+ readOnly: true,
134129
134205
  zodSchema: zodSchema6,
134130
134206
  services: (params) => ({
134131
134207
  nativeDevtools: nativeDevtoolsRef(resolveDevice(params.udid))
@@ -134208,6 +134284,7 @@ the UI is landscape.
134208
134284
 
134209
134285
  If status is restart_required: follow the message (usually restart-app), then retry. If status is service_stale: the app is already injected, so restarting it cannot help. Restart the tool-server (\`argent server stop && argent server start --detach\`) and retry. If the same status comes back after that restart, stop restarting: follow the message, which names the terminal fallback. If status is connect_pending: the app is injected and still connecting. Do not restart it, wait a few seconds and retry. If status is init_failed: the simulator's native-devtools environment could not be initialised. Follow the message (re-boot the simulator) rather than retrying this tool.
134210
134286
  A not-connected or not-running app comes back as one of those statuses rather than a failure. Failures are separate: an Apple system app is rejected outright (terminal: never retry it), and the point query itself can error or time out.`,
134287
+ readOnly: true,
134211
134288
  zodSchema: zodSchema7,
134212
134289
  services: (params) => ({
134213
134290
  nativeDevtools: nativeDevtoolsRef(resolveDevice(params.udid))
@@ -134296,6 +134373,7 @@ the UI is landscape.
134296
134373
 
134297
134374
  If status is restart_required: follow the message (usually restart-app), then retry. If status is service_stale: the app is already injected, so restarting it cannot help. Restart the tool-server (\`argent server stop && argent server start --detach\`) and retry. If the same status comes back after that restart, stop restarting: follow the message, which names the terminal fallback. If status is connect_pending: the app is injected and still connecting. Do not restart it, wait a few seconds and retry. If status is init_failed: the simulator's native-devtools environment could not be initialised. Follow the message (re-boot the simulator) rather than retrying this tool.
134298
134375
  A not-connected or not-running app comes back as one of those statuses rather than a failure. Failures are separate: an Apple system app is rejected outright (terminal: never retry it), and the point query itself can error or time out.`,
134376
+ readOnly: true,
134299
134377
  zodSchema: zodSchema8,
134300
134378
  services: (params) => ({
134301
134379
  nativeDevtools: nativeDevtoolsRef(resolveDevice(params.udid))
@@ -136753,6 +136831,7 @@ var reactProfilerSessionBlueprint = {
136753
136831
  profileStartWallMs: null,
136754
136832
  sessionId: null,
136755
136833
  ownerToolServerPid: null,
136834
+ disposed: false,
136756
136835
  disposeSession: () => events.emit("terminated")
136757
136836
  };
136758
136837
  await cdp.send("Profiler.enable").catch(warnOnError("Profiler.enable"));
@@ -136815,11 +136894,25 @@ var reactProfilerSessionBlueprint = {
136815
136894
  );
136816
136895
  };
136817
136896
  cdp.events.on("disconnected", onDisconnected);
136897
+ const onCdpEvent = (method) => {
136898
+ if (method !== "Runtime.executionContextDestroyed" && method !== "Runtime.executionContextsCleared") {
136899
+ return;
136900
+ }
136901
+ if (state3.profilingActive) {
136902
+ state3.profilingActive = false;
136903
+ clearCachedProfilerPaths(state3.port, state3.deviceId);
136904
+ stopSamplerInNextRuntime(cdp);
136905
+ }
136906
+ events.emit("terminated");
136907
+ };
136908
+ cdp.events.on("event", onCdpEvent);
136818
136909
  return {
136819
136910
  api: state3,
136820
136911
  dispose: async () => {
136912
+ state3.disposed = true;
136821
136913
  cdp.events.off("scriptParsed", onScriptParsed);
136822
136914
  cdp.events.off("disconnected", onDisconnected);
136915
+ cdp.events.off("event", onCdpEvent);
136823
136916
  if (state3.profilingActive) {
136824
136917
  state3.profilingActive = false;
136825
136918
  await cdp.send("Runtime.evaluate", {
@@ -136834,6 +136927,20 @@ var reactProfilerSessionBlueprint = {
136834
136927
  };
136835
136928
  }
136836
136929
  };
136930
+ function stopSamplerInNextRuntime(cdp) {
136931
+ const onEvent = (method) => {
136932
+ if (method !== "Runtime.executionContextCreated") return;
136933
+ disarm();
136934
+ void cdp.send("Profiler.stop").catch(() => {
136935
+ });
136936
+ };
136937
+ const disarm = () => {
136938
+ cdp.events.off("event", onEvent);
136939
+ cdp.events.off("disconnected", disarm);
136940
+ };
136941
+ cdp.events.on("event", onEvent);
136942
+ cdp.events.on("disconnected", disarm);
136943
+ }
136837
136944
  var profilerPathsCache = /* @__PURE__ */ new Map();
136838
136945
  function cacheKey(port, deviceId) {
136839
136946
  return `${port}:${deviceId}`;
@@ -141514,6 +141621,7 @@ Use when you need a baseline image before an interaction or to inspect the curre
141514
141621
  Fails if the simulator-server / emulator backend / Chromium CDP <flag:harmonyos>/ \`hdc\` </flag:harmonyos>is not reachable for the given device.`,
141515
141622
  alwaysLoad: true,
141516
141623
  searchHint: "device simulator emulator chromium screen image capture baseline tvos apple tv",
141624
+ readOnly: true,
141517
141625
  zodSchema: zodSchema16,
141518
141626
  outputHint: "image",
141519
141627
  capability: capability8,
@@ -150783,6 +150891,7 @@ after a tap/navigation to wait for the next screen, or before tapping an element
150783
150891
  alwaysLoad: true,
150784
150892
  searchHint: "wait await poll until visible hidden exists text appears disappears timeout element condition settle",
150785
150893
  longRunning: true,
150894
+ readOnly: true,
150786
150895
  zodSchema: zodSchema29,
150787
150896
  capability: capability23,
150788
150897
  services: (params) => {
@@ -151214,6 +151323,7 @@ function createDebuggerStatusTool(registry2) {
151214
151323
  Use when you need to verify connectivity before using other debugger tools. Never fails when the runtime is simply unreachable: it returns a discriminated result instead:
151215
151324
  - { 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: waits for pending source maps before returning; no-op on Chromium).
151216
151325
  - { 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; do not retry in a loop.`,
151326
+ readOnly: true,
151217
151327
  zodSchema: zodSchema32,
151218
151328
  capability: DEBUGGER_TOOL_CAPABILITY,
151219
151329
  // Resolved manually in execute so a not-connected precondition becomes a
@@ -152325,6 +152435,7 @@ Set includeSkipped=true to see a summary of all filtered components.
152325
152435
  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.`,
152326
152436
  alwaysLoad: true,
152327
152437
  searchHint: "react native component tree discovery tap coordinates",
152438
+ readOnly: true,
152328
152439
  zodSchema: zodSchema35,
152329
152440
  // RN-only: needs the React DevTools backend from the dev JS bundle. Chromium has
152330
152441
  // no equivalent — use `describe` there.
@@ -152841,6 +152952,7 @@ Uses getInspectorDataForViewAtPoint + _debugStack + Metro /symbolicate.
152841
152952
  Set resolveSourceMaps to false to skip symbolication and get raw bundled locations instead.
152842
152953
  Set includeSkipped=true to see filtered items annotated with skip reasons.
152843
152954
  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.`,
152955
+ readOnly: true,
152844
152956
  zodSchema: zodSchema36,
152845
152957
  // RN-only: needs React Native's internal getInspectorDataForViewAtPoint and
152846
152958
  // Metro's /symbolicate; the Chromium session has no source resolver.
@@ -152958,6 +153070,7 @@ function createDebuggerLogRegistryTool(registry2) {
152958
153070
  Returns the log file path, entry counts by level, and message clusters (grouped by similarity). Works against Hermes (iOS / Android / Vega) and V8 (Chromium).
152959
153071
  Use when investigating warnings, errors, or unexpected output. Call this first for an overview, then read the returned file for details. Returns empty stats if no log data has been captured yet, 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.
152960
153072
  When the debugger cannot be reached, this tool does not fail: it returns { status: "not_connected", reason, detail, guidance } with NO log file. 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. Use debugger-status, not this tool, to judge debugger health.`,
153073
+ readOnly: true,
152961
153074
  zodSchema: zodSchema37,
152962
153075
  capability: DEBUGGER_TOOL_CAPABILITY,
152963
153076
  // Resolved manually in execute so a not-connected precondition becomes a
@@ -153137,6 +153250,7 @@ Each entry includes a requestId that can be passed to view-network-request-detai
153137
153250
  On React Native (iOS / Android / Vega) interception is injected into the JS runtime: it records each request once: XMLHttpRequest (axios included), React Native's fetch, Expo's fetch, and a fetch library that sends through React Native's network module itself, such as react-native-fetch-api (found in a Metro development build). Capture starts at the first network-tool call; a reload clears it. On Chromium it reads the browser's native CDP Network domain (the active tab; all request types).
153138
153251
  Use when inspecting outbound HTTP traffic or debugging API calls in the running app.
153139
153252
  Fails if the app is not connected (RN) or the device is not reachable (Chromium).`,
153253
+ readOnly: true,
153140
153254
  zodSchema: zodSchema38,
153141
153255
  capability: DEBUGGER_TOOL_CAPABILITY,
153142
153256
  services: (params) => {
@@ -153254,6 +153368,7 @@ var networkRequestTool = {
153254
153368
  Returns request/response headers (sensitive headers redacted), status, timing, the request body, and optionally the response body.
153255
153369
  Request and response bodies over 1000 chars are cut to 1000 under a "[TRUNCATED: ...]" line that gives the full size; a binary response body is replaced by "[body omitted: binary <mime>, N bytes]". Use when you need headers, body, or timing for a specific request after listing logs.
153256
153370
  Returns an error message string if the requestId is not found: use view-network-logs to get valid requestId values.`,
153371
+ readOnly: true,
153257
153372
  zodSchema: zodSchema39,
153258
153373
  capability: DEBUGGER_TOOL_CAPABILITY,
153259
153374
  services: (params) => {
@@ -153700,6 +153815,7 @@ since a TV UI has no tap coordinates. Move the highlight with \`tv-remote\` (up/
153700
153815
  back/menu/home), then call describe again to confirm where focus landed.`,
153701
153816
  alwaysLoad: true,
153702
153817
  searchHint: "accessibility element tree ui hierarchy tap coordinates ios android chromium vega <flag:harmonyos>harmony harmonyos </flag:harmonyos>dom tv tvos apple tv android tv fire tv focus focusable remote dpad",
153818
+ readOnly: true,
153703
153819
  zodSchema: zodSchema40,
153704
153820
  capability: capability25,
153705
153821
  services: (params) => {
@@ -154200,6 +154316,7 @@ Use when a program needs element ancestry, such as an e2e engine's scoped select
154200
154316
  Returns { schemaVersion, roots, truncated, alertVisible, keyboardVisible, foregroundApp, unsupportedFields }.
154201
154317
  Fails if the iOS ax-service predates the tree command; update argent.`,
154202
154318
  hideFromMcp: true,
154319
+ readOnly: true,
154203
154320
  zodSchema: zodSchema41,
154204
154321
  capability: capability26,
154205
154322
  services: () => ({}),
@@ -154270,6 +154387,7 @@ function createForegroundAppTool(registry2) {
154270
154387
  Returns { bundleId, name, alertVisible }; under a system alert, bundleId is the app it covers.
154271
154388
  A field is unset when it is unknown.`,
154272
154389
  hideFromMcp: true,
154390
+ readOnly: true,
154273
154391
  zodSchema: zodSchema42,
154274
154392
  capability: capability27,
154275
154393
  services: () => ({}),
@@ -154756,6 +154874,7 @@ panel settles instantly on its last frame, and taps land nowhere until it is wok
154756
154874
  </flag:harmonyos>Use after a launch/navigation to wait for the UI to render before screenshotting or tapping.`,
154757
154875
  searchHint: "wait until screen settles idle stable stops changing animation transition rendered ready before screenshot",
154758
154876
  longRunning: true,
154877
+ readOnly: true,
154759
154878
  zodSchema: zodSchema44,
154760
154879
  capability: capability29,
154761
154880
  services: (params) => {
@@ -154839,6 +154958,96 @@ function classifyStaleness({
154839
154958
  };
154840
154959
  }
154841
154960
 
154961
+ // ../tool-server/src/utils/debugger/runtime-device.ts
154962
+ var import_node_crypto12 = require("node:crypto");
154963
+ var import_node_child_process38 = require("node:child_process");
154964
+ var import_node_util30 = require("node:util");
154965
+ init_adb();
154966
+ var execFileAsync30 = (0, import_node_util30.promisify)(import_node_child_process38.execFile);
154967
+ var LOG_READ_TIMEOUT_MS = 5e3;
154968
+ var RETRY_DELAY_MS = 300;
154969
+ async function findRuntimeDevice(cdp) {
154970
+ const marker = `argent-device-probe:${(0, import_node_crypto12.randomUUID)()}`;
154971
+ const logged = await cdp.evaluate(
154972
+ `(function () {
154973
+ if (typeof nativeLoggingHook !== "function") return false;
154974
+ nativeLoggingHook(${JSON.stringify(marker)}, 1);
154975
+ return true;
154976
+ })()`
154977
+ ).catch(() => false);
154978
+ if (logged !== true) return void 0;
154979
+ const checks = [
154980
+ async () => firstFound((await androidSerials()).map((serial) => () => logcatHolds(serial, marker))),
154981
+ async () => firstFound((await bootedSimulators()).map((udid) => () => simulatorLogHolds(udid, marker)))
154982
+ ];
154983
+ for (let attempt = 0; attempt < 2; attempt++) {
154984
+ if (attempt > 0) await new Promise((r) => setTimeout(r, RETRY_DELAY_MS));
154985
+ const found = await firstFound(checks);
154986
+ if (found !== void 0) return found;
154987
+ }
154988
+ return void 0;
154989
+ }
154990
+ function firstFound(checks) {
154991
+ return new Promise((resolve16) => {
154992
+ let left = checks.length;
154993
+ if (left === 0) resolve16(void 0);
154994
+ for (const check3 of checks) {
154995
+ void check3().then((id) => {
154996
+ if (id !== void 0) resolve16(id);
154997
+ else if (--left === 0) resolve16(void 0);
154998
+ });
154999
+ }
155000
+ });
155001
+ }
155002
+ async function androidSerials() {
155003
+ try {
155004
+ const { stdout } = await runAdb(["devices"], { timeoutMs: ADB_DEVICES_TIMEOUT_MS });
155005
+ return parseAdbDevices(stdout).filter((d) => d.state === "device").map((d) => d.serial);
155006
+ } catch {
155007
+ return [];
155008
+ }
155009
+ }
155010
+ async function bootedSimulators() {
155011
+ const simulators = await listIosSimulators();
155012
+ return simulators.filter((s) => s.state === "Booted").map((s) => s.udid);
155013
+ }
155014
+ async function logcatHolds(serial, marker) {
155015
+ try {
155016
+ const { stdout } = await runAdb(
155017
+ ["-s", serial, "logcat", "-d", "-s", "ReactNativeJS", "-e", marker],
155018
+ { timeoutMs: LOG_READ_TIMEOUT_MS }
155019
+ );
155020
+ return stdout.includes(marker) ? serial : void 0;
155021
+ } catch {
155022
+ return void 0;
155023
+ }
155024
+ }
155025
+ async function simulatorLogHolds(udid, marker) {
155026
+ try {
155027
+ const args = await simctlArgsForUdid(udid, [
155028
+ "spawn",
155029
+ udid,
155030
+ "log",
155031
+ "show",
155032
+ "--info",
155033
+ "--last",
155034
+ "1m",
155035
+ "--style",
155036
+ "compact",
155037
+ "--predicate",
155038
+ `eventMessage CONTAINS ${JSON.stringify(marker)} AND process != "log"`
155039
+ ]);
155040
+ const { stdout } = await execFileAsync30("xcrun", args, {
155041
+ timeout: LOG_READ_TIMEOUT_MS,
155042
+ killSignal: SIMCTL_KILL_SIGNAL,
155043
+ encoding: "utf-8"
155044
+ });
155045
+ return stdout.includes(marker) ? udid : void 0;
155046
+ } catch {
155047
+ return void 0;
155048
+ }
155049
+ }
155050
+
154842
155051
  // ../tool-server/src/utils/react-profiler/devtools-bootstrap.ts
154843
155052
  function bootstrapFailureMessage(bootstrap) {
154844
155053
  switch (bootstrap.reason) {
@@ -154861,6 +155070,7 @@ function bootstrapFailureMessage(bootstrap) {
154861
155070
  // ../tool-server/src/tools/profiler/react/react-profiler-start.ts
154862
155071
  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.";
154863
155072
  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.";
155073
+ var UNKNOWN_DEVICE_NOTE = "Two or more devices share this Metro, and Argent could not tell which of them runs this app. So taps and swipes on that device still return a screenshot and an element tree, and the capture loads the app while the profiler records. To avoid this, run the app on its own Metro port.";
154864
155074
  var zodSchema45 = external_exports.object({
154865
155075
  port: metroPortField,
154866
155076
  device_id: external_exports.string().describe(
@@ -155036,6 +155246,7 @@ Fails if the Hermes runtime is not reachable or the Metro CDP connection cannot
155036
155246
  await cdp.send("Profiler.stop").catch(ignore);
155037
155247
  api.profilingActive = false;
155038
155248
  }
155249
+ const runtimeDevice = isLogicalKeyedDevice(api.deviceId) ? await findRuntimeDevice(cdp) : void 0;
155039
155250
  const sessionId = crypto6.randomUUID();
155040
155251
  const ownerPayload = {
155041
155252
  sessionId,
@@ -155080,6 +155291,19 @@ Fails if the Hermes runtime is not reachable or the Metro CDP connection cannot
155080
155291
  }
155081
155292
  );
155082
155293
  }
155294
+ if (api.disposed) {
155295
+ await cdp.evaluate(STOP_FOR_TAKEOVER_SCRIPT).catch(ignore);
155296
+ await cdp.send("Profiler.stop").catch(ignore);
155297
+ throw new FailureError(
155298
+ `The React profiler session for ${api.deviceId} was torn down while the profiler was starting, so nothing is recorded. One tool-server serves every agent using this argent install, so another agent may have run stop-all-simulator-servers. Call react-profiler-start again.`,
155299
+ {
155300
+ error_code: FAILURE_CODES.REACT_PROFILER_SESSION_TORN_DOWN,
155301
+ failure_stage: "react_profiler_start_session_torn_down",
155302
+ failure_area: "tool_server",
155303
+ error_kind: "not_found"
155304
+ }
155305
+ );
155306
+ }
155083
155307
  const startedAtEpochMs = startResult.startedAtEpochMs ?? Date.now();
155084
155308
  clearCachedProfilerPaths(api.port, api.deviceId);
155085
155309
  api.sessionPaths = null;
@@ -155090,11 +155314,14 @@ Fails if the Hermes runtime is not reachable or the Metro CDP connection cannot
155090
155314
  api.profileStartWallMs = startedAtEpochMs;
155091
155315
  api.sessionId = sessionId;
155092
155316
  api.ownerToolServerPid = process.pid;
155317
+ trackProfilingRun(api.deviceId, api);
155318
+ if (runtimeDevice) trackProfilingRun(runtimeDevice, api);
155093
155319
  return {
155094
155320
  started_at: new Date(startedAtEpochMs).toISOString(),
155095
155321
  startedAtEpochMs,
155096
155322
  hermes_version: api.hermesVersion,
155097
- detected_architecture: api.detectedArchitecture
155323
+ detected_architecture: api.detectedArchitecture,
155324
+ ...isLogicalKeyedDevice(api.deviceId) && !runtimeDevice ? { [RESULT_NOTE_KEY]: UNKNOWN_DEVICE_NOTE } : {}
155098
155325
  };
155099
155326
  }
155100
155327
  };
@@ -155287,7 +155514,7 @@ Fails if no active profiling session exists or the CDP connection was lost durin
155287
155514
  }
155288
155515
  if (!api.profilingActive) {
155289
155516
  throw new FailureError(
155290
- "No active profiling run to stop. The session exists but Hermes CPU sampling was never started \u2014 typically because react-profiler-start failed before reaching the sampler (often on release builds without React DevTools). Check the error react-profiler-start returned, address the underlying cause (rebuild in dev mode, reconnect the debugger, etc.), then call react-profiler-start again.",
155517
+ "No active profiling run to stop. Either the run ended without its data (a JS reload ends it: Metro's `r`, a red-box Reload, debugger-reload-metro), or Hermes CPU sampling was never started \u2014 typically because react-profiler-start failed before reaching the sampler (often on release builds without React DevTools). After a reload, call react-profiler-start again. Otherwise check the error react-profiler-start returned, address the underlying cause (rebuild in dev mode, reconnect the debugger, etc.), then call react-profiler-start again.",
155291
155518
  {
155292
155519
  error_code: FAILURE_CODES.REACT_PROFILER_NO_ACTIVE_SESSION,
155293
155520
  failure_stage: "react_profiler_stop_inactive",
@@ -155493,6 +155720,7 @@ function createReactProfilerStatusTool(registry2) {
155493
155720
  failedMsg: ({ failureSignal: failureSignal2 }) => `Failed to check React profiler: ${failureSignal2.error_code}`
155494
155721
  },
155495
155722
  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, so 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.`,
155723
+ readOnly: true,
155496
155724
  zodSchema: zodSchema47,
155497
155725
  // RN-only: companion to react-profiler-start.
155498
155726
  capability: RN_ONLY_TOOL_CAPABILITY,
@@ -157295,6 +157523,7 @@ var reactProfilerComponentSourceTool = {
157295
157523
  Call this per-finding after react-profiler-analyze to inspect source before proposing a fix.
157296
157524
  Returns found: false if the component is not found in user-owned code (e.g. lives in node_modules).
157297
157525
  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). Check it before assuming the returned file is the one you meant.`,
157526
+ readOnly: true,
157298
157527
  zodSchema: zodSchema49,
157299
157528
  // Declared so the tool catalogue groups this with the other react-profiler-*
157300
157529
  // tools; the HTTP gate itself is a no-op here, as there is no device arg to
@@ -157433,6 +157662,7 @@ Use when you specifically need to investigate JS CPU hotspots that are NOT tied
157433
157662
  Call react-profiler-stop first. Reads directly from the stored cpuProfile.
157434
157663
  Returns a markdown table of the top hotspot functions with self-time, total-time, and location.
157435
157664
  Fails if react-profiler-stop has not been called or no CPU profile is stored.`,
157665
+ readOnly: true,
157436
157666
  zodSchema: zodSchema50,
157437
157667
  // RN-only: reads a Hermes CPU profile; Chromium's V8 sample format differs.
157438
157668
  capability: RN_ONLY_TOOL_CAPABILITY,
@@ -157547,6 +157777,7 @@ var reactProfilerRendersTool = {
157547
157777
  Returns a markdown table of the top re-rendering components. No profiling session required; works on a live connected app.
157548
157778
  Use when you want a quick snapshot of render counts without a full profiling session.
157549
157779
  Fails if the React DevTools hook is not present in the runtime or the app is not connected.`,
157780
+ readOnly: true,
157550
157781
  zodSchema: zodSchema51,
157551
157782
  // RN-only: queries the React DevTools backend hook on the live runtime.
157552
157783
  capability: RN_ONLY_TOOL_CAPABILITY,
@@ -157723,6 +157954,7 @@ var reactProfilerFiberTreeTool = {
157723
157954
  Use when tracing ancestry of a library component or checking for useMemoCache hook (confirms React Compiler is active on a component).
157724
157955
  Returns a nested JSON tree of fiber nodes with name, tag, actualDuration, selfBaseDuration, and children.
157725
157956
  Fails if the React DevTools hook is not present or no fiber roots have been committed yet.`,
157957
+ readOnly: true,
157726
157958
  zodSchema: zodSchema52,
157727
157959
  // RN-only: walks the fiber tree via the React DevTools backend hook.
157728
157960
  capability: RN_ONLY_TOOL_CAPABILITY,
@@ -158146,8 +158378,8 @@ var import_util14 = require("util");
158146
158378
  var DEFAULT_EXEC_TIMEOUT_MS = 6e4;
158147
158379
  var DEFAULT_EXEC_MAX_BUFFER = 256 * 1024 * 1024;
158148
158380
  async function execFileAsyncWithTimeout(file2, args, options = {}) {
158149
- const execFileAsync34 = (0, import_util14.promisify)(import_child_process2.execFile);
158150
- const { stdout, stderr } = await execFileAsync34(file2, args, {
158381
+ const execFileAsync35 = (0, import_util14.promisify)(import_child_process2.execFile);
158382
+ const { stdout, stderr } = await execFileAsync35(file2, args, {
158151
158383
  encoding: "utf-8",
158152
158384
  ...options,
158153
158385
  // Applied after ...options so a caller cannot weaken the guards; maxBuffer
@@ -159679,7 +159911,7 @@ var STARTUP_TIMEOUT_MS = 1e4;
159679
159911
  var DETECT_RUNNING_APP_TIMEOUT_MS = 1e4;
159680
159912
  var NOTIFY_REGISTER_TIMEOUT_MS = 2e3;
159681
159913
  var MAX_START_ATTEMPTS = 2;
159682
- var RETRY_DELAY_MS = 1200;
159914
+ var RETRY_DELAY_MS2 = 1200;
159683
159915
  var COLD_START_SIGNATURE = "Cannot find process matching name:";
159684
159916
  var STOP_GRACE_MS = 3e5;
159685
159917
  var STOP_TERM_MS = 5e3;
@@ -160103,10 +160335,10 @@ async function startNativeProfilerIos(api, params) {
160103
160335
  if (!isColdStart) throw err;
160104
160336
  if (attempt >= MAX_START_ATTEMPTS) break;
160105
160337
  process.stderr.write(
160106
- `[native-profiler] xctrace could not find "${appProcess}" on attempt ${attempt}/${MAX_START_ATTEMPTS}; waiting ${RETRY_DELAY_MS} ms for cold-start to settle, then retrying.
160338
+ `[native-profiler] xctrace could not find "${appProcess}" on attempt ${attempt}/${MAX_START_ATTEMPTS}; waiting ${RETRY_DELAY_MS2} ms for cold-start to settle, then retrying.
160107
160339
  `
160108
160340
  );
160109
- await new Promise((r) => setTimeout(r, RETRY_DELAY_MS));
160341
+ await new Promise((r) => setTimeout(r, RETRY_DELAY_MS2));
160110
160342
  }
160111
160343
  }
160112
160344
  const totalMs = Date.now() - startMs;
@@ -161564,12 +161796,16 @@ Fails if no app is running on the device, or the profiler cannot attach to the p
161564
161796
  const api = services.session;
161565
161797
  const device = resolveDevice(params.device_id);
161566
161798
  assertSupported("native-profiler-start", capability30, device);
161799
+ let started;
161567
161800
  if (api.platform === "ios") {
161568
161801
  await ensureDeps(["xcrun"]);
161569
- return startNativeProfilerIos(api, params);
161802
+ started = await startNativeProfilerIos(api, params);
161803
+ } else {
161804
+ await ensureDeps(["adb"]);
161805
+ started = await startNativeProfilerAndroid(api, params);
161570
161806
  }
161571
- await ensureDeps(["adb"]);
161572
- return startNativeProfilerAndroid(api, params);
161807
+ trackProfilingRun(device.id, api);
161808
+ return started;
161573
161809
  }
161574
161810
  };
161575
161811
 
@@ -162196,7 +162432,7 @@ var WATERMARK_PNG_HEIGHT = 277;
162196
162432
  var WATERMARK_PNG_BASE64 = "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";
162197
162433
 
162198
162434
  // ../tool-server/src/tools/screen-recording/watermark.ts
162199
- var execFileAsync30 = (0, import_util15.promisify)(import_child_process6.execFile);
162435
+ var execFileAsync31 = (0, import_util15.promisify)(import_child_process6.execFile);
162200
162436
  var OUTPUT_FPS = 30;
162201
162437
  var FFMPEG_FALLBACK_PATHS = [
162202
162438
  "/opt/homebrew/bin/ffmpeg",
@@ -162213,7 +162449,7 @@ var MASK_DARK_MAX_LUMA = 90;
162213
162449
  var MASK_LIGHT_MIN_LUMA = 165;
162214
162450
  async function resolveBinary(name, fallbacks) {
162215
162451
  try {
162216
- await execFileAsync30("/bin/sh", ["-c", `command -v ${name}`], { timeout: 2e3 });
162452
+ await execFileAsync31("/bin/sh", ["-c", `command -v ${name}`], { timeout: 2e3 });
162217
162453
  return name;
162218
162454
  } catch {
162219
162455
  }
@@ -163239,6 +163475,7 @@ Every table states how many samples it covers and how much of that was idle.
163239
163475
  Use when investigating JS CPU hotspots or correlating CPU cost with specific components.
163240
163476
  Returns a markdown table of CPU hotspots, call tree, or per-component CPU breakdown.
163241
163477
  Fails if no CPU profile is stored; run react-profiler-stop first.`,
163478
+ readOnly: true,
163242
163479
  zodSchema: zodSchema58,
163243
163480
  // RN-only: reads Hermes-format CPU profiles; Chromium's V8 sample format differs.
163244
163481
  capability: RN_ONLY_TOOL_CAPABILITY,
@@ -163598,6 +163835,7 @@ Modes:
163598
163835
  Use when drilling into specific components or time windows after react-profiler-analyze.
163599
163836
  Returns a markdown table or tree of commit data matching the requested mode.
163600
163837
  Fails if react-profiler-stop has not been called or no commit data is stored.`,
163838
+ readOnly: true,
163601
163839
  zodSchema: zodSchema59,
163602
163840
  // Reads React commit data captured via the React DevTools backend.
163603
163841
  capability: RN_ONLY_TOOL_CAPABILITY,
@@ -163987,6 +164225,7 @@ Modes:
163987
164225
  Use when drilling into native hang stacks, thread CPU breakdown, or memory leaks after native-profiler-analyze.
163988
164226
  Returns a markdown report with native call stacks, thread weights, or leak details for the selected mode.
163989
164227
  Fails if native-profiler-analyze has not been run or no parsed trace data is in memory.`,
164228
+ readOnly: true,
163990
164229
  zodSchema: zodSchema60,
163991
164230
  // No chromium entry: it has no native trace capture.
163992
164231
  capability: {
@@ -164074,6 +164313,7 @@ Requires both react-profiler-analyze and native-profiler-analyze to have been ca
164074
164313
  Call this tool when both profilers were run in parallel on the same session.
164075
164314
  Returns a markdown report correlating hangs with React commits, memory leaks, and investigation hints.
164076
164315
  Fails if either react-profiler-analyze or native-profiler-analyze has not been called first.`,
164316
+ readOnly: true,
164077
164317
  zodSchema: zodSchema61,
164078
164318
  // iOS reads xctrace output; Android re-queries the Perfetto .pftrace via
164079
164319
  // loadAndroidCombinedData. Chromium has no native trace capture.
@@ -165020,7 +165260,7 @@ Returns { stopped } - the URNs of the services that were actually live and got s
165020
165260
 
165021
165261
  // ../tool-server/src/tools/simulator/stop-metro.ts
165022
165262
  init_zod();
165023
- var import_node_child_process38 = require("node:child_process");
165263
+ var import_node_child_process39 = require("node:child_process");
165024
165264
  function parseNetstatListeningPids(netstatOutput, port) {
165025
165265
  const pids = /* @__PURE__ */ new Set();
165026
165266
  for (const line of netstatOutput.split(/\r?\n/)) {
@@ -165036,7 +165276,7 @@ function parseNetstatListeningPids(netstatOutput, port) {
165036
165276
  }
165037
165277
  function listeningPids(port) {
165038
165278
  if (process.platform === "win32") {
165039
- const output3 = (0, import_node_child_process38.execFileSync)("netstat", ["-ano"], {
165279
+ const output3 = (0, import_node_child_process39.execFileSync)("netstat", ["-ano"], {
165040
165280
  encoding: "utf-8",
165041
165281
  timeout: 5e3,
165042
165282
  // `netstat -ano` dumps every socket on the host; overflowing Node's
@@ -165045,7 +165285,7 @@ function listeningPids(port) {
165045
165285
  });
165046
165286
  return parseNetstatListeningPids(output3, port);
165047
165287
  }
165048
- const output2 = (0, import_node_child_process38.execFileSync)("lsof", ["-ti", `tcp:${port}`, "-sTCP:LISTEN"], {
165288
+ const output2 = (0, import_node_child_process39.execFileSync)("lsof", ["-ti", `tcp:${port}`, "-sTCP:LISTEN"], {
165049
165289
  encoding: "utf-8",
165050
165290
  timeout: 5e3
165051
165291
  }).trim();
@@ -170802,7 +171042,7 @@ var import_node_url4 = require("node:url");
170802
171042
  init_src2();
170803
171043
 
170804
171044
  // ../tool-server/src/tools/flows/script/flow-script-executor.ts
170805
- var import_node_child_process39 = require("node:child_process");
171045
+ var import_node_child_process40 = require("node:child_process");
170806
171046
  var fs59 = __toESM(require("node:fs"));
170807
171047
  var os17 = __toESM(require("node:os"));
170808
171048
  var path45 = __toESM(require("node:path"));
@@ -171187,7 +171427,7 @@ var FlowScriptExecutor = class {
171187
171427
  detached: process.platform !== "win32",
171188
171428
  windowsHide: process.platform === "win32"
171189
171429
  };
171190
- child = (0, import_node_child_process39.fork)(scriptPath, [], forkOptions);
171430
+ child = (0, import_node_child_process40.fork)(scriptPath, [], forkOptions);
171191
171431
  } catch (err) {
171192
171432
  return emptyResult(
171193
171433
  { kind: "spawn", message: `Could not start the script process: ${errorMessage(err)}` },
@@ -171631,7 +171871,7 @@ async function stopProcessTree(child, graceMs) {
171631
171871
  if (process.platform === "win32") {
171632
171872
  if (hasExited(child)) return;
171633
171873
  tryKill(() => {
171634
- const killer = (0, import_node_child_process39.spawn)("taskkill", ["/pid", String(pid), "/t", "/f"], {
171874
+ const killer = (0, import_node_child_process40.spawn)("taskkill", ["/pid", String(pid), "/t", "/f"], {
171635
171875
  windowsHide: true,
171636
171876
  stdio: "ignore"
171637
171877
  });
@@ -172337,7 +172577,7 @@ init_src2();
172337
172577
  init_device_info();
172338
172578
 
172339
172579
  // ../tool-server/src/tools/flows/flow-visual.ts
172340
- var import_node_crypto12 = require("node:crypto");
172580
+ var import_node_crypto13 = require("node:crypto");
172341
172581
  var fs63 = __toESM(require("node:fs/promises"));
172342
172582
  var os18 = __toESM(require("node:os"));
172343
172583
  var path48 = __toESM(require("node:path"));
@@ -172353,7 +172593,7 @@ init_src2();
172353
172593
  // ../tool-server/src/tools/screenshot-diff/screenshot-diff-ocr.ts
172354
172594
  var import_child_process8 = require("child_process");
172355
172595
  var import_util16 = require("util");
172356
- var execFileAsync31 = (0, import_util16.promisify)(import_child_process8.execFile);
172596
+ var execFileAsync32 = (0, import_util16.promisify)(import_child_process8.execFile);
172357
172597
  var OCR_TIMEOUT_MS = 1e4;
172358
172598
  var OCR_MAX_BUFFER_BYTES = 32 * 1024 * 1024;
172359
172599
  var TESSERACT_BINARY = "tesseract";
@@ -172398,7 +172638,7 @@ async function extractOcrTextBlocks(imagePath) {
172398
172638
  }
172399
172639
  }
172400
172640
  async function recognizeTsv(imagePath) {
172401
- const { stdout } = await execFileAsync31(
172641
+ const { stdout } = await execFileAsync32(
172402
172642
  TESSERACT_BINARY,
172403
172643
  [
172404
172644
  imagePath,
@@ -174508,7 +174748,7 @@ async function runSnapshot(env, opts) {
174508
174748
  });
174509
174749
  const captureWarned = shot.warning !== void 0 ? { warning: shot.warning } : {};
174510
174750
  const { w, h } = await pngDimensions(shot.image.hostPath);
174511
- const cropSuffix = opts.cropOn === void 0 ? "" : `-crop-${(0, import_node_crypto12.createHash)("sha256").update(cropIdentity(opts.cropOn)).digest("hex").slice(0, 8)}`;
174751
+ const cropSuffix = opts.cropOn === void 0 ? "" : `-crop-${(0, import_node_crypto13.createHash)("sha256").update(cropIdentity(opts.cropOn)).digest("hex").slice(0, 8)}`;
174512
174752
  const snapshotKey = `${opts.name}__${authoringPlatform(env.device.platform)}-${w}x${h}${cropSuffix}`;
174513
174753
  const key2 = `${snapshotKey}.png`;
174514
174754
  const baselinePath = opts.clientFlowPath === void 0 ? path48.join(baselineDir(opts.flowsDir, opts.flowName), key2) : clientBaselinePath(opts.clientFlowPath, opts.flowName, key2);
@@ -174680,11 +174920,11 @@ async function runSnapshot(env, opts) {
174680
174920
  }
174681
174921
 
174682
174922
  // ../tool-server/src/utils/status-bar.ts
174683
- var import_node_child_process40 = require("node:child_process");
174684
- var import_node_util30 = require("node:util");
174923
+ var import_node_child_process41 = require("node:child_process");
174924
+ var import_node_util31 = require("node:util");
174685
174925
  init_adb();
174686
174926
  init_device_info();
174687
- var execFileAsync32 = (0, import_node_util30.promisify)(import_node_child_process40.execFile);
174927
+ var execFileAsync33 = (0, import_node_util31.promisify)(import_node_child_process41.execFile);
174688
174928
  var DEMO_BROADCAST = "am broadcast -a com.android.systemui.demo";
174689
174929
  var IOS_STATUS_BAR_OVERRIDE = [
174690
174930
  "override",
@@ -174708,7 +174948,7 @@ async function pinStatusBar(device, signal) {
174708
174948
  if (isIosPhysicalDevice(device)) return false;
174709
174949
  try {
174710
174950
  if (device.platform === "ios") {
174711
- await execFileAsync32(
174951
+ await execFileAsync33(
174712
174952
  "xcrun",
174713
174953
  await simctlArgsForUdid(device.id, ["status_bar", device.id, ...IOS_STATUS_BAR_OVERRIDE])
174714
174954
  );
@@ -174744,7 +174984,7 @@ async function pinStatusBar(device, signal) {
174744
174984
  async function restoreStatusBar(device) {
174745
174985
  try {
174746
174986
  if (device.platform === "ios") {
174747
- await execFileAsync32(
174987
+ await execFileAsync33(
174748
174988
  "xcrun",
174749
174989
  await simctlArgsForUdid(device.id, ["status_bar", device.id, "clear"])
174750
174990
  );
@@ -176328,6 +176568,7 @@ Touches no device: nothing is launched, tapped, dispatched or torn down, and no
176328
176568
  needs booting, so calling this costs nothing but a file read.
176329
176569
  Fails if the e2e test file does not exist.
176330
176570
  Address the e2e test exactly as you will address it in e2e-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/e2e/<name>.yaml, else .argent/flows/<name>.yaml.`,
176571
+ readOnly: true,
176331
176572
  zodSchema: zodSchema72,
176332
176573
  fileInputs: fileInputs5,
176333
176574
  services: () => ({}),
@@ -176352,7 +176593,7 @@ init_zod();
176352
176593
  // ../tool-server/src/utils/workspace-reader.ts
176353
176594
  var import_promises19 = require("node:fs/promises");
176354
176595
  var import_node_path29 = require("node:path");
176355
- var import_node_child_process41 = require("node:child_process");
176596
+ var import_node_child_process42 = require("node:child_process");
176356
176597
  var import_dotenv2 = __toESM(require_dist());
176357
176598
  async function exists2(path54) {
176358
176599
  try {
@@ -176396,7 +176637,7 @@ async function listDir(path54) {
176396
176637
  var COMMAND_TIMEOUT_MS = 3e3;
176397
176638
  function runVersionCommand(cmd, args, cwd) {
176398
176639
  return new Promise((resolve16) => {
176399
- const child = (0, import_node_child_process41.execFile)(cmd, args, { cwd, timeout: COMMAND_TIMEOUT_MS }, (err, stdout) => {
176640
+ const child = (0, import_node_child_process42.execFile)(cmd, args, { cwd, timeout: COMMAND_TIMEOUT_MS }, (err, stdout) => {
176400
176641
  if (err) {
176401
176642
  resolve16(null);
176402
176643
  return;
@@ -176676,6 +176917,7 @@ exploration of anything the snapshot surfaces.
176676
176917
  Use when you need to inspect project configuration without manually reading multiple files.
176677
176918
  Returns partial data if workspacePath does not exist or is not readable; missing items are represented as null or empty collections.
176678
176919
  Fails if the workspacePath is not an absolute path or the directory cannot be accessed.`,
176920
+ readOnly: true,
176679
176921
  zodSchema: zodSchema73,
176680
176922
  fileInputs: fileInputs6,
176681
176923
  services: () => ({}),
@@ -176685,7 +176927,7 @@ Fails if the workspacePath is not an absolute path or the directory cannot be ac
176685
176927
  };
176686
176928
 
176687
176929
  // ../tool-server/src/tools/system/update-argent.ts
176688
- var import_node_child_process42 = require("node:child_process");
176930
+ var import_node_child_process43 = require("node:child_process");
176689
176931
  var fs66 = __toESM(require("node:fs"));
176690
176932
  var path50 = __toESM(require("node:path"));
176691
176933
  init_zod();
@@ -176820,7 +177062,7 @@ var updateArgentTool = {
176820
177062
  if (spawnRoot) updateArgs.push("--project-root", spawnRoot);
176821
177063
  const cmd = cliEntry ? process.execPath : "argent";
176822
177064
  const args = cliEntry ? [cliEntry, ...updateArgs] : updateArgs;
176823
- const child = (0, import_node_child_process42.spawn)(cmd, args, {
177065
+ const child = (0, import_node_child_process43.spawn)(cmd, args, {
176824
177066
  detached: true,
176825
177067
  stdio: "ignore",
176826
177068
  env: { ...process.env, ARGENT_UPDATE_TRIGGER: "mcp_update" }
@@ -176872,7 +177114,7 @@ var dismissUpdateTool = {
176872
177114
  };
176873
177115
 
176874
177116
  // ../tool-server/src/tools/screenshot-diff/index.ts
176875
- var import_node_crypto13 = __toESM(require("node:crypto"));
177117
+ var import_node_crypto14 = __toESM(require("node:crypto"));
176876
177118
  var import_promises20 = __toESM(require("fs/promises"));
176877
177119
  var import_node_os15 = __toESM(require("node:os"));
176878
177120
  var import_path8 = __toESM(require("path"));
@@ -177019,7 +177261,7 @@ async function resolveOutputDir(params, options) {
177019
177261
  const dir = import_path8.default.join(
177020
177262
  import_node_os15.default.tmpdir(),
177021
177263
  "argent-screenshot-diff",
177022
- import_node_crypto13.default.randomBytes(6).toString("hex")
177264
+ import_node_crypto14.default.randomBytes(6).toString("hex")
177023
177265
  );
177024
177266
  await import_promises20.default.mkdir(dir, { recursive: true });
177025
177267
  return dir;
@@ -177117,7 +177359,7 @@ function requireIosDeviceRunner(services) {
177117
177359
  }
177118
177360
  async function captureIosDeviceLiveInput(params) {
177119
177361
  const png = await captureRunnerScreenshotPng(params.runner, RUNNER_COMMAND_TIMEOUT_MS);
177120
- const suffix = import_node_crypto13.default.randomBytes(4).toString("hex");
177362
+ const suffix = import_node_crypto14.default.randomBytes(4).toString("hex");
177121
177363
  const destination = import_path8.default.join(params.outputDir, `${params.name}-${suffix}.live.png`);
177122
177364
  await import_promises20.default.mkdir(params.outputDir, { recursive: true });
177123
177365
  await import_promises20.default.writeFile(destination, png);
@@ -177135,7 +177377,7 @@ async function captureHarmonyLiveInput(params) {
177135
177377
  }
177136
177378
  await ensureDep("hdc");
177137
177379
  const captured = await captureHarmonyScreenshotPng({ connectKey: params.connectKey, scale: 1 });
177138
- const suffix = import_node_crypto13.default.randomBytes(4).toString("hex");
177380
+ const suffix = import_node_crypto14.default.randomBytes(4).toString("hex");
177139
177381
  const destination = import_path8.default.join(params.outputDir, `${params.name}-${suffix}.live.png`);
177140
177382
  try {
177141
177383
  await import_promises20.default.mkdir(params.outputDir, { recursive: true });
@@ -177171,7 +177413,7 @@ async function captureLiveInput(params) {
177171
177413
  params.peekFor?.(params.device)
177172
177414
  );
177173
177415
  }
177174
- const suffix = import_node_crypto13.default.randomBytes(4).toString("hex");
177416
+ const suffix = import_node_crypto14.default.randomBytes(4).toString("hex");
177175
177417
  const destination = import_path8.default.join(params.outputDir, `${params.name}-${suffix}.live.png`);
177176
177418
  await import_promises20.default.mkdir(params.outputDir, { recursive: true });
177177
177419
  await import_promises20.default.copyFile(capture.path, destination);
@@ -177890,13 +178132,13 @@ function probeArgentToolServer(host, port, timeoutMs = 500) {
177890
178132
 
177891
178133
  // ../tool-server/src/utils/simulator-watcher.ts
177892
178134
  var fs68 = __toESM(require("node:fs"));
177893
- var import_node_child_process43 = require("node:child_process");
177894
- var import_node_util31 = require("node:util");
178135
+ var import_node_child_process44 = require("node:child_process");
178136
+ var import_node_util32 = require("node:util");
177895
178137
  init_external_devices();
177896
- var execFileAsync33 = (0, import_node_util31.promisify)(import_node_child_process43.execFile);
178138
+ var execFileAsync34 = (0, import_node_util32.promisify)(import_node_child_process44.execFile);
177897
178139
  var POLL_INTERVAL_MS2 = 1e4;
177898
178140
  async function getBootedUdidsInSet(deviceSet) {
177899
- const { stdout } = await execFileAsync33("xcrun", [
178141
+ const { stdout } = await execFileAsync34("xcrun", [
177900
178142
  ...simctlPrefix(deviceSet),
177901
178143
  "list",
177902
178144
  "devices",
@@ -178015,7 +178257,7 @@ function startSimulatorWatcher(registry2) {
178015
178257
  }
178016
178258
 
178017
178259
  // ../tool-server/src/utils/preview-window.ts
178018
- var import_node_child_process44 = require("node:child_process");
178260
+ var import_node_child_process45 = require("node:child_process");
178019
178261
  var fs69 = __toESM(require("node:fs"));
178020
178262
  var os20 = __toESM(require("node:os"));
178021
178263
  var path52 = __toESM(require("node:path"));
@@ -178047,10 +178289,10 @@ function ensureLensAppBundle(electronBin) {
178047
178289
  fs69.copyFileSync(path52.join(realContents, "Info.plist"), plist);
178048
178290
  const setPlist = (entry, value) => {
178049
178291
  try {
178050
- (0, import_node_child_process44.execFileSync)("/usr/libexec/PlistBuddy", ["-c", `Set :${entry} ${value}`, plist]);
178292
+ (0, import_node_child_process45.execFileSync)("/usr/libexec/PlistBuddy", ["-c", `Set :${entry} ${value}`, plist]);
178051
178293
  } catch {
178052
178294
  try {
178053
- (0, import_node_child_process44.execFileSync)("/usr/libexec/PlistBuddy", ["-c", `Add :${entry} string ${value}`, plist]);
178295
+ (0, import_node_child_process45.execFileSync)("/usr/libexec/PlistBuddy", ["-c", `Add :${entry} string ${value}`, plist]);
178054
178296
  } catch {
178055
178297
  }
178056
178298
  }
@@ -178109,7 +178351,7 @@ function createPreviewWindowManager(opts = {}) {
178109
178351
  const wrapperBin = ensureLensAppBundle(electronBin);
178110
178352
  const launchBin = wrapperBin ?? electronBin;
178111
178353
  const launchArgs = wrapperBin ? ["--no-sandbox", mainScript] : [mainScript];
178112
- const next = (0, import_node_child_process44.spawn)(launchBin, launchArgs, {
178354
+ const next = (0, import_node_child_process45.spawn)(launchBin, launchArgs, {
178113
178355
  // Strips ELECTRON_RUN_AS_NODE, which an Electron-based MCP host leaves in
178114
178356
  // our env, so the child boots as a GUI app instead of bare Node.
178115
178357
  env: electronGuiChildEnv({ ARGENT_PREVIEW_URL: url2 }),