@swmansion/argent 0.25.1-next.34 → 0.25.1-next.36
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.
package/dist/cli-cmds.mjs
CHANGED
|
@@ -2372,6 +2372,8 @@ var FAILURE_CODES = {
|
|
|
2372
2372
|
ANDROID_DEVTOOLS_WRONG_PLATFORM: "ANDROID_DEVTOOLS_WRONG_PLATFORM",
|
|
2373
2373
|
ANDROID_DEVTOOLS_DEVICE_ID_INVALID: "ANDROID_DEVTOOLS_DEVICE_ID_INVALID",
|
|
2374
2374
|
ANDROID_DEVTOOLS_HELPER_TERMINATED: "ANDROID_DEVTOOLS_HELPER_TERMINATED",
|
|
2375
|
+
ANDROID_DEVTOOLS_HELPER_INSTALL_FAILED: "ANDROID_DEVTOOLS_HELPER_INSTALL_FAILED",
|
|
2376
|
+
ANDROID_DEVTOOLS_HELPER_REPAIR_FAILED: "ANDROID_DEVTOOLS_HELPER_REPAIR_FAILED",
|
|
2375
2377
|
ANDROID_DEVTOOLS_RPC_CLIENT_CLOSED: "ANDROID_DEVTOOLS_RPC_CLIENT_CLOSED",
|
|
2376
2378
|
ANDROID_DEVTOOLS_RPC_ERROR: "ANDROID_DEVTOOLS_RPC_ERROR",
|
|
2377
2379
|
ANDROID_DEVTOOLS_RPC_TIMEOUT: "ANDROID_DEVTOOLS_RPC_TIMEOUT",
|
|
@@ -21857,7 +21859,7 @@ var _CI_VENDOR_COUNT_FOR_TEST = vendors_default.length;
|
|
|
21857
21859
|
var SESSION_ID2 = randomUUID5();
|
|
21858
21860
|
function readCliVersion() {
|
|
21859
21861
|
if (true) {
|
|
21860
|
-
return "0.25.1-next.
|
|
21862
|
+
return "0.25.1-next.36";
|
|
21861
21863
|
}
|
|
21862
21864
|
return "0.0.0";
|
|
21863
21865
|
}
|
package/dist/installer.mjs
CHANGED
|
@@ -15744,6 +15744,8 @@ var FAILURE_CODES = {
|
|
|
15744
15744
|
ANDROID_DEVTOOLS_WRONG_PLATFORM: "ANDROID_DEVTOOLS_WRONG_PLATFORM",
|
|
15745
15745
|
ANDROID_DEVTOOLS_DEVICE_ID_INVALID: "ANDROID_DEVTOOLS_DEVICE_ID_INVALID",
|
|
15746
15746
|
ANDROID_DEVTOOLS_HELPER_TERMINATED: "ANDROID_DEVTOOLS_HELPER_TERMINATED",
|
|
15747
|
+
ANDROID_DEVTOOLS_HELPER_INSTALL_FAILED: "ANDROID_DEVTOOLS_HELPER_INSTALL_FAILED",
|
|
15748
|
+
ANDROID_DEVTOOLS_HELPER_REPAIR_FAILED: "ANDROID_DEVTOOLS_HELPER_REPAIR_FAILED",
|
|
15747
15749
|
ANDROID_DEVTOOLS_RPC_CLIENT_CLOSED: "ANDROID_DEVTOOLS_RPC_CLIENT_CLOSED",
|
|
15748
15750
|
ANDROID_DEVTOOLS_RPC_ERROR: "ANDROID_DEVTOOLS_RPC_ERROR",
|
|
15749
15751
|
ANDROID_DEVTOOLS_RPC_TIMEOUT: "ANDROID_DEVTOOLS_RPC_TIMEOUT",
|
|
@@ -16710,7 +16712,7 @@ var _CI_VENDOR_COUNT_FOR_TEST = vendors_default.length;
|
|
|
16710
16712
|
var SESSION_ID = randomUUID4();
|
|
16711
16713
|
function readCliVersion() {
|
|
16712
16714
|
if (true) {
|
|
16713
|
-
return "0.25.1-next.
|
|
16715
|
+
return "0.25.1-next.36";
|
|
16714
16716
|
}
|
|
16715
16717
|
return "0.0.0";
|
|
16716
16718
|
}
|
package/dist/mcp-server.mjs
CHANGED
|
@@ -16552,6 +16552,8 @@ var FAILURE_CODES = {
|
|
|
16552
16552
|
ANDROID_DEVTOOLS_WRONG_PLATFORM: "ANDROID_DEVTOOLS_WRONG_PLATFORM",
|
|
16553
16553
|
ANDROID_DEVTOOLS_DEVICE_ID_INVALID: "ANDROID_DEVTOOLS_DEVICE_ID_INVALID",
|
|
16554
16554
|
ANDROID_DEVTOOLS_HELPER_TERMINATED: "ANDROID_DEVTOOLS_HELPER_TERMINATED",
|
|
16555
|
+
ANDROID_DEVTOOLS_HELPER_INSTALL_FAILED: "ANDROID_DEVTOOLS_HELPER_INSTALL_FAILED",
|
|
16556
|
+
ANDROID_DEVTOOLS_HELPER_REPAIR_FAILED: "ANDROID_DEVTOOLS_HELPER_REPAIR_FAILED",
|
|
16555
16557
|
ANDROID_DEVTOOLS_RPC_CLIENT_CLOSED: "ANDROID_DEVTOOLS_RPC_CLIENT_CLOSED",
|
|
16556
16558
|
ANDROID_DEVTOOLS_RPC_ERROR: "ANDROID_DEVTOOLS_RPC_ERROR",
|
|
16557
16559
|
ANDROID_DEVTOOLS_RPC_TIMEOUT: "ANDROID_DEVTOOLS_RPC_TIMEOUT",
|
package/dist/tool-server.cjs
CHANGED
|
@@ -698,6 +698,8 @@ var init_failure_codes = __esm({
|
|
|
698
698
|
ANDROID_DEVTOOLS_WRONG_PLATFORM: "ANDROID_DEVTOOLS_WRONG_PLATFORM",
|
|
699
699
|
ANDROID_DEVTOOLS_DEVICE_ID_INVALID: "ANDROID_DEVTOOLS_DEVICE_ID_INVALID",
|
|
700
700
|
ANDROID_DEVTOOLS_HELPER_TERMINATED: "ANDROID_DEVTOOLS_HELPER_TERMINATED",
|
|
701
|
+
ANDROID_DEVTOOLS_HELPER_INSTALL_FAILED: "ANDROID_DEVTOOLS_HELPER_INSTALL_FAILED",
|
|
702
|
+
ANDROID_DEVTOOLS_HELPER_REPAIR_FAILED: "ANDROID_DEVTOOLS_HELPER_REPAIR_FAILED",
|
|
701
703
|
ANDROID_DEVTOOLS_RPC_CLIENT_CLOSED: "ANDROID_DEVTOOLS_RPC_CLIENT_CLOSED",
|
|
702
704
|
ANDROID_DEVTOOLS_RPC_ERROR: "ANDROID_DEVTOOLS_RPC_ERROR",
|
|
703
705
|
ANDROID_DEVTOOLS_RPC_TIMEOUT: "ANDROID_DEVTOOLS_RPC_TIMEOUT",
|
|
@@ -77006,8 +77008,8 @@ async function emulatorSupportsFlag(flag, options = {}) {
|
|
|
77006
77008
|
} catch {
|
|
77007
77009
|
return false;
|
|
77008
77010
|
}
|
|
77009
|
-
const
|
|
77010
|
-
const cached3 = emulatorFlagSupportCache.get(
|
|
77011
|
+
const cacheKey2 = `${emulatorPath}|${flag}`;
|
|
77012
|
+
const cached3 = emulatorFlagSupportCache.get(cacheKey2);
|
|
77011
77013
|
if (cached3 !== void 0) return cached3;
|
|
77012
77014
|
let output;
|
|
77013
77015
|
let failure = null;
|
|
@@ -77034,7 +77036,7 @@ async function emulatorSupportsFlag(flag, options = {}) {
|
|
|
77034
77036
|
return false;
|
|
77035
77037
|
}
|
|
77036
77038
|
const supported = output.includes(flag);
|
|
77037
|
-
emulatorFlagSupportCache.set(
|
|
77039
|
+
emulatorFlagSupportCache.set(cacheKey2, supported);
|
|
77038
77040
|
return supported;
|
|
77039
77041
|
}
|
|
77040
77042
|
function describeAdbFailure(args, err) {
|
|
@@ -94704,7 +94706,7 @@ var _CI_VENDOR_COUNT_FOR_TEST = vendors_default.length;
|
|
|
94704
94706
|
var SESSION_ID = (0, import_node_crypto3.randomUUID)();
|
|
94705
94707
|
function readCliVersion() {
|
|
94706
94708
|
if (true) {
|
|
94707
|
-
return "0.25.1-next.
|
|
94709
|
+
return "0.25.1-next.36";
|
|
94708
94710
|
}
|
|
94709
94711
|
return "0.0.0";
|
|
94710
94712
|
}
|
|
@@ -112897,10 +112899,6 @@ init_android_binary();
|
|
|
112897
112899
|
|
|
112898
112900
|
// ../tool-server/src/utils/android-helper-install.ts
|
|
112899
112901
|
init_adb();
|
|
112900
|
-
var installedHelpers = /* @__PURE__ */ new Map();
|
|
112901
|
-
function cacheKey(serial, versionCode) {
|
|
112902
|
-
return `${serial}|${versionCode}`;
|
|
112903
|
-
}
|
|
112904
112902
|
async function probeInstalledVersion(serial, packageName) {
|
|
112905
112903
|
let out;
|
|
112906
112904
|
try {
|
|
@@ -112923,17 +112921,17 @@ async function probeInstalledVersion(serial, packageName) {
|
|
|
112923
112921
|
}
|
|
112924
112922
|
return { installed: false, versionCode: null };
|
|
112925
112923
|
}
|
|
112926
|
-
async function ensureAndroidDevtoolsInstalled(serial) {
|
|
112924
|
+
async function ensureAndroidDevtoolsInstalled(serial, options = {}) {
|
|
112927
112925
|
const manifest = helperManifest();
|
|
112928
|
-
|
|
112929
|
-
|
|
112930
|
-
|
|
112931
|
-
|
|
112932
|
-
|
|
112933
|
-
return;
|
|
112926
|
+
if (!options.force) {
|
|
112927
|
+
const probe3 = await probeInstalledVersion(serial, manifest.packageName);
|
|
112928
|
+
if (probe3.installed && (probe3.versionCode === null || probe3.versionCode >= manifest.versionCode)) {
|
|
112929
|
+
return;
|
|
112930
|
+
}
|
|
112934
112931
|
}
|
|
112935
112932
|
const apkPath = bundledHelperApkPath();
|
|
112936
|
-
const
|
|
112933
|
+
const flags = options.force ? [...manifest.installFlags, "-d"] : manifest.installFlags;
|
|
112934
|
+
const args = ["-s", serial, "install", ...flags, apkPath];
|
|
112937
112935
|
try {
|
|
112938
112936
|
await runAdb(args, { timeoutMs: 6e4 });
|
|
112939
112937
|
} catch (err) {
|
|
@@ -112948,7 +112946,6 @@ async function ensureAndroidDevtoolsInstalled(serial) {
|
|
|
112948
112946
|
throw err;
|
|
112949
112947
|
}
|
|
112950
112948
|
}
|
|
112951
|
-
installedHelpers.set(key2, true);
|
|
112952
112949
|
}
|
|
112953
112950
|
|
|
112954
112951
|
// ../tool-server/src/utils/android-devtools-client.ts
|
|
@@ -113092,14 +113089,28 @@ function androidDevtoolsRef(device) {
|
|
|
113092
113089
|
};
|
|
113093
113090
|
}
|
|
113094
113091
|
var READY_TIMEOUT_MS2 = 3e4;
|
|
113092
|
+
var EXIT_GRACE_MS = 200;
|
|
113095
113093
|
var HELPER_PORT_MARKER = /^INSTRUMENTATION_STATUS:\s*port=(\d+)/;
|
|
113096
113094
|
var ADB_FORWARD_PORT_MARKER = /^(\d+)\s*$/;
|
|
113095
|
+
var HELPER_STATUS_MARKER = /^INSTRUMENTATION_STATUS:\s*Error=/;
|
|
113096
|
+
var HELPER_STATUS_MAX_CHARS = 400;
|
|
113097
|
+
function classifyHelperSpawnFault(text) {
|
|
113098
|
+
return /Unable to find instrumentation (?:info|target package)/i.test(text) ? "instrumentation-missing" : "unknown";
|
|
113099
|
+
}
|
|
113100
|
+
var HelperSpawnError = class extends FailureError {
|
|
113101
|
+
fault;
|
|
113102
|
+
constructor(message, signal, fault) {
|
|
113103
|
+
super(message, signal);
|
|
113104
|
+
this.name = "HelperSpawnError";
|
|
113105
|
+
this.fault = fault;
|
|
113106
|
+
}
|
|
113107
|
+
};
|
|
113097
113108
|
async function spawnHelper(serial) {
|
|
113098
113109
|
const manifest = helperManifest();
|
|
113099
113110
|
const adbPath = await resolveAndroidBinary("adb");
|
|
113100
113111
|
if (!adbPath) {
|
|
113101
113112
|
throw new FailureError(
|
|
113102
|
-
"`adb` not found on PATH or under `$ANDROID_HOME/platform-tools` while spawning android
|
|
113113
|
+
"`adb` not found on PATH or under `$ANDROID_HOME/platform-tools` while spawning the argent android helper.",
|
|
113103
113114
|
{
|
|
113104
113115
|
error_code: FAILURE_CODES.ANDROID_DEVTOOLS_ADB_NOT_FOUND,
|
|
113105
113116
|
failure_stage: "android_devtools_spawn_helper",
|
|
@@ -113118,10 +113129,13 @@ async function spawnHelper(serial) {
|
|
|
113118
113129
|
let localPort = null;
|
|
113119
113130
|
let settled = false;
|
|
113120
113131
|
let stderrBuf = "";
|
|
113132
|
+
let statusBuf = "";
|
|
113133
|
+
let exitGrace;
|
|
113121
113134
|
const settle = (fn, cleanup) => {
|
|
113122
113135
|
if (settled) return;
|
|
113123
113136
|
settled = true;
|
|
113124
113137
|
clearTimeout(timer);
|
|
113138
|
+
clearTimeout(exitGrace);
|
|
113125
113139
|
rl.close();
|
|
113126
113140
|
cleanup?.();
|
|
113127
113141
|
fn();
|
|
@@ -113129,6 +113143,9 @@ async function spawnHelper(serial) {
|
|
|
113129
113143
|
const rl = readline2.createInterface({ input: proc.stdout });
|
|
113130
113144
|
rl.on("line", async (rawLine) => {
|
|
113131
113145
|
const line = rawLine.trim();
|
|
113146
|
+
if (statusBuf.length < HELPER_STATUS_MAX_CHARS && HELPER_STATUS_MARKER.test(line)) {
|
|
113147
|
+
statusBuf = (statusBuf ? `${statusBuf} ${line}` : line).slice(0, HELPER_STATUS_MAX_CHARS);
|
|
113148
|
+
}
|
|
113132
113149
|
const portMatch = HELPER_PORT_MARKER.exec(line);
|
|
113133
113150
|
if (!portMatch || devicePort !== null) return;
|
|
113134
113151
|
devicePort = parseInt(portMatch[1], 10);
|
|
@@ -113158,25 +113175,32 @@ async function spawnHelper(serial) {
|
|
|
113158
113175
|
stderrBuf += data.toString("utf-8");
|
|
113159
113176
|
if (stderrBuf.length > 4 * 1024) stderrBuf = stderrBuf.slice(-4 * 1024);
|
|
113160
113177
|
});
|
|
113161
|
-
|
|
113162
|
-
|
|
113163
|
-
|
|
113164
|
-
|
|
113165
|
-
|
|
113166
|
-
|
|
113167
|
-
|
|
113168
|
-
|
|
113169
|
-
|
|
113170
|
-
|
|
113171
|
-
|
|
113172
|
-
|
|
113173
|
-
|
|
113174
|
-
|
|
113175
|
-
}
|
|
113176
|
-
|
|
113178
|
+
let exitCode = null;
|
|
113179
|
+
let exitSignal = null;
|
|
113180
|
+
const rejectExited = () => {
|
|
113181
|
+
const detail = statusBuf ? statusBuf : stderrBuf.trim() ? `code=${exitCode} signal=${exitSignal}. stderr=${stderrBuf.trim().slice(0, 200)}` : `code=${exitCode} signal=${exitSignal}`;
|
|
113182
|
+
reject(
|
|
113183
|
+
new HelperSpawnError(
|
|
113184
|
+
`am instrument exited before becoming ready: ${detail}`,
|
|
113185
|
+
{
|
|
113186
|
+
error_code: FAILURE_CODES.ANDROID_DEVTOOLS_HELPER_EXITED_BEFORE_READY,
|
|
113187
|
+
failure_stage: "android_devtools_helper_ready",
|
|
113188
|
+
failure_area: "tool_server",
|
|
113189
|
+
error_kind: "subprocess",
|
|
113190
|
+
failure_command: "android_devtools",
|
|
113191
|
+
...typeof exitCode === "number" ? { failure_exit_code: exitCode } : {},
|
|
113192
|
+
...exitSignal === "SIGABRT" || exitSignal === "SIGHUP" || exitSignal === "SIGINT" || exitSignal === "SIGKILL" || exitSignal === "SIGQUIT" || exitSignal === "SIGTERM" ? { failure_signal: exitSignal } : {}
|
|
113193
|
+
},
|
|
113194
|
+
classifyHelperSpawnFault(statusBuf)
|
|
113177
113195
|
)
|
|
113178
113196
|
);
|
|
113197
|
+
};
|
|
113198
|
+
proc.on("exit", (code, signal) => {
|
|
113199
|
+
exitCode = code;
|
|
113200
|
+
exitSignal = signal;
|
|
113201
|
+
exitGrace = setTimeout(() => settle(rejectExited), EXIT_GRACE_MS);
|
|
113179
113202
|
});
|
|
113203
|
+
proc.on("close", () => settle(rejectExited));
|
|
113180
113204
|
proc.on("error", (err) => {
|
|
113181
113205
|
settle(
|
|
113182
113206
|
() => reject(
|
|
@@ -113211,6 +113235,50 @@ async function spawnHelper(serial) {
|
|
|
113211
113235
|
}, READY_TIMEOUT_MS2);
|
|
113212
113236
|
});
|
|
113213
113237
|
}
|
|
113238
|
+
async function installHelper(serial, options) {
|
|
113239
|
+
try {
|
|
113240
|
+
await ensureAndroidDevtoolsInstalled(serial, options);
|
|
113241
|
+
} catch (err) {
|
|
113242
|
+
const cause = err instanceof Error ? err : new Error(String(err));
|
|
113243
|
+
const reason = cause.message.replace(/^.*? failed: /s, "").replace(/\s+/g, " ").trim().slice(0, 200);
|
|
113244
|
+
throw new FailureError(
|
|
113245
|
+
`the argent android helper is not installed on ${serial} and could not be installed: ${reason}`,
|
|
113246
|
+
{
|
|
113247
|
+
error_code: FAILURE_CODES.ANDROID_DEVTOOLS_HELPER_INSTALL_FAILED,
|
|
113248
|
+
failure_stage: "android_devtools_helper_install",
|
|
113249
|
+
failure_area: "tool_server",
|
|
113250
|
+
error_kind: "subprocess",
|
|
113251
|
+
failure_command: "adb"
|
|
113252
|
+
},
|
|
113253
|
+
{ cause }
|
|
113254
|
+
);
|
|
113255
|
+
}
|
|
113256
|
+
}
|
|
113257
|
+
async function spawnHelperWithRepair(serial) {
|
|
113258
|
+
await installHelper(serial, {});
|
|
113259
|
+
try {
|
|
113260
|
+
return await spawnHelper(serial);
|
|
113261
|
+
} catch (err) {
|
|
113262
|
+
if (!(err instanceof HelperSpawnError) || err.fault !== "instrumentation-missing") throw err;
|
|
113263
|
+
await installHelper(serial, { force: true });
|
|
113264
|
+
try {
|
|
113265
|
+
return await spawnHelper(serial);
|
|
113266
|
+
} catch (repairErr) {
|
|
113267
|
+
if (!(repairErr instanceof HelperSpawnError)) throw repairErr;
|
|
113268
|
+
throw new FailureError(
|
|
113269
|
+
`the argent android helper could not start on ${serial} even after reinstalling it: ${repairErr.message}`,
|
|
113270
|
+
{
|
|
113271
|
+
error_code: FAILURE_CODES.ANDROID_DEVTOOLS_HELPER_REPAIR_FAILED,
|
|
113272
|
+
failure_stage: "android_devtools_helper_repair",
|
|
113273
|
+
failure_area: "tool_server",
|
|
113274
|
+
error_kind: "subprocess",
|
|
113275
|
+
failure_command: "android_devtools"
|
|
113276
|
+
},
|
|
113277
|
+
{ cause: repairErr }
|
|
113278
|
+
);
|
|
113279
|
+
}
|
|
113280
|
+
}
|
|
113281
|
+
}
|
|
113214
113282
|
async function removeAdbForward(serial, localPort) {
|
|
113215
113283
|
try {
|
|
113216
113284
|
await runAdb(["-s", serial, "forward", "--remove", `tcp:${localPort}`], { timeoutMs: 5e3 });
|
|
@@ -113260,8 +113328,7 @@ var androidDevtoolsBlueprint = {
|
|
|
113260
113328
|
}
|
|
113261
113329
|
const serial = device.id;
|
|
113262
113330
|
const events = new TypedEventEmitter();
|
|
113263
|
-
await
|
|
113264
|
-
const spawned = await spawnHelper(serial);
|
|
113331
|
+
const spawned = await spawnHelperWithRepair(serial);
|
|
113265
113332
|
let ready2 = false;
|
|
113266
113333
|
let disposed = false;
|
|
113267
113334
|
let client2;
|
|
@@ -115528,13 +115595,13 @@ async function ensureRunnerArtifact(config2, opts = {}) {
|
|
|
115528
115595
|
xcodeVersionFingerprint()
|
|
115529
115596
|
]);
|
|
115530
115597
|
const staticArgs = runnerBuildStaticArgs(projectPath, config2);
|
|
115531
|
-
const
|
|
115598
|
+
const cacheKey2 = computeRunnerCacheKey(sourcesHash, xcodeVersion, staticArgs);
|
|
115532
115599
|
const derivedDataPath = derivedDir();
|
|
115533
115600
|
const build = opts.build ?? buildRunnerArtifact;
|
|
115534
115601
|
return withRunnerBuildLock(async () => {
|
|
115535
115602
|
const stampPath = path21.join(derivedDataPath, CACHE_KEY_FILE);
|
|
115536
115603
|
const stamped = await fsp.readFile(stampPath, "utf8").catch(() => null);
|
|
115537
|
-
if (!opts.force && stamped ===
|
|
115604
|
+
if (!opts.force && stamped === cacheKey2) {
|
|
115538
115605
|
const cached3 = findBaseXctestrun(derivedDataPath);
|
|
115539
115606
|
const expiresAt = await readRunnerExpiryDate(derivedDataPath);
|
|
115540
115607
|
const needsRenew = expiresAt !== null && profileNeedsRenewal(expiresAt, /* @__PURE__ */ new Date());
|
|
@@ -115546,14 +115613,14 @@ async function ensureRunnerArtifact(config2, opts = {}) {
|
|
|
115546
115613
|
};
|
|
115547
115614
|
}
|
|
115548
115615
|
}
|
|
115549
|
-
if (stamped !==
|
|
115616
|
+
if (stamped !== cacheKey2) {
|
|
115550
115617
|
await fsp.rm(derivedDataPath, {
|
|
115551
115618
|
recursive: true,
|
|
115552
115619
|
force: true
|
|
115553
115620
|
});
|
|
115554
115621
|
}
|
|
115555
115622
|
const built = await build(derivedDataPath, staticArgs, opts.destinationUdid);
|
|
115556
|
-
await fsp.writeFile(stampPath,
|
|
115623
|
+
await fsp.writeFile(stampPath, cacheKey2);
|
|
115557
115624
|
return built;
|
|
115558
115625
|
});
|
|
115559
115626
|
}
|
|
@@ -119852,25 +119919,25 @@ var reactProfilerSessionBlueprint = {
|
|
|
119852
119919
|
}
|
|
119853
119920
|
};
|
|
119854
119921
|
var profilerPathsCache = /* @__PURE__ */ new Map();
|
|
119855
|
-
function
|
|
119922
|
+
function cacheKey(port, deviceId) {
|
|
119856
119923
|
return `${port}:${deviceId}`;
|
|
119857
119924
|
}
|
|
119858
119925
|
function cacheProfilerPaths(port, paths, deviceId) {
|
|
119859
|
-
profilerPathsCache.set(
|
|
119926
|
+
profilerPathsCache.set(cacheKey(port, deviceId), paths);
|
|
119860
119927
|
}
|
|
119861
119928
|
function getCachedProfilerPaths(port, deviceId) {
|
|
119862
|
-
return profilerPathsCache.get(
|
|
119929
|
+
return profilerPathsCache.get(cacheKey(port, deviceId));
|
|
119863
119930
|
}
|
|
119864
119931
|
function clearCachedProfilerPaths(port, deviceId) {
|
|
119865
|
-
profilerPathsCache.delete(
|
|
119932
|
+
profilerPathsCache.delete(cacheKey(port, deviceId));
|
|
119866
119933
|
}
|
|
119867
119934
|
|
|
119868
119935
|
// ../tool-server/src/tools/devices/boot-device.ts
|
|
119869
|
-
var
|
|
119936
|
+
var import_node_child_process25 = require("node:child_process");
|
|
119870
119937
|
var import_node_fs12 = require("node:fs");
|
|
119871
119938
|
var import_node_os11 = require("node:os");
|
|
119872
119939
|
var import_node_path14 = require("node:path");
|
|
119873
|
-
var
|
|
119940
|
+
var import_node_util18 = require("node:util");
|
|
119874
119941
|
init_zod();
|
|
119875
119942
|
init_src();
|
|
119876
119943
|
init_adb();
|
|
@@ -119955,6 +120022,39 @@ function androidHeadlessFromEnv() {
|
|
|
119955
120022
|
init_device_info();
|
|
119956
120023
|
init_external_devices();
|
|
119957
120024
|
|
|
120025
|
+
// ../tool-server/src/utils/hid-suppression.ts
|
|
120026
|
+
var import_node_child_process23 = require("node:child_process");
|
|
120027
|
+
var import_node_util17 = require("node:util");
|
|
120028
|
+
var execFileAsync17 = (0, import_node_util17.promisify)(import_node_child_process23.execFile);
|
|
120029
|
+
var WARMUP_TIMEOUT_MS = 4e4;
|
|
120030
|
+
var errText = (err) => err instanceof Error ? err.message : String(err);
|
|
120031
|
+
function startHidWarmUp(udid, deviceSet) {
|
|
120032
|
+
let binary;
|
|
120033
|
+
try {
|
|
120034
|
+
binary = simulatorServerBinaryPath();
|
|
120035
|
+
} catch (err) {
|
|
120036
|
+
process.stderr.write(
|
|
120037
|
+
`[hid-warmup ${udid.slice(0, 8)}] simulator-server binary not found (${errText(err)}); HID suppression protection is not active for this boot.
|
|
120038
|
+
`
|
|
120039
|
+
);
|
|
120040
|
+
return Promise.resolve();
|
|
120041
|
+
}
|
|
120042
|
+
const args = ["hid_warmup", "--id", udid];
|
|
120043
|
+
if (deviceSet) args.push("--device-set", deviceSet);
|
|
120044
|
+
return execFileAsync17(binary, args, {
|
|
120045
|
+
timeout: WARMUP_TIMEOUT_MS,
|
|
120046
|
+
// It prints CoreSimulator noise on every failed attach attempt — ~80KB
|
|
120047
|
+
// against a device that never comes up. Well under Node's 1MB default, but
|
|
120048
|
+
// the default is the only headroom there is, so name one.
|
|
120049
|
+
maxBuffer: 4 * 1024 * 1024
|
|
120050
|
+
}).then(() => void 0).catch((err) => {
|
|
120051
|
+
process.stderr.write(
|
|
120052
|
+
`[hid-warmup ${udid.slice(0, 8)}] warm-up did not run (${errText(err)}); input may be silently dropped on this simulator.
|
|
120053
|
+
`
|
|
120054
|
+
);
|
|
120055
|
+
});
|
|
120056
|
+
}
|
|
120057
|
+
|
|
119958
120058
|
// ../tool-server/src/utils/vega-vvd.ts
|
|
119959
120059
|
init_src();
|
|
119960
120060
|
init_adb();
|
|
@@ -120085,7 +120185,7 @@ async function waitForVvdRunning(timeoutMs) {
|
|
|
120085
120185
|
}
|
|
120086
120186
|
|
|
120087
120187
|
// ../tool-server/src/tools/devices/boot-electron.ts
|
|
120088
|
-
var
|
|
120188
|
+
var import_node_child_process24 = require("node:child_process");
|
|
120089
120189
|
var fs31 = __toESM(require("node:fs"));
|
|
120090
120190
|
var path26 = __toESM(require("node:path"));
|
|
120091
120191
|
init_src();
|
|
@@ -120281,7 +120381,7 @@ async function bootElectronApp(options) {
|
|
|
120281
120381
|
];
|
|
120282
120382
|
let child;
|
|
120283
120383
|
try {
|
|
120284
|
-
child = (0,
|
|
120384
|
+
child = (0, import_node_child_process24.spawn)(launcher.command, args, {
|
|
120285
120385
|
detached: true,
|
|
120286
120386
|
// stdout is discarded, not piped: nothing reads it, and an unread pipe
|
|
120287
120387
|
// blocks the child's writes once the OS buffer fills. The
|
|
@@ -120403,7 +120503,7 @@ async function bootElectronApp(options) {
|
|
|
120403
120503
|
}
|
|
120404
120504
|
|
|
120405
120505
|
// ../tool-server/src/tools/devices/boot-device.ts
|
|
120406
|
-
var
|
|
120506
|
+
var execFileAsync18 = (0, import_node_util18.promisify)(import_node_child_process25.execFile);
|
|
120407
120507
|
var zodSchema9 = external_exports.object({
|
|
120408
120508
|
udid: external_exports.string().optional().describe(
|
|
120409
120509
|
"iOS: simulator UDID to boot (from `list-devices`). Provide exactly one of `udid`, `avdName`, `vvdImage`, or `electronAppPath`."
|
|
@@ -120607,7 +120707,7 @@ async function bootIos(udid, registry2, force, headless) {
|
|
|
120607
120707
|
const deviceSet = await deviceSetForUdid(udid);
|
|
120608
120708
|
const prefix = simctlPrefix(deviceSet);
|
|
120609
120709
|
if (force && simState === "Booted") {
|
|
120610
|
-
await
|
|
120710
|
+
await execFileAsync18("xcrun", [...prefix, "shutdown", udid]);
|
|
120611
120711
|
}
|
|
120612
120712
|
const needsPreBoot = simState === "Shutdown" || force && simState === "Booted";
|
|
120613
120713
|
if (needsPreBoot) {
|
|
@@ -120618,13 +120718,15 @@ async function bootIos(udid, registry2, force, headless) {
|
|
|
120618
120718
|
);
|
|
120619
120719
|
});
|
|
120620
120720
|
}
|
|
120621
|
-
|
|
120721
|
+
const alreadyUp = simState === "Booted" && !force;
|
|
120722
|
+
const hidWarmUp = alreadyUp || isTvOs ? Promise.resolve() : startHidWarmUp(udid, deviceSet);
|
|
120723
|
+
await execFileAsync18("xcrun", [...prefix, "boot", udid]).catch((err) => {
|
|
120622
120724
|
const message = err instanceof Error ? err.message : String(err);
|
|
120623
120725
|
if (!message.includes("Unable to boot device in current state: Booted")) {
|
|
120624
120726
|
throw err;
|
|
120625
120727
|
}
|
|
120626
120728
|
});
|
|
120627
|
-
await
|
|
120729
|
+
await execFileAsync18("xcrun", [...prefix, "bootstatus", udid, "-b"]);
|
|
120628
120730
|
if (isTvOs && needsPreBoot) {
|
|
120629
120731
|
await registry2.disposeService(`${TV_CONTROL_NAMESPACE}:${udid}`).catch((err) => {
|
|
120630
120732
|
if (err instanceof ServiceNotFoundError) return;
|
|
@@ -120643,6 +120745,7 @@ async function bootIos(udid, registry2, force, headless) {
|
|
|
120643
120745
|
});
|
|
120644
120746
|
}
|
|
120645
120747
|
await ensureAutomationEnabled(udid).catch(() => void 0);
|
|
120748
|
+
await hidWarmUp;
|
|
120646
120749
|
const ndRef = nativeDevtoolsRef({ id: udid, platform: "ios", kind: "simulator" });
|
|
120647
120750
|
const ndApi = await registry2.resolveService(ndRef.urn, ndRef.options);
|
|
120648
120751
|
await ndApi.reverifyEnv().catch(() => {
|
|
@@ -120652,7 +120755,7 @@ async function bootIos(udid, registry2, force, headless) {
|
|
|
120652
120755
|
return buildInitFailedResult(udid, initFailure);
|
|
120653
120756
|
}
|
|
120654
120757
|
if (!deviceSet) {
|
|
120655
|
-
await
|
|
120758
|
+
await execFileAsync18("defaults", [
|
|
120656
120759
|
"write",
|
|
120657
120760
|
"com.apple.iphonesimulator",
|
|
120658
120761
|
"CurrentDeviceUDID",
|
|
@@ -120661,7 +120764,7 @@ async function bootIos(udid, registry2, force, headless) {
|
|
|
120661
120764
|
});
|
|
120662
120765
|
}
|
|
120663
120766
|
if (!headless && !iosHeadlessFromEnv() && !deviceSet) {
|
|
120664
|
-
await
|
|
120767
|
+
await execFileAsync18("open", ["-a", "Simulator.app"]).catch(() => execFileAsync18("open", ["-b", "com.apple.dt.Devices"])).catch(() => {
|
|
120665
120768
|
});
|
|
120666
120769
|
}
|
|
120667
120770
|
return { platform: "ios", udid, booted: true };
|
|
@@ -120708,7 +120811,7 @@ async function attemptBoot(params) {
|
|
|
120708
120811
|
emulatorLogFd = (0, import_node_fs12.openSync)(logPath, "w");
|
|
120709
120812
|
stdio = ["ignore", emulatorLogFd, emulatorLogFd];
|
|
120710
120813
|
}
|
|
120711
|
-
const child = (0,
|
|
120814
|
+
const child = (0, import_node_child_process25.spawn)(params.emulatorBinary, params.emulatorArgs, {
|
|
120712
120815
|
detached: true,
|
|
120713
120816
|
stdio
|
|
120714
120817
|
});
|
|
@@ -121333,11 +121436,11 @@ var BUNDLE_ID_PATTERN = /^[A-Za-z0-9_][A-Za-z0-9._-]*$/;
|
|
|
121333
121436
|
var BUNDLE_ID_MESSAGE = "bundleId may only contain letters, digits, '.', '_' and '-', and may not start with '-' or '.'";
|
|
121334
121437
|
|
|
121335
121438
|
// ../tool-server/src/tools/launch-app/platforms/ios.ts
|
|
121336
|
-
var
|
|
121337
|
-
var
|
|
121439
|
+
var import_node_child_process26 = require("node:child_process");
|
|
121440
|
+
var import_node_util19 = require("node:util");
|
|
121338
121441
|
init_src();
|
|
121339
121442
|
init_external_devices();
|
|
121340
|
-
var
|
|
121443
|
+
var execFileAsync19 = (0, import_node_util19.promisify)(import_node_child_process26.execFile);
|
|
121341
121444
|
function makeIosImpl(registry2) {
|
|
121342
121445
|
return {
|
|
121343
121446
|
requires: ["xcrun"],
|
|
@@ -121352,7 +121455,7 @@ function makeIosImpl(registry2) {
|
|
|
121352
121455
|
if (blocked) return blocked;
|
|
121353
121456
|
}
|
|
121354
121457
|
try {
|
|
121355
|
-
await
|
|
121458
|
+
await execFileAsync19(
|
|
121356
121459
|
"xcrun",
|
|
121357
121460
|
await simctlArgsForUdid(params.udid, ["launch", params.udid, params.bundleId])
|
|
121358
121461
|
);
|
|
@@ -121644,11 +121747,11 @@ init_zod();
|
|
|
121644
121747
|
init_device_info();
|
|
121645
121748
|
|
|
121646
121749
|
// ../tool-server/src/tools/restart-app/platforms/ios.ts
|
|
121647
|
-
var
|
|
121648
|
-
var
|
|
121750
|
+
var import_node_child_process27 = require("node:child_process");
|
|
121751
|
+
var import_node_util20 = require("node:util");
|
|
121649
121752
|
init_src();
|
|
121650
121753
|
init_external_devices();
|
|
121651
|
-
var
|
|
121754
|
+
var execFileAsync20 = (0, import_node_util20.promisify)(import_node_child_process27.execFile);
|
|
121652
121755
|
function makeIosImpl2(registry2) {
|
|
121653
121756
|
return {
|
|
121654
121757
|
requires: ["xcrun"],
|
|
@@ -121664,11 +121767,11 @@ function makeIosImpl2(registry2) {
|
|
|
121664
121767
|
if (blocked) return blocked;
|
|
121665
121768
|
}
|
|
121666
121769
|
try {
|
|
121667
|
-
await
|
|
121770
|
+
await execFileAsync20("xcrun", await simctlArgsForUdid(udid, ["terminate", udid, bundleId]));
|
|
121668
121771
|
} catch {
|
|
121669
121772
|
}
|
|
121670
121773
|
try {
|
|
121671
|
-
await
|
|
121774
|
+
await execFileAsync20("xcrun", await simctlArgsForUdid(udid, ["launch", udid, bundleId]));
|
|
121672
121775
|
} catch (err) {
|
|
121673
121776
|
throw new FailureError(
|
|
121674
121777
|
`Failed to restart iOS app ${bundleId} on ${udid}.`,
|
|
@@ -121846,11 +121949,11 @@ Returns { restarted, bundleId }. Fails if the app is not installed.`,
|
|
|
121846
121949
|
init_zod();
|
|
121847
121950
|
|
|
121848
121951
|
// ../tool-server/src/tools/reinstall-app/platforms/ios.ts
|
|
121849
|
-
var
|
|
121850
|
-
var
|
|
121952
|
+
var import_node_child_process28 = require("node:child_process");
|
|
121953
|
+
var import_node_util21 = require("node:util");
|
|
121851
121954
|
var import_node_path15 = require("node:path");
|
|
121852
121955
|
init_src();
|
|
121853
|
-
var
|
|
121956
|
+
var execFileAsync21 = (0, import_node_util21.promisify)(import_node_child_process28.execFile);
|
|
121854
121957
|
var iosImpl = {
|
|
121855
121958
|
requires: ["xcrun"],
|
|
121856
121959
|
handler: async (_services, params) => {
|
|
@@ -121858,11 +121961,11 @@ var iosImpl = {
|
|
|
121858
121961
|
const absolute = (0, import_node_path15.resolve)(appPath);
|
|
121859
121962
|
const { nativeId, prefix } = await simctlTargetForUdid(udid);
|
|
121860
121963
|
try {
|
|
121861
|
-
await
|
|
121964
|
+
await execFileAsync21("xcrun", [...prefix, "uninstall", nativeId, bundleId]);
|
|
121862
121965
|
} catch {
|
|
121863
121966
|
}
|
|
121864
121967
|
try {
|
|
121865
|
-
await
|
|
121968
|
+
await execFileAsync21("xcrun", [...prefix, "install", nativeId, absolute]);
|
|
121866
121969
|
} catch (err) {
|
|
121867
121970
|
throw new FailureError(
|
|
121868
121971
|
`Failed to install iOS app bundle on ${udid}.`,
|
|
@@ -122039,10 +122142,10 @@ var PERMISSION_NAMES = [
|
|
|
122039
122142
|
];
|
|
122040
122143
|
|
|
122041
122144
|
// ../tool-server/src/tools/settings-permissions/platforms/ios.ts
|
|
122042
|
-
var
|
|
122043
|
-
var
|
|
122145
|
+
var import_node_child_process29 = require("node:child_process");
|
|
122146
|
+
var import_node_util22 = require("node:util");
|
|
122044
122147
|
init_src();
|
|
122045
|
-
var
|
|
122148
|
+
var execFileAsync22 = (0, import_node_util22.promisify)(import_node_child_process29.execFile);
|
|
122046
122149
|
var SIMCTL_ACTION = {
|
|
122047
122150
|
grant: "grant",
|
|
122048
122151
|
deny: "revoke",
|
|
@@ -122067,7 +122170,7 @@ var NON_TCC_GRANT_NEEDS_INSTALL = /* @__PURE__ */ new Set([
|
|
|
122067
122170
|
]);
|
|
122068
122171
|
var localBackend = {
|
|
122069
122172
|
async run(udid, simctlAction, service, bundleId) {
|
|
122070
|
-
await
|
|
122173
|
+
await execFileAsync22(
|
|
122071
122174
|
"xcrun",
|
|
122072
122175
|
await simctlArgsForUdid(udid, ["privacy", udid, simctlAction, service, bundleId]),
|
|
122073
122176
|
{ timeout: 3e4 }
|
|
@@ -122075,7 +122178,7 @@ var localBackend = {
|
|
|
122075
122178
|
},
|
|
122076
122179
|
async isInstalled(udid, bundleId) {
|
|
122077
122180
|
try {
|
|
122078
|
-
await
|
|
122181
|
+
await execFileAsync22(
|
|
122079
122182
|
"xcrun",
|
|
122080
122183
|
await simctlArgsForUdid(udid, ["get_app_container", udid, bundleId]),
|
|
122081
122184
|
{ timeout: 15e3 }
|
|
@@ -122358,8 +122461,8 @@ init_zod();
|
|
|
122358
122461
|
init_device_info();
|
|
122359
122462
|
|
|
122360
122463
|
// ../tool-server/src/tools/open-url/platforms/ios.ts
|
|
122361
|
-
var
|
|
122362
|
-
var
|
|
122464
|
+
var import_node_child_process30 = require("node:child_process");
|
|
122465
|
+
var import_node_util23 = require("node:util");
|
|
122363
122466
|
init_src();
|
|
122364
122467
|
|
|
122365
122468
|
// ../tool-server/src/tools/open-url/deep-link-note.ts
|
|
@@ -122369,12 +122472,12 @@ function httpDeepLinkNote(url2) {
|
|
|
122369
122472
|
}
|
|
122370
122473
|
|
|
122371
122474
|
// ../tool-server/src/tools/open-url/platforms/ios.ts
|
|
122372
|
-
var
|
|
122475
|
+
var execFileAsync23 = (0, import_node_util23.promisify)(import_node_child_process30.execFile);
|
|
122373
122476
|
var iosImpl3 = {
|
|
122374
122477
|
requires: ["xcrun"],
|
|
122375
122478
|
handler: async (_services, params) => {
|
|
122376
122479
|
try {
|
|
122377
|
-
await
|
|
122480
|
+
await execFileAsync23(
|
|
122378
122481
|
"xcrun",
|
|
122379
122482
|
await simctlArgsForUdid(params.udid, ["openurl", params.udid, params.url])
|
|
122380
122483
|
);
|
|
@@ -122530,8 +122633,8 @@ Returns { opened, url, note? }. note carries the deep-linking caveat when a web
|
|
|
122530
122633
|
};
|
|
122531
122634
|
|
|
122532
122635
|
// ../tool-server/src/tools/screenshot/index.ts
|
|
122533
|
-
var
|
|
122534
|
-
var
|
|
122636
|
+
var import_node_child_process31 = require("node:child_process");
|
|
122637
|
+
var import_node_util24 = require("node:util");
|
|
122535
122638
|
var os13 = __toESM(require("node:os"));
|
|
122536
122639
|
var path27 = __toESM(require("node:path"));
|
|
122537
122640
|
init_zod();
|
|
@@ -123103,7 +123206,7 @@ function scalePng(src, scale) {
|
|
|
123103
123206
|
|
|
123104
123207
|
// ../tool-server/src/tools/screenshot/index.ts
|
|
123105
123208
|
var fs33 = __toESM(require("node:fs/promises"));
|
|
123106
|
-
var
|
|
123209
|
+
var execFileAsync24 = (0, import_node_util24.promisify)(import_node_child_process31.execFile);
|
|
123107
123210
|
var zodSchema15 = external_exports.object({
|
|
123108
123211
|
udid: external_exports.string().describe(
|
|
123109
123212
|
"Target device id from `list-devices` (iOS UDID, Android serial, Apple TV UDID, Vega serial, or Chromium id)."
|
|
@@ -123144,11 +123247,11 @@ async function tvScreenshot(udid, scale, signal) {
|
|
|
123144
123247
|
os13.tmpdir(),
|
|
123145
123248
|
`argent-tv-screenshot-${udid.slice(0, 8)}-${process.hrtime.bigint()}.png`
|
|
123146
123249
|
);
|
|
123147
|
-
await
|
|
123250
|
+
await execFileAsync24("xcrun", await simctlArgsForUdid(udid, ["io", udid, "screenshot", file2]), {
|
|
123148
123251
|
signal
|
|
123149
123252
|
});
|
|
123150
123253
|
if (scale < 1) {
|
|
123151
|
-
await
|
|
123254
|
+
await execFileAsync24("sips", ["-Z", String(await tvTargetLongSide(file2, scale)), file2], {
|
|
123152
123255
|
signal
|
|
123153
123256
|
}).catch(() => {
|
|
123154
123257
|
});
|
|
@@ -123158,7 +123261,7 @@ async function tvScreenshot(udid, scale, signal) {
|
|
|
123158
123261
|
async function tvTargetLongSide(file2, scale) {
|
|
123159
123262
|
let longSide = 3840;
|
|
123160
123263
|
try {
|
|
123161
|
-
const { stdout } = await
|
|
123264
|
+
const { stdout } = await execFileAsync24("sips", ["-g", "pixelWidth", "-g", "pixelHeight", file2]);
|
|
123162
123265
|
const width = Number(/pixelWidth:\s*(\d+)/.exec(stdout)?.[1]);
|
|
123163
123266
|
const height = Number(/pixelHeight:\s*(\d+)/.exec(stdout)?.[1]);
|
|
123164
123267
|
if (Number.isFinite(width) && Number.isFinite(height) && width > 0 && height > 0) {
|
|
@@ -123172,7 +123275,7 @@ async function downscalePngInPlace(file2, scale, signal) {
|
|
|
123172
123275
|
if (scale >= 1) {
|
|
123173
123276
|
return;
|
|
123174
123277
|
}
|
|
123175
|
-
await
|
|
123278
|
+
await execFileAsync24("sips", ["-Z", String(await tvTargetLongSide(file2, scale)), file2], {
|
|
123176
123279
|
signal
|
|
123177
123280
|
}).catch(() => {
|
|
123178
123281
|
});
|
|
@@ -125163,12 +125266,12 @@ var shakeZodSchema = external_exports.object({
|
|
|
125163
125266
|
});
|
|
125164
125267
|
|
|
125165
125268
|
// ../tool-server/src/tools/shake/platforms/ios.ts
|
|
125166
|
-
var
|
|
125167
|
-
var
|
|
125269
|
+
var import_node_child_process33 = require("node:child_process");
|
|
125270
|
+
var import_node_util25 = require("node:util");
|
|
125168
125271
|
init_src();
|
|
125169
125272
|
|
|
125170
125273
|
// ../tool-server/src/utils/window-shake.ts
|
|
125171
|
-
var
|
|
125274
|
+
var import_node_child_process32 = require("node:child_process");
|
|
125172
125275
|
var MICROINTERACTIONS_FLAG = "microinteractions";
|
|
125173
125276
|
var AMPLITUDE = 22;
|
|
125174
125277
|
var STEPS = 60;
|
|
@@ -125274,7 +125377,7 @@ end run
|
|
|
125274
125377
|
}
|
|
125275
125378
|
function runOsascript(script) {
|
|
125276
125379
|
return new Promise((resolve14, reject) => {
|
|
125277
|
-
const child = (0,
|
|
125380
|
+
const child = (0, import_node_child_process32.execFile)(
|
|
125278
125381
|
"/usr/bin/osascript",
|
|
125279
125382
|
["-"],
|
|
125280
125383
|
{ timeout: OSASCRIPT_TIMEOUT_MS },
|
|
@@ -125367,7 +125470,7 @@ async function prepareHostWindowShake(target) {
|
|
|
125367
125470
|
}
|
|
125368
125471
|
|
|
125369
125472
|
// ../tool-server/src/tools/shake/platforms/ios.ts
|
|
125370
|
-
var
|
|
125473
|
+
var execFileAsync25 = (0, import_node_util25.promisify)(import_node_child_process33.execFile);
|
|
125371
125474
|
var SHAKE_NOTIFICATION = "com.apple.UIKit.SimulatorShake";
|
|
125372
125475
|
var SHAKE_INTERVAL_MS = 400;
|
|
125373
125476
|
var sleep11 = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
@@ -125407,7 +125510,7 @@ var iosImpl4 = {
|
|
|
125407
125510
|
if (i > 0) await sleep11(SHAKE_INTERVAL_MS);
|
|
125408
125511
|
shaker.begin();
|
|
125409
125512
|
try {
|
|
125410
|
-
await
|
|
125513
|
+
await execFileAsync25("xcrun", args, { timeout: 15e3 });
|
|
125411
125514
|
} catch (err) {
|
|
125412
125515
|
const error52 = err instanceof Error ? err : new Error(String(err));
|
|
125413
125516
|
throw shakeFailure(udid, error52.message, error52);
|
|
@@ -138249,8 +138352,8 @@ var import_util8 = require("util");
|
|
|
138249
138352
|
var DEFAULT_EXEC_TIMEOUT_MS = 6e4;
|
|
138250
138353
|
var DEFAULT_EXEC_MAX_BUFFER = 256 * 1024 * 1024;
|
|
138251
138354
|
async function execFileAsyncWithTimeout(file2, args, options = {}) {
|
|
138252
|
-
const
|
|
138253
|
-
const { stdout, stderr } = await
|
|
138355
|
+
const execFileAsync30 = (0, import_util8.promisify)(import_child_process2.execFile);
|
|
138356
|
+
const { stdout, stderr } = await execFileAsync30(file2, args, {
|
|
138254
138357
|
encoding: "utf-8",
|
|
138255
138358
|
...options,
|
|
138256
138359
|
// Applied after ...options so a caller cannot weaken the guards; maxBuffer
|
|
@@ -142275,7 +142378,7 @@ var WATERMARK_PNG_HEIGHT = 277;
|
|
|
142275
142378
|
var WATERMARK_PNG_BASE64 = "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";
|
|
142276
142379
|
|
|
142277
142380
|
// ../tool-server/src/tools/screen-recording/watermark.ts
|
|
142278
|
-
var
|
|
142381
|
+
var execFileAsync26 = (0, import_util9.promisify)(import_child_process6.execFile);
|
|
142279
142382
|
var OUTPUT_FPS = 30;
|
|
142280
142383
|
var FFMPEG_FALLBACK_PATHS = [
|
|
142281
142384
|
"/opt/homebrew/bin/ffmpeg",
|
|
@@ -142292,7 +142395,7 @@ var MASK_DARK_MAX_LUMA = 90;
|
|
|
142292
142395
|
var MASK_LIGHT_MIN_LUMA = 165;
|
|
142293
142396
|
async function resolveBinary(name, fallbacks) {
|
|
142294
142397
|
try {
|
|
142295
|
-
await
|
|
142398
|
+
await execFileAsync26("/bin/sh", ["-c", `command -v ${name}`], { timeout: 2e3 });
|
|
142296
142399
|
return name;
|
|
142297
142400
|
} catch {
|
|
142298
142401
|
}
|
|
@@ -144992,7 +145095,7 @@ Returns { stopped } - the URNs of the services that were actually live and got s
|
|
|
144992
145095
|
|
|
144993
145096
|
// ../tool-server/src/tools/simulator/stop-metro.ts
|
|
144994
145097
|
init_zod();
|
|
144995
|
-
var
|
|
145098
|
+
var import_node_child_process34 = require("node:child_process");
|
|
144996
145099
|
function parseNetstatListeningPids(netstatOutput, port) {
|
|
144997
145100
|
const pids = /* @__PURE__ */ new Set();
|
|
144998
145101
|
for (const line of netstatOutput.split(/\r?\n/)) {
|
|
@@ -145008,7 +145111,7 @@ function parseNetstatListeningPids(netstatOutput, port) {
|
|
|
145008
145111
|
}
|
|
145009
145112
|
function listeningPids(port) {
|
|
145010
145113
|
if (process.platform === "win32") {
|
|
145011
|
-
const output2 = (0,
|
|
145114
|
+
const output2 = (0, import_node_child_process34.execFileSync)("netstat", ["-ano"], {
|
|
145012
145115
|
encoding: "utf-8",
|
|
145013
145116
|
timeout: 5e3,
|
|
145014
145117
|
// `netstat -ano` dumps every socket on the host; overflowing Node's
|
|
@@ -145017,7 +145120,7 @@ function listeningPids(port) {
|
|
|
145017
145120
|
});
|
|
145018
145121
|
return parseNetstatListeningPids(output2, port);
|
|
145019
145122
|
}
|
|
145020
|
-
const output = (0,
|
|
145123
|
+
const output = (0, import_node_child_process34.execFileSync)("lsof", ["-ti", `tcp:${port}`, "-sTCP:LISTEN"], {
|
|
145021
145124
|
encoding: "utf-8",
|
|
145022
145125
|
timeout: 5e3
|
|
145023
145126
|
}).trim();
|
|
@@ -148090,10 +148193,7 @@ async function queryAndroidFullHierarchy(registry2, device) {
|
|
|
148090
148193
|
devtools = await registry2.resolveService(ref.urn, ref.options);
|
|
148091
148194
|
} catch (err) {
|
|
148092
148195
|
const msg = err instanceof Error ? err.message : String(err);
|
|
148093
|
-
throw new Error(
|
|
148094
|
-
`the android devtools helper is unavailable (${msg}) \u2014 flows resolve testID selectors against the full hierarchy it serves; confirm the device is unlocked and the helper can be installed (\`adb install -t\`)`,
|
|
148095
|
-
{ cause: err }
|
|
148096
|
-
);
|
|
148196
|
+
throw new Error(`the argent android helper is unavailable: ${msg}`, { cause: err });
|
|
148097
148197
|
}
|
|
148098
148198
|
const [{ xml }, size] = await Promise.all([
|
|
148099
148199
|
// clearCache: await/assert polls must see text changes, not cached reads.
|
|
@@ -149684,6 +149784,10 @@ function roleOnlySelectorWarning(selector) {
|
|
|
149684
149784
|
if (selector.text !== void 0 || selector.textMatches !== void 0) return void 0;
|
|
149685
149785
|
return `selector ${describeSelector(selector)} matches by role alone (the tapped element has no id or visible text) \u2014 replay takes whichever element of that role ranks first, so re-record against a labelled element if that is not reliably this one`;
|
|
149686
149786
|
}
|
|
149787
|
+
function innermostTreeReason(message) {
|
|
149788
|
+
const unwrapped = /helper is unavailable:\s*(.+)/s.exec(message)?.[1] ?? message;
|
|
149789
|
+
return unwrapped.replace(/^\[[^\]]+\]\s*/, "").trim();
|
|
149790
|
+
}
|
|
149687
149791
|
async function captureTapSelector(registry2, session, udid, point) {
|
|
149688
149792
|
try {
|
|
149689
149793
|
const device = resolveDevice(udid);
|
|
@@ -149715,8 +149819,9 @@ async function captureTapSelector(registry2, session, udid, point) {
|
|
|
149715
149819
|
].filter((w) => w !== void 0);
|
|
149716
149820
|
return { selector, ...warnings.length > 0 ? { warning: warnings.join("; ") } : {} };
|
|
149717
149821
|
} catch (err) {
|
|
149822
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
149718
149823
|
return {
|
|
149719
|
-
warning: `selector capture failed (${
|
|
149824
|
+
warning: `selector capture failed (${innermostTreeReason(message)}); kept coordinates`
|
|
149720
149825
|
};
|
|
149721
149826
|
}
|
|
149722
149827
|
}
|
|
@@ -150131,7 +150236,7 @@ var import_node_url4 = require("node:url");
|
|
|
150131
150236
|
init_src();
|
|
150132
150237
|
|
|
150133
150238
|
// ../tool-server/src/tools/flows/script/flow-script-executor.ts
|
|
150134
|
-
var
|
|
150239
|
+
var import_node_child_process35 = require("node:child_process");
|
|
150135
150240
|
var fs56 = __toESM(require("node:fs"));
|
|
150136
150241
|
var os17 = __toESM(require("node:os"));
|
|
150137
150242
|
var path41 = __toESM(require("node:path"));
|
|
@@ -150515,7 +150620,7 @@ var FlowScriptExecutor = class {
|
|
|
150515
150620
|
detached: process.platform !== "win32",
|
|
150516
150621
|
windowsHide: process.platform === "win32"
|
|
150517
150622
|
};
|
|
150518
|
-
child = (0,
|
|
150623
|
+
child = (0, import_node_child_process35.fork)(scriptPath, [], forkOptions);
|
|
150519
150624
|
} catch (err) {
|
|
150520
150625
|
return emptyResult(
|
|
150521
150626
|
{ kind: "spawn", message: `Could not start the script process: ${errorMessage(err)}` },
|
|
@@ -150956,7 +151061,7 @@ async function stopProcessTree(child, graceMs) {
|
|
|
150956
151061
|
if (process.platform === "win32") {
|
|
150957
151062
|
if (hasExited(child)) return;
|
|
150958
151063
|
tryKill(() => {
|
|
150959
|
-
const killer = (0,
|
|
151064
|
+
const killer = (0, import_node_child_process35.spawn)("taskkill", ["/pid", String(pid), "/t", "/f"], {
|
|
150960
151065
|
windowsHide: true,
|
|
150961
151066
|
stdio: "ignore"
|
|
150962
151067
|
});
|
|
@@ -151750,7 +151855,7 @@ init_src();
|
|
|
151750
151855
|
// ../tool-server/src/tools/screenshot-diff/screenshot-diff-ocr.ts
|
|
151751
151856
|
var import_child_process8 = require("child_process");
|
|
151752
151857
|
var import_util10 = require("util");
|
|
151753
|
-
var
|
|
151858
|
+
var execFileAsync27 = (0, import_util10.promisify)(import_child_process8.execFile);
|
|
151754
151859
|
var OCR_TIMEOUT_MS = 1e4;
|
|
151755
151860
|
var OCR_MAX_BUFFER_BYTES = 32 * 1024 * 1024;
|
|
151756
151861
|
var TESSERACT_BINARY = "tesseract";
|
|
@@ -151795,7 +151900,7 @@ async function extractOcrTextBlocks(imagePath) {
|
|
|
151795
151900
|
}
|
|
151796
151901
|
}
|
|
151797
151902
|
async function recognizeTsv(imagePath) {
|
|
151798
|
-
const { stdout } = await
|
|
151903
|
+
const { stdout } = await execFileAsync27(
|
|
151799
151904
|
TESSERACT_BINARY,
|
|
151800
151905
|
[
|
|
151801
151906
|
imagePath,
|
|
@@ -154020,11 +154125,11 @@ async function runSnapshot(env, opts) {
|
|
|
154020
154125
|
}
|
|
154021
154126
|
|
|
154022
154127
|
// ../tool-server/src/utils/status-bar.ts
|
|
154023
|
-
var
|
|
154024
|
-
var
|
|
154128
|
+
var import_node_child_process36 = require("node:child_process");
|
|
154129
|
+
var import_node_util26 = require("node:util");
|
|
154025
154130
|
init_adb();
|
|
154026
154131
|
init_device_info();
|
|
154027
|
-
var
|
|
154132
|
+
var execFileAsync28 = (0, import_node_util26.promisify)(import_node_child_process36.execFile);
|
|
154028
154133
|
var DEMO_BROADCAST = "am broadcast -a com.android.systemui.demo";
|
|
154029
154134
|
var IOS_STATUS_BAR_OVERRIDE = [
|
|
154030
154135
|
"override",
|
|
@@ -154048,7 +154153,7 @@ async function pinStatusBar(device, signal) {
|
|
|
154048
154153
|
if (isIosPhysicalDevice(device)) return false;
|
|
154049
154154
|
try {
|
|
154050
154155
|
if (device.platform === "ios") {
|
|
154051
|
-
await
|
|
154156
|
+
await execFileAsync28(
|
|
154052
154157
|
"xcrun",
|
|
154053
154158
|
await simctlArgsForUdid(device.id, ["status_bar", device.id, ...IOS_STATUS_BAR_OVERRIDE])
|
|
154054
154159
|
);
|
|
@@ -154084,7 +154189,7 @@ async function pinStatusBar(device, signal) {
|
|
|
154084
154189
|
async function restoreStatusBar(device) {
|
|
154085
154190
|
try {
|
|
154086
154191
|
if (device.platform === "ios") {
|
|
154087
|
-
await
|
|
154192
|
+
await execFileAsync28(
|
|
154088
154193
|
"xcrun",
|
|
154089
154194
|
await simctlArgsForUdid(device.id, ["status_bar", device.id, "clear"])
|
|
154090
154195
|
);
|
|
@@ -154224,9 +154329,9 @@ async function androidDevtoolsReady(registry2, device) {
|
|
|
154224
154329
|
try {
|
|
154225
154330
|
const ref = androidDevtoolsRef(device);
|
|
154226
154331
|
const api = await registry2.resolveService(ref.urn, ref.options);
|
|
154227
|
-
return api.isReady();
|
|
154228
|
-
} catch {
|
|
154229
|
-
return false;
|
|
154332
|
+
return { ready: api.isReady() };
|
|
154333
|
+
} catch (err) {
|
|
154334
|
+
return { ready: false, reason: err instanceof Error ? err.message : String(err) };
|
|
154230
154335
|
}
|
|
154231
154336
|
}
|
|
154232
154337
|
async function treeSourceGate(registry2, device, bundleId, signal) {
|
|
@@ -154246,9 +154351,9 @@ async function treeSourceGate(registry2, device, bundleId, signal) {
|
|
|
154246
154351
|
}
|
|
154247
154352
|
}
|
|
154248
154353
|
if (device.platform === "android" && !signal?.aborted) {
|
|
154249
|
-
const ready2 = await androidDevtoolsReady(registry2, device);
|
|
154354
|
+
const { ready: ready2, reason } = await androidDevtoolsReady(registry2, device);
|
|
154250
154355
|
if (!ready2 && !signal?.aborted) {
|
|
154251
|
-
return
|
|
154356
|
+
return reason ? `the argent android helper is unavailable: ${reason}` : `the argent android helper is unavailable (full-hierarchy source for testID selectors).`;
|
|
154252
154357
|
}
|
|
154253
154358
|
}
|
|
154254
154359
|
if (device.platform === "vega" && !signal?.aborted) {
|
|
@@ -155429,7 +155534,7 @@ init_zod();
|
|
|
155429
155534
|
// ../tool-server/src/utils/workspace-reader.ts
|
|
155430
155535
|
var import_promises12 = require("node:fs/promises");
|
|
155431
155536
|
var import_node_path22 = require("node:path");
|
|
155432
|
-
var
|
|
155537
|
+
var import_node_child_process37 = require("node:child_process");
|
|
155433
155538
|
var import_dotenv2 = __toESM(require_main());
|
|
155434
155539
|
async function exists(path50) {
|
|
155435
155540
|
try {
|
|
@@ -155473,7 +155578,7 @@ async function listDir(path50) {
|
|
|
155473
155578
|
var COMMAND_TIMEOUT_MS = 3e3;
|
|
155474
155579
|
function runVersionCommand(cmd, args, cwd) {
|
|
155475
155580
|
return new Promise((resolve14) => {
|
|
155476
|
-
const child = (0,
|
|
155581
|
+
const child = (0, import_node_child_process37.execFile)(cmd, args, { cwd, timeout: COMMAND_TIMEOUT_MS }, (err, stdout) => {
|
|
155477
155582
|
if (err) {
|
|
155478
155583
|
resolve14(null);
|
|
155479
155584
|
return;
|
|
@@ -155762,7 +155867,7 @@ Fails if the workspacePath is not an absolute path or the directory cannot be ac
|
|
|
155762
155867
|
};
|
|
155763
155868
|
|
|
155764
155869
|
// ../tool-server/src/tools/system/update-argent.ts
|
|
155765
|
-
var
|
|
155870
|
+
var import_node_child_process38 = require("node:child_process");
|
|
155766
155871
|
var fs63 = __toESM(require("node:fs"));
|
|
155767
155872
|
var path46 = __toESM(require("node:path"));
|
|
155768
155873
|
init_zod();
|
|
@@ -155897,7 +156002,7 @@ var updateArgentTool = {
|
|
|
155897
156002
|
if (spawnRoot) updateArgs.push("--project-root", spawnRoot);
|
|
155898
156003
|
const cmd = cliEntry ? process.execPath : "argent";
|
|
155899
156004
|
const args = cliEntry ? [cliEntry, ...updateArgs] : updateArgs;
|
|
155900
|
-
const child = (0,
|
|
156005
|
+
const child = (0, import_node_child_process38.spawn)(cmd, args, {
|
|
155901
156006
|
detached: true,
|
|
155902
156007
|
stdio: "ignore",
|
|
155903
156008
|
env: { ...process.env, ARGENT_UPDATE_TRIGGER: "mcp_update" }
|
|
@@ -156899,13 +157004,13 @@ function probeArgentToolServer(host, port, timeoutMs = 500) {
|
|
|
156899
157004
|
|
|
156900
157005
|
// ../tool-server/src/utils/simulator-watcher.ts
|
|
156901
157006
|
var fs65 = __toESM(require("node:fs"));
|
|
156902
|
-
var
|
|
156903
|
-
var
|
|
157007
|
+
var import_node_child_process39 = require("node:child_process");
|
|
157008
|
+
var import_node_util27 = require("node:util");
|
|
156904
157009
|
init_external_devices();
|
|
156905
|
-
var
|
|
157010
|
+
var execFileAsync29 = (0, import_node_util27.promisify)(import_node_child_process39.execFile);
|
|
156906
157011
|
var POLL_INTERVAL_MS2 = 1e4;
|
|
156907
157012
|
async function getBootedUdidsInSet(deviceSet) {
|
|
156908
|
-
const { stdout } = await
|
|
157013
|
+
const { stdout } = await execFileAsync29("xcrun", [
|
|
156909
157014
|
...simctlPrefix(deviceSet),
|
|
156910
157015
|
"list",
|
|
156911
157016
|
"devices",
|
|
@@ -157024,7 +157129,7 @@ function startSimulatorWatcher(registry2) {
|
|
|
157024
157129
|
}
|
|
157025
157130
|
|
|
157026
157131
|
// ../tool-server/src/utils/preview-window.ts
|
|
157027
|
-
var
|
|
157132
|
+
var import_node_child_process40 = require("node:child_process");
|
|
157028
157133
|
var fs66 = __toESM(require("node:fs"));
|
|
157029
157134
|
var os20 = __toESM(require("node:os"));
|
|
157030
157135
|
var path48 = __toESM(require("node:path"));
|
|
@@ -157056,10 +157161,10 @@ function ensureLensAppBundle(electronBin) {
|
|
|
157056
157161
|
fs66.copyFileSync(path48.join(realContents, "Info.plist"), plist);
|
|
157057
157162
|
const setPlist = (entry, value) => {
|
|
157058
157163
|
try {
|
|
157059
|
-
(0,
|
|
157164
|
+
(0, import_node_child_process40.execFileSync)("/usr/libexec/PlistBuddy", ["-c", `Set :${entry} ${value}`, plist]);
|
|
157060
157165
|
} catch {
|
|
157061
157166
|
try {
|
|
157062
|
-
(0,
|
|
157167
|
+
(0, import_node_child_process40.execFileSync)("/usr/libexec/PlistBuddy", ["-c", `Add :${entry} string ${value}`, plist]);
|
|
157063
157168
|
} catch {
|
|
157064
157169
|
}
|
|
157065
157170
|
}
|
|
@@ -157118,7 +157223,7 @@ function createPreviewWindowManager(opts = {}) {
|
|
|
157118
157223
|
const wrapperBin = ensureLensAppBundle(electronBin);
|
|
157119
157224
|
const launchBin = wrapperBin ?? electronBin;
|
|
157120
157225
|
const launchArgs = wrapperBin ? ["--no-sandbox", mainScript] : [mainScript];
|
|
157121
|
-
const next = (0,
|
|
157226
|
+
const next = (0, import_node_child_process40.spawn)(launchBin, launchArgs, {
|
|
157122
157227
|
// Strips ELECTRON_RUN_AS_NODE, which an Electron-based MCP host leaves in
|
|
157123
157228
|
// our env, so the child boots as a GUI app instead of bare Node.
|
|
157124
157229
|
env: electronGuiChildEnv({ ARGENT_PREVIEW_URL: url2 }),
|
package/package.json
CHANGED
|
@@ -74,11 +74,11 @@ A normally injectable app that is broken in the environment gets the same coordi
|
|
|
74
74
|
|
|
75
75
|
While the required source is down, selector failures and raw-point capture are void. Restore the source and re-record affected taps.
|
|
76
76
|
|
|
77
|
-
| Platform | Symptom
|
|
78
|
-
| -------- |
|
|
79
|
-
| Android | Cannot reach the
|
|
80
|
-
| Chromium | No reachable CDP session
|
|
81
|
-
| Vega | Toolkit returns no page source
|
|
77
|
+
| Platform | Symptom | Recovery |
|
|
78
|
+
| -------- | -------------------------------------- | -------------------------------------------------------------------------------- |
|
|
79
|
+
| Android | Cannot reach the argent android helper | Argent reinstalls it once; if it persists, read the device's reason in the error |
|
|
80
|
+
| Chromium | No reachable CDP session | Boot again with `electronAppPath` and remote debugging |
|
|
81
|
+
| Vega | Toolkit returns no page source | Relaunch an app built with automation support |
|
|
82
82
|
|
|
83
83
|
On Android, healthy `describe` output does not prove the flow tree is available. It can fall back to legacy `uiautomator`, while the runner refuses that trimmed fallback.
|
|
84
84
|
|