@swmansion/argent 0.22.1 → 0.22.2-next.1
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/bin/argent-android-devtools-0.1.0.apk +0 -0
- package/bin/darwin/ax-service +0 -0
- package/bin/darwin/tvos-ax-service +0 -0
- package/bin/darwin/tvos-hid-daemon +0 -0
- package/bin/tcp/ax-service +0 -0
- package/dist/cli-cmds.mjs +49 -21
- package/dist/installer.mjs +1 -1
- package/dist/tool-server.cjs +801 -2155
- package/dylibs/libArgentInjectionBootstrap.dylib +0 -0
- package/dylibs/libKeyboardPatch.dylib +0 -0
- package/dylibs/libNativeDevtoolsIos.dylib +0 -0
- package/dylibs/tcp/libArgentInjectionBootstrap.dylib +0 -0
- package/dylibs/tcp/libKeyboardPatch.dylib +0 -0
- package/dylibs/tcp/libNativeDevtoolsIos.dylib +0 -0
- package/dylibs/tvos/libArgentInjectionBootstrap.dylib +0 -0
- package/dylibs/tvos/libKeyboardPatch.dylib +0 -0
- package/dylibs/tvos/libNativeDevtoolsIos.dylib +0 -0
- package/package.json +1 -1
- package/skills/argent-create-flow/references/flow-yaml.md +30 -3
- package/skills/argent-create-flow/references/live-authoring.md +14 -12
- package/skills/argent-create-flow/references/reliability-and-recovery.md +2 -2
- package/skills/argent-device-interact/SKILL.md +3 -1
- package/skills/argent-qa-flows/SKILL.md +1 -1
package/dist/tool-server.cjs
CHANGED
|
@@ -373,6 +373,18 @@ var init_event_emitter = __esm({
|
|
|
373
373
|
this.listeners.get(event2).add(listener);
|
|
374
374
|
return this;
|
|
375
375
|
}
|
|
376
|
+
/**
|
|
377
|
+
* @public
|
|
378
|
+
* Every caller is in another workspace — tool-server (the variant-proposal
|
|
379
|
+
* store, the chromium server's frame/fps and network listeners, both
|
|
380
|
+
* js-runtime-debugger blueprints) and telemetry (`registry-listener`, which
|
|
381
|
+
* detaches from `Registry.events`) — and the dead-code gate runs against an
|
|
382
|
+
* unbuilt tree, where a cross-workspace edge cannot form. See `knip.jsonc`.
|
|
383
|
+
*
|
|
384
|
+
* To re-audit whether this tag is still earned, rename the member and read
|
|
385
|
+
* the `Property 'off' does not exist` errors `tsc` reports. Do not grep
|
|
386
|
+
* `.off(`: most hits in this repo are Node `EventEmitter`s.
|
|
387
|
+
*/
|
|
376
388
|
off(event2, listener) {
|
|
377
389
|
this.listeners.get(event2)?.delete(listener);
|
|
378
390
|
return this;
|
|
@@ -434,6 +446,19 @@ var init_artifacts = __esm({
|
|
|
434
446
|
};
|
|
435
447
|
ArtifactStore = class {
|
|
436
448
|
entries = /* @__PURE__ */ new Map();
|
|
449
|
+
/**
|
|
450
|
+
* @public
|
|
451
|
+
* Every caller is in tool-server — `tools/flows/flow-visual`,
|
|
452
|
+
* `tools/screenshot`, `tools/screenshot-diff`, `tools/screen-recording-stop`,
|
|
453
|
+
* both `tools/profiler/native-profiler` stop/analyze handlers and
|
|
454
|
+
* `tools/profiler/react/react-profiler-analyze` — and the dead-code gate runs
|
|
455
|
+
* against an unbuilt tree, where a cross-workspace edge cannot form. See
|
|
456
|
+
* `knip.jsonc`.
|
|
457
|
+
*
|
|
458
|
+
* To re-audit whether this tag is still earned, rename the member and read
|
|
459
|
+
* the `Property 'register' does not exist` errors `tsc --build` reports. Do
|
|
460
|
+
* not grep `.register(`: `registerTool` / `registerBlueprint` swamp the hits.
|
|
461
|
+
*/
|
|
437
462
|
async register(opts) {
|
|
438
463
|
const { hostPath, kind } = opts;
|
|
439
464
|
const filename = opts.filename ?? (0, import_node_path.basename)(hostPath);
|
|
@@ -464,9 +489,21 @@ var init_artifacts = __esm({
|
|
|
464
489
|
if (opts.saveDir) handle.saveDir = opts.saveDir;
|
|
465
490
|
return handle;
|
|
466
491
|
}
|
|
492
|
+
/**
|
|
493
|
+
* @public
|
|
494
|
+
* The only caller is the tool-server `GET /artifacts/:id` route, and the
|
|
495
|
+
* dead-code gate runs against an unbuilt tree, where a cross-workspace edge
|
|
496
|
+
* cannot form. See `knip.jsonc`.
|
|
497
|
+
*/
|
|
467
498
|
get(id) {
|
|
468
499
|
return this.entries.get(id);
|
|
469
500
|
}
|
|
501
|
+
/**
|
|
502
|
+
* @public
|
|
503
|
+
* The only caller is the tool-server `/artifacts` route, and the dead-code
|
|
504
|
+
* gate runs against an unbuilt tree, where a cross-workspace edge cannot
|
|
505
|
+
* form. See `knip.jsonc`.
|
|
506
|
+
*/
|
|
470
507
|
list() {
|
|
471
508
|
return [...this.entries.entries()].map(([id, entry]) => ({
|
|
472
509
|
id,
|
|
@@ -893,11 +930,9 @@ var init_errors = __esm({
|
|
|
893
930
|
FAILURE_SIGNAL_NAME_SET = new Set(FAILURE_SIGNAL_NAMES);
|
|
894
931
|
FAILURE_SPAWN_CODE_SET = new Set(FAILURE_SPAWN_CODES);
|
|
895
932
|
ServiceNotFoundError = class extends Error {
|
|
896
|
-
serviceId;
|
|
897
933
|
constructor(serviceId) {
|
|
898
934
|
super(`Service "${serviceId}" not found`);
|
|
899
935
|
this.name = "ServiceNotFoundError";
|
|
900
|
-
this.serviceId = serviceId;
|
|
901
936
|
withFailureSignal(this, {
|
|
902
937
|
error_code: FAILURE_CODES.REGISTRY_SERVICE_NOT_FOUND,
|
|
903
938
|
failure_stage: "registry_resolve_service",
|
|
@@ -907,11 +942,9 @@ var init_errors = __esm({
|
|
|
907
942
|
}
|
|
908
943
|
};
|
|
909
944
|
ServiceInitializationError = class extends Error {
|
|
910
|
-
serviceId;
|
|
911
945
|
constructor(serviceId, message, options) {
|
|
912
946
|
super(`[${serviceId}] ${message}`, options);
|
|
913
947
|
this.name = "ServiceInitializationError";
|
|
914
|
-
this.serviceId = serviceId;
|
|
915
948
|
withFailureSignal(
|
|
916
949
|
this,
|
|
917
950
|
getFailureSignalOrFallback(options?.cause, {
|
|
@@ -924,6 +957,13 @@ var init_errors = __esm({
|
|
|
924
957
|
}
|
|
925
958
|
};
|
|
926
959
|
ToolNotFoundError = class extends Error {
|
|
960
|
+
/**
|
|
961
|
+
* @public
|
|
962
|
+
* Knip's `classMembers` pass is workspace-local, so it cannot see the caller:
|
|
963
|
+
* `flow-add-step` keys `isToolNotFound` on this alongside the error identity,
|
|
964
|
+
* so a tool that ran and reported its own "not found" is not read as the
|
|
965
|
+
* command being absent.
|
|
966
|
+
*/
|
|
927
967
|
toolId;
|
|
928
968
|
constructor(toolId) {
|
|
929
969
|
super(`Tool "${toolId}" not found`);
|
|
@@ -938,11 +978,9 @@ var init_errors = __esm({
|
|
|
938
978
|
}
|
|
939
979
|
};
|
|
940
980
|
ToolExecutionError = class extends Error {
|
|
941
|
-
toolId;
|
|
942
981
|
constructor(toolId, message, options) {
|
|
943
982
|
super(`[Tool:${toolId}] ${message}`, options);
|
|
944
983
|
this.name = "ToolExecutionError";
|
|
945
|
-
this.toolId = toolId;
|
|
946
984
|
withFailureSignal(
|
|
947
985
|
this,
|
|
948
986
|
getFailureSignalOrFallback(options?.cause, {
|
|
@@ -80506,1909 +80544,6 @@ var require_bunyan = __commonJS({
|
|
|
80506
80544
|
}
|
|
80507
80545
|
});
|
|
80508
80546
|
|
|
80509
|
-
// ../../node_modules/source-map-js/lib/base64.js
|
|
80510
|
-
var require_base64 = __commonJS({
|
|
80511
|
-
"../../node_modules/source-map-js/lib/base64.js"(exports2) {
|
|
80512
|
-
var intToCharMap = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split("");
|
|
80513
|
-
exports2.encode = function(number4) {
|
|
80514
|
-
if (0 <= number4 && number4 < intToCharMap.length) {
|
|
80515
|
-
return intToCharMap[number4];
|
|
80516
|
-
}
|
|
80517
|
-
throw new TypeError("Must be between 0 and 63: " + number4);
|
|
80518
|
-
};
|
|
80519
|
-
exports2.decode = function(charCode) {
|
|
80520
|
-
var bigA = 65;
|
|
80521
|
-
var bigZ = 90;
|
|
80522
|
-
var littleA = 97;
|
|
80523
|
-
var littleZ = 122;
|
|
80524
|
-
var zero = 48;
|
|
80525
|
-
var nine = 57;
|
|
80526
|
-
var plus = 43;
|
|
80527
|
-
var slash = 47;
|
|
80528
|
-
var littleOffset = 26;
|
|
80529
|
-
var numberOffset = 52;
|
|
80530
|
-
if (bigA <= charCode && charCode <= bigZ) {
|
|
80531
|
-
return charCode - bigA;
|
|
80532
|
-
}
|
|
80533
|
-
if (littleA <= charCode && charCode <= littleZ) {
|
|
80534
|
-
return charCode - littleA + littleOffset;
|
|
80535
|
-
}
|
|
80536
|
-
if (zero <= charCode && charCode <= nine) {
|
|
80537
|
-
return charCode - zero + numberOffset;
|
|
80538
|
-
}
|
|
80539
|
-
if (charCode == plus) {
|
|
80540
|
-
return 62;
|
|
80541
|
-
}
|
|
80542
|
-
if (charCode == slash) {
|
|
80543
|
-
return 63;
|
|
80544
|
-
}
|
|
80545
|
-
return -1;
|
|
80546
|
-
};
|
|
80547
|
-
}
|
|
80548
|
-
});
|
|
80549
|
-
|
|
80550
|
-
// ../../node_modules/source-map-js/lib/base64-vlq.js
|
|
80551
|
-
var require_base64_vlq = __commonJS({
|
|
80552
|
-
"../../node_modules/source-map-js/lib/base64-vlq.js"(exports2) {
|
|
80553
|
-
var base643 = require_base64();
|
|
80554
|
-
var VLQ_BASE_SHIFT = 5;
|
|
80555
|
-
var VLQ_BASE = 1 << VLQ_BASE_SHIFT;
|
|
80556
|
-
var VLQ_BASE_MASK = VLQ_BASE - 1;
|
|
80557
|
-
var VLQ_CONTINUATION_BIT = VLQ_BASE;
|
|
80558
|
-
function toVLQSigned(aValue) {
|
|
80559
|
-
return aValue < 0 ? (-aValue << 1) + 1 : (aValue << 1) + 0;
|
|
80560
|
-
}
|
|
80561
|
-
function fromVLQSigned(aValue) {
|
|
80562
|
-
var isNegative = (aValue & 1) === 1;
|
|
80563
|
-
var shifted = aValue >> 1;
|
|
80564
|
-
return isNegative ? -shifted : shifted;
|
|
80565
|
-
}
|
|
80566
|
-
exports2.encode = function base64VLQ_encode(aValue) {
|
|
80567
|
-
var encoded = "";
|
|
80568
|
-
var digit;
|
|
80569
|
-
var vlq = toVLQSigned(aValue);
|
|
80570
|
-
do {
|
|
80571
|
-
digit = vlq & VLQ_BASE_MASK;
|
|
80572
|
-
vlq >>>= VLQ_BASE_SHIFT;
|
|
80573
|
-
if (vlq > 0) {
|
|
80574
|
-
digit |= VLQ_CONTINUATION_BIT;
|
|
80575
|
-
}
|
|
80576
|
-
encoded += base643.encode(digit);
|
|
80577
|
-
} while (vlq > 0);
|
|
80578
|
-
return encoded;
|
|
80579
|
-
};
|
|
80580
|
-
exports2.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) {
|
|
80581
|
-
var strLen = aStr.length;
|
|
80582
|
-
var result = 0;
|
|
80583
|
-
var shift = 0;
|
|
80584
|
-
var continuation, digit;
|
|
80585
|
-
do {
|
|
80586
|
-
if (aIndex >= strLen) {
|
|
80587
|
-
throw new Error("Expected more digits in base 64 VLQ value.");
|
|
80588
|
-
}
|
|
80589
|
-
digit = base643.decode(aStr.charCodeAt(aIndex++));
|
|
80590
|
-
if (digit === -1) {
|
|
80591
|
-
throw new Error("Invalid base64 digit: " + aStr.charAt(aIndex - 1));
|
|
80592
|
-
}
|
|
80593
|
-
continuation = !!(digit & VLQ_CONTINUATION_BIT);
|
|
80594
|
-
digit &= VLQ_BASE_MASK;
|
|
80595
|
-
result = result + (digit << shift);
|
|
80596
|
-
shift += VLQ_BASE_SHIFT;
|
|
80597
|
-
} while (continuation);
|
|
80598
|
-
aOutParam.value = fromVLQSigned(result);
|
|
80599
|
-
aOutParam.rest = aIndex;
|
|
80600
|
-
};
|
|
80601
|
-
}
|
|
80602
|
-
});
|
|
80603
|
-
|
|
80604
|
-
// ../../node_modules/source-map-js/lib/util.js
|
|
80605
|
-
var require_util = __commonJS({
|
|
80606
|
-
"../../node_modules/source-map-js/lib/util.js"(exports2) {
|
|
80607
|
-
function getArg(aArgs, aName, aDefaultValue) {
|
|
80608
|
-
if (aName in aArgs) {
|
|
80609
|
-
return aArgs[aName];
|
|
80610
|
-
} else if (arguments.length === 3) {
|
|
80611
|
-
return aDefaultValue;
|
|
80612
|
-
} else {
|
|
80613
|
-
throw new Error('"' + aName + '" is a required argument.');
|
|
80614
|
-
}
|
|
80615
|
-
}
|
|
80616
|
-
exports2.getArg = getArg;
|
|
80617
|
-
var urlRegexp = /^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.-]*)(?::(\d+))?(.*)$/;
|
|
80618
|
-
var dataUrlRegexp = /^data:.+\,.+$/;
|
|
80619
|
-
function urlParse(aUrl) {
|
|
80620
|
-
var match = aUrl.match(urlRegexp);
|
|
80621
|
-
if (!match) {
|
|
80622
|
-
return null;
|
|
80623
|
-
}
|
|
80624
|
-
return {
|
|
80625
|
-
scheme: match[1],
|
|
80626
|
-
auth: match[2],
|
|
80627
|
-
host: match[3],
|
|
80628
|
-
port: match[4],
|
|
80629
|
-
path: match[5]
|
|
80630
|
-
};
|
|
80631
|
-
}
|
|
80632
|
-
exports2.urlParse = urlParse;
|
|
80633
|
-
function urlGenerate(aParsedUrl) {
|
|
80634
|
-
var url2 = "";
|
|
80635
|
-
if (aParsedUrl.scheme) {
|
|
80636
|
-
url2 += aParsedUrl.scheme + ":";
|
|
80637
|
-
}
|
|
80638
|
-
url2 += "//";
|
|
80639
|
-
if (aParsedUrl.auth) {
|
|
80640
|
-
url2 += aParsedUrl.auth + "@";
|
|
80641
|
-
}
|
|
80642
|
-
if (aParsedUrl.host) {
|
|
80643
|
-
url2 += aParsedUrl.host;
|
|
80644
|
-
}
|
|
80645
|
-
if (aParsedUrl.port) {
|
|
80646
|
-
url2 += ":" + aParsedUrl.port;
|
|
80647
|
-
}
|
|
80648
|
-
if (aParsedUrl.path) {
|
|
80649
|
-
url2 += aParsedUrl.path;
|
|
80650
|
-
}
|
|
80651
|
-
return url2;
|
|
80652
|
-
}
|
|
80653
|
-
exports2.urlGenerate = urlGenerate;
|
|
80654
|
-
var MAX_CACHED_INPUTS = 32;
|
|
80655
|
-
function lruMemoize(f) {
|
|
80656
|
-
var cache4 = [];
|
|
80657
|
-
return function(input) {
|
|
80658
|
-
for (var i = 0; i < cache4.length; i++) {
|
|
80659
|
-
if (cache4[i].input === input) {
|
|
80660
|
-
var temp = cache4[0];
|
|
80661
|
-
cache4[0] = cache4[i];
|
|
80662
|
-
cache4[i] = temp;
|
|
80663
|
-
return cache4[0].result;
|
|
80664
|
-
}
|
|
80665
|
-
}
|
|
80666
|
-
var result = f(input);
|
|
80667
|
-
cache4.unshift({
|
|
80668
|
-
input,
|
|
80669
|
-
result
|
|
80670
|
-
});
|
|
80671
|
-
if (cache4.length > MAX_CACHED_INPUTS) {
|
|
80672
|
-
cache4.pop();
|
|
80673
|
-
}
|
|
80674
|
-
return result;
|
|
80675
|
-
};
|
|
80676
|
-
}
|
|
80677
|
-
var normalize = lruMemoize(function normalize2(aPath) {
|
|
80678
|
-
var path41 = aPath;
|
|
80679
|
-
var url2 = urlParse(aPath);
|
|
80680
|
-
if (url2) {
|
|
80681
|
-
if (!url2.path) {
|
|
80682
|
-
return aPath;
|
|
80683
|
-
}
|
|
80684
|
-
path41 = url2.path;
|
|
80685
|
-
}
|
|
80686
|
-
var isAbsolute6 = exports2.isAbsolute(path41);
|
|
80687
|
-
var parts2 = [];
|
|
80688
|
-
var start2 = 0;
|
|
80689
|
-
var i = 0;
|
|
80690
|
-
while (true) {
|
|
80691
|
-
start2 = i;
|
|
80692
|
-
i = path41.indexOf("/", start2);
|
|
80693
|
-
if (i === -1) {
|
|
80694
|
-
parts2.push(path41.slice(start2));
|
|
80695
|
-
break;
|
|
80696
|
-
} else {
|
|
80697
|
-
parts2.push(path41.slice(start2, i));
|
|
80698
|
-
while (i < path41.length && path41[i] === "/") {
|
|
80699
|
-
i++;
|
|
80700
|
-
}
|
|
80701
|
-
}
|
|
80702
|
-
}
|
|
80703
|
-
for (var part, up = 0, i = parts2.length - 1; i >= 0; i--) {
|
|
80704
|
-
part = parts2[i];
|
|
80705
|
-
if (part === ".") {
|
|
80706
|
-
parts2.splice(i, 1);
|
|
80707
|
-
} else if (part === "..") {
|
|
80708
|
-
up++;
|
|
80709
|
-
} else if (up > 0) {
|
|
80710
|
-
if (part === "") {
|
|
80711
|
-
parts2.splice(i + 1, up);
|
|
80712
|
-
up = 0;
|
|
80713
|
-
} else {
|
|
80714
|
-
parts2.splice(i, 2);
|
|
80715
|
-
up--;
|
|
80716
|
-
}
|
|
80717
|
-
}
|
|
80718
|
-
}
|
|
80719
|
-
path41 = parts2.join("/");
|
|
80720
|
-
if (path41 === "") {
|
|
80721
|
-
path41 = isAbsolute6 ? "/" : ".";
|
|
80722
|
-
}
|
|
80723
|
-
if (url2) {
|
|
80724
|
-
url2.path = path41;
|
|
80725
|
-
return urlGenerate(url2);
|
|
80726
|
-
}
|
|
80727
|
-
return path41;
|
|
80728
|
-
});
|
|
80729
|
-
exports2.normalize = normalize;
|
|
80730
|
-
function join47(aRoot, aPath) {
|
|
80731
|
-
if (aRoot === "") {
|
|
80732
|
-
aRoot = ".";
|
|
80733
|
-
}
|
|
80734
|
-
if (aPath === "") {
|
|
80735
|
-
aPath = ".";
|
|
80736
|
-
}
|
|
80737
|
-
var aPathUrl = urlParse(aPath);
|
|
80738
|
-
var aRootUrl = urlParse(aRoot);
|
|
80739
|
-
if (aRootUrl) {
|
|
80740
|
-
aRoot = aRootUrl.path || "/";
|
|
80741
|
-
}
|
|
80742
|
-
if (aPathUrl && !aPathUrl.scheme) {
|
|
80743
|
-
if (aRootUrl) {
|
|
80744
|
-
aPathUrl.scheme = aRootUrl.scheme;
|
|
80745
|
-
}
|
|
80746
|
-
return urlGenerate(aPathUrl);
|
|
80747
|
-
}
|
|
80748
|
-
if (aPathUrl || aPath.match(dataUrlRegexp)) {
|
|
80749
|
-
return aPath;
|
|
80750
|
-
}
|
|
80751
|
-
if (aRootUrl && !aRootUrl.host && !aRootUrl.path) {
|
|
80752
|
-
aRootUrl.host = aPath;
|
|
80753
|
-
return urlGenerate(aRootUrl);
|
|
80754
|
-
}
|
|
80755
|
-
var joined = aPath.charAt(0) === "/" ? aPath : normalize(aRoot.replace(/\/+$/, "") + "/" + aPath);
|
|
80756
|
-
if (aRootUrl) {
|
|
80757
|
-
aRootUrl.path = joined;
|
|
80758
|
-
return urlGenerate(aRootUrl);
|
|
80759
|
-
}
|
|
80760
|
-
return joined;
|
|
80761
|
-
}
|
|
80762
|
-
exports2.join = join47;
|
|
80763
|
-
exports2.isAbsolute = function(aPath) {
|
|
80764
|
-
return aPath.charAt(0) === "/" || urlRegexp.test(aPath);
|
|
80765
|
-
};
|
|
80766
|
-
function relative3(aRoot, aPath) {
|
|
80767
|
-
if (aRoot === "") {
|
|
80768
|
-
aRoot = ".";
|
|
80769
|
-
}
|
|
80770
|
-
aRoot = aRoot.replace(/\/$/, "");
|
|
80771
|
-
var level = 0;
|
|
80772
|
-
while (aPath.indexOf(aRoot + "/") !== 0) {
|
|
80773
|
-
var index = aRoot.lastIndexOf("/");
|
|
80774
|
-
if (index < 0) {
|
|
80775
|
-
return aPath;
|
|
80776
|
-
}
|
|
80777
|
-
aRoot = aRoot.slice(0, index);
|
|
80778
|
-
if (aRoot.match(/^([^\/]+:\/)?\/*$/)) {
|
|
80779
|
-
return aPath;
|
|
80780
|
-
}
|
|
80781
|
-
++level;
|
|
80782
|
-
}
|
|
80783
|
-
return Array(level + 1).join("../") + aPath.substr(aRoot.length + 1);
|
|
80784
|
-
}
|
|
80785
|
-
exports2.relative = relative3;
|
|
80786
|
-
var supportsNullProto = (function() {
|
|
80787
|
-
var obj = /* @__PURE__ */ Object.create(null);
|
|
80788
|
-
return !("__proto__" in obj);
|
|
80789
|
-
})();
|
|
80790
|
-
function identity2(s) {
|
|
80791
|
-
return s;
|
|
80792
|
-
}
|
|
80793
|
-
function toSetString(aStr) {
|
|
80794
|
-
if (isProtoString(aStr)) {
|
|
80795
|
-
return "$" + aStr;
|
|
80796
|
-
}
|
|
80797
|
-
return aStr;
|
|
80798
|
-
}
|
|
80799
|
-
exports2.toSetString = supportsNullProto ? identity2 : toSetString;
|
|
80800
|
-
function fromSetString(aStr) {
|
|
80801
|
-
if (isProtoString(aStr)) {
|
|
80802
|
-
return aStr.slice(1);
|
|
80803
|
-
}
|
|
80804
|
-
return aStr;
|
|
80805
|
-
}
|
|
80806
|
-
exports2.fromSetString = supportsNullProto ? identity2 : fromSetString;
|
|
80807
|
-
function isProtoString(s) {
|
|
80808
|
-
if (!s) {
|
|
80809
|
-
return false;
|
|
80810
|
-
}
|
|
80811
|
-
var length = s.length;
|
|
80812
|
-
if (length < 9) {
|
|
80813
|
-
return false;
|
|
80814
|
-
}
|
|
80815
|
-
if (s.charCodeAt(length - 1) !== 95 || s.charCodeAt(length - 2) !== 95 || s.charCodeAt(length - 3) !== 111 || s.charCodeAt(length - 4) !== 116 || s.charCodeAt(length - 5) !== 111 || s.charCodeAt(length - 6) !== 114 || s.charCodeAt(length - 7) !== 112 || s.charCodeAt(length - 8) !== 95 || s.charCodeAt(length - 9) !== 95) {
|
|
80816
|
-
return false;
|
|
80817
|
-
}
|
|
80818
|
-
for (var i = length - 10; i >= 0; i--) {
|
|
80819
|
-
if (s.charCodeAt(i) !== 36) {
|
|
80820
|
-
return false;
|
|
80821
|
-
}
|
|
80822
|
-
}
|
|
80823
|
-
return true;
|
|
80824
|
-
}
|
|
80825
|
-
function compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) {
|
|
80826
|
-
var cmp = strcmp(mappingA.source, mappingB.source);
|
|
80827
|
-
if (cmp !== 0) {
|
|
80828
|
-
return cmp;
|
|
80829
|
-
}
|
|
80830
|
-
cmp = mappingA.originalLine - mappingB.originalLine;
|
|
80831
|
-
if (cmp !== 0) {
|
|
80832
|
-
return cmp;
|
|
80833
|
-
}
|
|
80834
|
-
cmp = mappingA.originalColumn - mappingB.originalColumn;
|
|
80835
|
-
if (cmp !== 0 || onlyCompareOriginal) {
|
|
80836
|
-
return cmp;
|
|
80837
|
-
}
|
|
80838
|
-
cmp = mappingA.generatedColumn - mappingB.generatedColumn;
|
|
80839
|
-
if (cmp !== 0) {
|
|
80840
|
-
return cmp;
|
|
80841
|
-
}
|
|
80842
|
-
cmp = mappingA.generatedLine - mappingB.generatedLine;
|
|
80843
|
-
if (cmp !== 0) {
|
|
80844
|
-
return cmp;
|
|
80845
|
-
}
|
|
80846
|
-
return strcmp(mappingA.name, mappingB.name);
|
|
80847
|
-
}
|
|
80848
|
-
exports2.compareByOriginalPositions = compareByOriginalPositions;
|
|
80849
|
-
function compareByOriginalPositionsNoSource(mappingA, mappingB, onlyCompareOriginal) {
|
|
80850
|
-
var cmp;
|
|
80851
|
-
cmp = mappingA.originalLine - mappingB.originalLine;
|
|
80852
|
-
if (cmp !== 0) {
|
|
80853
|
-
return cmp;
|
|
80854
|
-
}
|
|
80855
|
-
cmp = mappingA.originalColumn - mappingB.originalColumn;
|
|
80856
|
-
if (cmp !== 0 || onlyCompareOriginal) {
|
|
80857
|
-
return cmp;
|
|
80858
|
-
}
|
|
80859
|
-
cmp = mappingA.generatedColumn - mappingB.generatedColumn;
|
|
80860
|
-
if (cmp !== 0) {
|
|
80861
|
-
return cmp;
|
|
80862
|
-
}
|
|
80863
|
-
cmp = mappingA.generatedLine - mappingB.generatedLine;
|
|
80864
|
-
if (cmp !== 0) {
|
|
80865
|
-
return cmp;
|
|
80866
|
-
}
|
|
80867
|
-
return strcmp(mappingA.name, mappingB.name);
|
|
80868
|
-
}
|
|
80869
|
-
exports2.compareByOriginalPositionsNoSource = compareByOriginalPositionsNoSource;
|
|
80870
|
-
function compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) {
|
|
80871
|
-
var cmp = mappingA.generatedLine - mappingB.generatedLine;
|
|
80872
|
-
if (cmp !== 0) {
|
|
80873
|
-
return cmp;
|
|
80874
|
-
}
|
|
80875
|
-
cmp = mappingA.generatedColumn - mappingB.generatedColumn;
|
|
80876
|
-
if (cmp !== 0 || onlyCompareGenerated) {
|
|
80877
|
-
return cmp;
|
|
80878
|
-
}
|
|
80879
|
-
cmp = strcmp(mappingA.source, mappingB.source);
|
|
80880
|
-
if (cmp !== 0) {
|
|
80881
|
-
return cmp;
|
|
80882
|
-
}
|
|
80883
|
-
cmp = mappingA.originalLine - mappingB.originalLine;
|
|
80884
|
-
if (cmp !== 0) {
|
|
80885
|
-
return cmp;
|
|
80886
|
-
}
|
|
80887
|
-
cmp = mappingA.originalColumn - mappingB.originalColumn;
|
|
80888
|
-
if (cmp !== 0) {
|
|
80889
|
-
return cmp;
|
|
80890
|
-
}
|
|
80891
|
-
return strcmp(mappingA.name, mappingB.name);
|
|
80892
|
-
}
|
|
80893
|
-
exports2.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated;
|
|
80894
|
-
function compareByGeneratedPositionsDeflatedNoLine(mappingA, mappingB, onlyCompareGenerated) {
|
|
80895
|
-
var cmp = mappingA.generatedColumn - mappingB.generatedColumn;
|
|
80896
|
-
if (cmp !== 0 || onlyCompareGenerated) {
|
|
80897
|
-
return cmp;
|
|
80898
|
-
}
|
|
80899
|
-
cmp = strcmp(mappingA.source, mappingB.source);
|
|
80900
|
-
if (cmp !== 0) {
|
|
80901
|
-
return cmp;
|
|
80902
|
-
}
|
|
80903
|
-
cmp = mappingA.originalLine - mappingB.originalLine;
|
|
80904
|
-
if (cmp !== 0) {
|
|
80905
|
-
return cmp;
|
|
80906
|
-
}
|
|
80907
|
-
cmp = mappingA.originalColumn - mappingB.originalColumn;
|
|
80908
|
-
if (cmp !== 0) {
|
|
80909
|
-
return cmp;
|
|
80910
|
-
}
|
|
80911
|
-
return strcmp(mappingA.name, mappingB.name);
|
|
80912
|
-
}
|
|
80913
|
-
exports2.compareByGeneratedPositionsDeflatedNoLine = compareByGeneratedPositionsDeflatedNoLine;
|
|
80914
|
-
function strcmp(aStr1, aStr2) {
|
|
80915
|
-
if (aStr1 === aStr2) {
|
|
80916
|
-
return 0;
|
|
80917
|
-
}
|
|
80918
|
-
if (aStr1 === null) {
|
|
80919
|
-
return 1;
|
|
80920
|
-
}
|
|
80921
|
-
if (aStr2 === null) {
|
|
80922
|
-
return -1;
|
|
80923
|
-
}
|
|
80924
|
-
if (aStr1 > aStr2) {
|
|
80925
|
-
return 1;
|
|
80926
|
-
}
|
|
80927
|
-
return -1;
|
|
80928
|
-
}
|
|
80929
|
-
function compareByGeneratedPositionsInflated(mappingA, mappingB) {
|
|
80930
|
-
var cmp = mappingA.generatedLine - mappingB.generatedLine;
|
|
80931
|
-
if (cmp !== 0) {
|
|
80932
|
-
return cmp;
|
|
80933
|
-
}
|
|
80934
|
-
cmp = mappingA.generatedColumn - mappingB.generatedColumn;
|
|
80935
|
-
if (cmp !== 0) {
|
|
80936
|
-
return cmp;
|
|
80937
|
-
}
|
|
80938
|
-
cmp = strcmp(mappingA.source, mappingB.source);
|
|
80939
|
-
if (cmp !== 0) {
|
|
80940
|
-
return cmp;
|
|
80941
|
-
}
|
|
80942
|
-
cmp = mappingA.originalLine - mappingB.originalLine;
|
|
80943
|
-
if (cmp !== 0) {
|
|
80944
|
-
return cmp;
|
|
80945
|
-
}
|
|
80946
|
-
cmp = mappingA.originalColumn - mappingB.originalColumn;
|
|
80947
|
-
if (cmp !== 0) {
|
|
80948
|
-
return cmp;
|
|
80949
|
-
}
|
|
80950
|
-
return strcmp(mappingA.name, mappingB.name);
|
|
80951
|
-
}
|
|
80952
|
-
exports2.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated;
|
|
80953
|
-
function parseSourceMapInput(str) {
|
|
80954
|
-
return JSON.parse(str.replace(/^\)]}'[^\n]*\n/, ""));
|
|
80955
|
-
}
|
|
80956
|
-
exports2.parseSourceMapInput = parseSourceMapInput;
|
|
80957
|
-
function computeSourceURL(sourceRoot, sourceURL, sourceMapURL) {
|
|
80958
|
-
sourceURL = sourceURL || "";
|
|
80959
|
-
if (sourceRoot) {
|
|
80960
|
-
if (sourceRoot[sourceRoot.length - 1] !== "/" && sourceURL[0] !== "/") {
|
|
80961
|
-
sourceRoot += "/";
|
|
80962
|
-
}
|
|
80963
|
-
sourceURL = sourceRoot + sourceURL;
|
|
80964
|
-
}
|
|
80965
|
-
if (sourceMapURL) {
|
|
80966
|
-
var parsed = urlParse(sourceMapURL);
|
|
80967
|
-
if (!parsed) {
|
|
80968
|
-
throw new Error("sourceMapURL could not be parsed");
|
|
80969
|
-
}
|
|
80970
|
-
if (parsed.path) {
|
|
80971
|
-
var index = parsed.path.lastIndexOf("/");
|
|
80972
|
-
if (index >= 0) {
|
|
80973
|
-
parsed.path = parsed.path.substring(0, index + 1);
|
|
80974
|
-
}
|
|
80975
|
-
}
|
|
80976
|
-
sourceURL = join47(urlGenerate(parsed), sourceURL);
|
|
80977
|
-
}
|
|
80978
|
-
return normalize(sourceURL);
|
|
80979
|
-
}
|
|
80980
|
-
exports2.computeSourceURL = computeSourceURL;
|
|
80981
|
-
}
|
|
80982
|
-
});
|
|
80983
|
-
|
|
80984
|
-
// ../../node_modules/source-map-js/lib/array-set.js
|
|
80985
|
-
var require_array_set = __commonJS({
|
|
80986
|
-
"../../node_modules/source-map-js/lib/array-set.js"(exports2) {
|
|
80987
|
-
var util = require_util();
|
|
80988
|
-
var has = Object.prototype.hasOwnProperty;
|
|
80989
|
-
var hasNativeMap = typeof Map !== "undefined";
|
|
80990
|
-
function ArraySet() {
|
|
80991
|
-
this._array = [];
|
|
80992
|
-
this._set = hasNativeMap ? /* @__PURE__ */ new Map() : /* @__PURE__ */ Object.create(null);
|
|
80993
|
-
}
|
|
80994
|
-
ArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) {
|
|
80995
|
-
var set2 = new ArraySet();
|
|
80996
|
-
for (var i = 0, len = aArray.length; i < len; i++) {
|
|
80997
|
-
set2.add(aArray[i], aAllowDuplicates);
|
|
80998
|
-
}
|
|
80999
|
-
return set2;
|
|
81000
|
-
};
|
|
81001
|
-
ArraySet.prototype.size = function ArraySet_size() {
|
|
81002
|
-
return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length;
|
|
81003
|
-
};
|
|
81004
|
-
ArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) {
|
|
81005
|
-
var sStr = hasNativeMap ? aStr : util.toSetString(aStr);
|
|
81006
|
-
var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr);
|
|
81007
|
-
var idx = this._array.length;
|
|
81008
|
-
if (!isDuplicate || aAllowDuplicates) {
|
|
81009
|
-
this._array.push(aStr);
|
|
81010
|
-
}
|
|
81011
|
-
if (!isDuplicate) {
|
|
81012
|
-
if (hasNativeMap) {
|
|
81013
|
-
this._set.set(aStr, idx);
|
|
81014
|
-
} else {
|
|
81015
|
-
this._set[sStr] = idx;
|
|
81016
|
-
}
|
|
81017
|
-
}
|
|
81018
|
-
};
|
|
81019
|
-
ArraySet.prototype.has = function ArraySet_has(aStr) {
|
|
81020
|
-
if (hasNativeMap) {
|
|
81021
|
-
return this._set.has(aStr);
|
|
81022
|
-
} else {
|
|
81023
|
-
var sStr = util.toSetString(aStr);
|
|
81024
|
-
return has.call(this._set, sStr);
|
|
81025
|
-
}
|
|
81026
|
-
};
|
|
81027
|
-
ArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) {
|
|
81028
|
-
if (hasNativeMap) {
|
|
81029
|
-
var idx = this._set.get(aStr);
|
|
81030
|
-
if (idx >= 0) {
|
|
81031
|
-
return idx;
|
|
81032
|
-
}
|
|
81033
|
-
} else {
|
|
81034
|
-
var sStr = util.toSetString(aStr);
|
|
81035
|
-
if (has.call(this._set, sStr)) {
|
|
81036
|
-
return this._set[sStr];
|
|
81037
|
-
}
|
|
81038
|
-
}
|
|
81039
|
-
throw new Error('"' + aStr + '" is not in the set.');
|
|
81040
|
-
};
|
|
81041
|
-
ArraySet.prototype.at = function ArraySet_at(aIdx) {
|
|
81042
|
-
if (aIdx >= 0 && aIdx < this._array.length) {
|
|
81043
|
-
return this._array[aIdx];
|
|
81044
|
-
}
|
|
81045
|
-
throw new Error("No element indexed by " + aIdx);
|
|
81046
|
-
};
|
|
81047
|
-
ArraySet.prototype.toArray = function ArraySet_toArray() {
|
|
81048
|
-
return this._array.slice();
|
|
81049
|
-
};
|
|
81050
|
-
exports2.ArraySet = ArraySet;
|
|
81051
|
-
}
|
|
81052
|
-
});
|
|
81053
|
-
|
|
81054
|
-
// ../../node_modules/source-map-js/lib/mapping-list.js
|
|
81055
|
-
var require_mapping_list = __commonJS({
|
|
81056
|
-
"../../node_modules/source-map-js/lib/mapping-list.js"(exports2) {
|
|
81057
|
-
var util = require_util();
|
|
81058
|
-
function generatedPositionAfter(mappingA, mappingB) {
|
|
81059
|
-
var lineA = mappingA.generatedLine;
|
|
81060
|
-
var lineB = mappingB.generatedLine;
|
|
81061
|
-
var columnA = mappingA.generatedColumn;
|
|
81062
|
-
var columnB = mappingB.generatedColumn;
|
|
81063
|
-
return lineB > lineA || lineB == lineA && columnB >= columnA || util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0;
|
|
81064
|
-
}
|
|
81065
|
-
function MappingList() {
|
|
81066
|
-
this._array = [];
|
|
81067
|
-
this._sorted = true;
|
|
81068
|
-
this._last = { generatedLine: -1, generatedColumn: 0 };
|
|
81069
|
-
}
|
|
81070
|
-
MappingList.prototype.unsortedForEach = function MappingList_forEach(aCallback, aThisArg) {
|
|
81071
|
-
this._array.forEach(aCallback, aThisArg);
|
|
81072
|
-
};
|
|
81073
|
-
MappingList.prototype.add = function MappingList_add(aMapping) {
|
|
81074
|
-
if (generatedPositionAfter(this._last, aMapping)) {
|
|
81075
|
-
this._last = aMapping;
|
|
81076
|
-
this._array.push(aMapping);
|
|
81077
|
-
} else {
|
|
81078
|
-
this._sorted = false;
|
|
81079
|
-
this._array.push(aMapping);
|
|
81080
|
-
}
|
|
81081
|
-
};
|
|
81082
|
-
MappingList.prototype.toArray = function MappingList_toArray() {
|
|
81083
|
-
if (!this._sorted) {
|
|
81084
|
-
this._array.sort(util.compareByGeneratedPositionsInflated);
|
|
81085
|
-
this._sorted = true;
|
|
81086
|
-
}
|
|
81087
|
-
return this._array;
|
|
81088
|
-
};
|
|
81089
|
-
exports2.MappingList = MappingList;
|
|
81090
|
-
}
|
|
81091
|
-
});
|
|
81092
|
-
|
|
81093
|
-
// ../../node_modules/source-map-js/lib/source-map-generator.js
|
|
81094
|
-
var require_source_map_generator = __commonJS({
|
|
81095
|
-
"../../node_modules/source-map-js/lib/source-map-generator.js"(exports2) {
|
|
81096
|
-
var base64VLQ = require_base64_vlq();
|
|
81097
|
-
var util = require_util();
|
|
81098
|
-
var ArraySet = require_array_set().ArraySet;
|
|
81099
|
-
var MappingList = require_mapping_list().MappingList;
|
|
81100
|
-
function SourceMapGenerator(aArgs) {
|
|
81101
|
-
if (!aArgs) {
|
|
81102
|
-
aArgs = {};
|
|
81103
|
-
}
|
|
81104
|
-
this._file = util.getArg(aArgs, "file", null);
|
|
81105
|
-
this._sourceRoot = util.getArg(aArgs, "sourceRoot", null);
|
|
81106
|
-
this._skipValidation = util.getArg(aArgs, "skipValidation", false);
|
|
81107
|
-
this._ignoreInvalidMapping = util.getArg(aArgs, "ignoreInvalidMapping", false);
|
|
81108
|
-
this._sources = new ArraySet();
|
|
81109
|
-
this._names = new ArraySet();
|
|
81110
|
-
this._mappings = new MappingList();
|
|
81111
|
-
this._sourcesContents = null;
|
|
81112
|
-
}
|
|
81113
|
-
SourceMapGenerator.prototype._version = 3;
|
|
81114
|
-
SourceMapGenerator.fromSourceMap = function SourceMapGenerator_fromSourceMap(aSourceMapConsumer, generatorOps) {
|
|
81115
|
-
var sourceRoot = aSourceMapConsumer.sourceRoot;
|
|
81116
|
-
var generator = new SourceMapGenerator(Object.assign(generatorOps || {}, {
|
|
81117
|
-
file: aSourceMapConsumer.file,
|
|
81118
|
-
sourceRoot
|
|
81119
|
-
}));
|
|
81120
|
-
aSourceMapConsumer.eachMapping(function(mapping) {
|
|
81121
|
-
var newMapping = {
|
|
81122
|
-
generated: {
|
|
81123
|
-
line: mapping.generatedLine,
|
|
81124
|
-
column: mapping.generatedColumn
|
|
81125
|
-
}
|
|
81126
|
-
};
|
|
81127
|
-
if (mapping.source != null) {
|
|
81128
|
-
newMapping.source = mapping.source;
|
|
81129
|
-
if (sourceRoot != null) {
|
|
81130
|
-
newMapping.source = util.relative(sourceRoot, newMapping.source);
|
|
81131
|
-
}
|
|
81132
|
-
newMapping.original = {
|
|
81133
|
-
line: mapping.originalLine,
|
|
81134
|
-
column: mapping.originalColumn
|
|
81135
|
-
};
|
|
81136
|
-
if (mapping.name != null) {
|
|
81137
|
-
newMapping.name = mapping.name;
|
|
81138
|
-
}
|
|
81139
|
-
}
|
|
81140
|
-
generator.addMapping(newMapping);
|
|
81141
|
-
});
|
|
81142
|
-
aSourceMapConsumer.sources.forEach(function(sourceFile) {
|
|
81143
|
-
var sourceRelative = sourceFile;
|
|
81144
|
-
if (sourceRoot !== null) {
|
|
81145
|
-
sourceRelative = util.relative(sourceRoot, sourceFile);
|
|
81146
|
-
}
|
|
81147
|
-
if (!generator._sources.has(sourceRelative)) {
|
|
81148
|
-
generator._sources.add(sourceRelative);
|
|
81149
|
-
}
|
|
81150
|
-
var content = aSourceMapConsumer.sourceContentFor(sourceFile);
|
|
81151
|
-
if (content != null) {
|
|
81152
|
-
generator.setSourceContent(sourceFile, content);
|
|
81153
|
-
}
|
|
81154
|
-
});
|
|
81155
|
-
return generator;
|
|
81156
|
-
};
|
|
81157
|
-
SourceMapGenerator.prototype.addMapping = function SourceMapGenerator_addMapping(aArgs) {
|
|
81158
|
-
var generated = util.getArg(aArgs, "generated");
|
|
81159
|
-
var original = util.getArg(aArgs, "original", null);
|
|
81160
|
-
var source = util.getArg(aArgs, "source", null);
|
|
81161
|
-
var name = util.getArg(aArgs, "name", null);
|
|
81162
|
-
if (!this._skipValidation) {
|
|
81163
|
-
if (this._validateMapping(generated, original, source, name) === false) {
|
|
81164
|
-
return;
|
|
81165
|
-
}
|
|
81166
|
-
}
|
|
81167
|
-
if (source != null) {
|
|
81168
|
-
source = String(source);
|
|
81169
|
-
if (!this._sources.has(source)) {
|
|
81170
|
-
this._sources.add(source);
|
|
81171
|
-
}
|
|
81172
|
-
}
|
|
81173
|
-
if (name != null) {
|
|
81174
|
-
name = String(name);
|
|
81175
|
-
if (!this._names.has(name)) {
|
|
81176
|
-
this._names.add(name);
|
|
81177
|
-
}
|
|
81178
|
-
}
|
|
81179
|
-
this._mappings.add({
|
|
81180
|
-
generatedLine: generated.line,
|
|
81181
|
-
generatedColumn: generated.column,
|
|
81182
|
-
originalLine: original != null && original.line,
|
|
81183
|
-
originalColumn: original != null && original.column,
|
|
81184
|
-
source,
|
|
81185
|
-
name
|
|
81186
|
-
});
|
|
81187
|
-
};
|
|
81188
|
-
SourceMapGenerator.prototype.setSourceContent = function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) {
|
|
81189
|
-
var source = aSourceFile;
|
|
81190
|
-
if (this._sourceRoot != null) {
|
|
81191
|
-
source = util.relative(this._sourceRoot, source);
|
|
81192
|
-
}
|
|
81193
|
-
if (aSourceContent != null) {
|
|
81194
|
-
if (!this._sourcesContents) {
|
|
81195
|
-
this._sourcesContents = /* @__PURE__ */ Object.create(null);
|
|
81196
|
-
}
|
|
81197
|
-
this._sourcesContents[util.toSetString(source)] = aSourceContent;
|
|
81198
|
-
} else if (this._sourcesContents) {
|
|
81199
|
-
delete this._sourcesContents[util.toSetString(source)];
|
|
81200
|
-
if (Object.keys(this._sourcesContents).length === 0) {
|
|
81201
|
-
this._sourcesContents = null;
|
|
81202
|
-
}
|
|
81203
|
-
}
|
|
81204
|
-
};
|
|
81205
|
-
SourceMapGenerator.prototype.applySourceMap = function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) {
|
|
81206
|
-
var sourceFile = aSourceFile;
|
|
81207
|
-
if (aSourceFile == null) {
|
|
81208
|
-
if (aSourceMapConsumer.file == null) {
|
|
81209
|
-
throw new Error(
|
|
81210
|
-
`SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, or the source map's "file" property. Both were omitted.`
|
|
81211
|
-
);
|
|
81212
|
-
}
|
|
81213
|
-
sourceFile = aSourceMapConsumer.file;
|
|
81214
|
-
}
|
|
81215
|
-
var sourceRoot = this._sourceRoot;
|
|
81216
|
-
if (sourceRoot != null) {
|
|
81217
|
-
sourceFile = util.relative(sourceRoot, sourceFile);
|
|
81218
|
-
}
|
|
81219
|
-
var newSources = new ArraySet();
|
|
81220
|
-
var newNames = new ArraySet();
|
|
81221
|
-
this._mappings.unsortedForEach(function(mapping) {
|
|
81222
|
-
if (mapping.source === sourceFile && mapping.originalLine != null) {
|
|
81223
|
-
var original = aSourceMapConsumer.originalPositionFor({
|
|
81224
|
-
line: mapping.originalLine,
|
|
81225
|
-
column: mapping.originalColumn
|
|
81226
|
-
});
|
|
81227
|
-
if (original.source != null) {
|
|
81228
|
-
mapping.source = original.source;
|
|
81229
|
-
if (aSourceMapPath != null) {
|
|
81230
|
-
mapping.source = util.join(aSourceMapPath, mapping.source);
|
|
81231
|
-
}
|
|
81232
|
-
if (sourceRoot != null) {
|
|
81233
|
-
mapping.source = util.relative(sourceRoot, mapping.source);
|
|
81234
|
-
}
|
|
81235
|
-
mapping.originalLine = original.line;
|
|
81236
|
-
mapping.originalColumn = original.column;
|
|
81237
|
-
if (original.name != null) {
|
|
81238
|
-
mapping.name = original.name;
|
|
81239
|
-
}
|
|
81240
|
-
}
|
|
81241
|
-
}
|
|
81242
|
-
var source = mapping.source;
|
|
81243
|
-
if (source != null && !newSources.has(source)) {
|
|
81244
|
-
newSources.add(source);
|
|
81245
|
-
}
|
|
81246
|
-
var name = mapping.name;
|
|
81247
|
-
if (name != null && !newNames.has(name)) {
|
|
81248
|
-
newNames.add(name);
|
|
81249
|
-
}
|
|
81250
|
-
}, this);
|
|
81251
|
-
this._sources = newSources;
|
|
81252
|
-
this._names = newNames;
|
|
81253
|
-
aSourceMapConsumer.sources.forEach(function(sourceFile2) {
|
|
81254
|
-
var content = aSourceMapConsumer.sourceContentFor(sourceFile2);
|
|
81255
|
-
if (content != null) {
|
|
81256
|
-
if (aSourceMapPath != null) {
|
|
81257
|
-
sourceFile2 = util.join(aSourceMapPath, sourceFile2);
|
|
81258
|
-
}
|
|
81259
|
-
if (sourceRoot != null) {
|
|
81260
|
-
sourceFile2 = util.relative(sourceRoot, sourceFile2);
|
|
81261
|
-
}
|
|
81262
|
-
this.setSourceContent(sourceFile2, content);
|
|
81263
|
-
}
|
|
81264
|
-
}, this);
|
|
81265
|
-
};
|
|
81266
|
-
SourceMapGenerator.prototype._validateMapping = function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource, aName) {
|
|
81267
|
-
if (aOriginal && typeof aOriginal.line !== "number" && typeof aOriginal.column !== "number") {
|
|
81268
|
-
var message = "original.line and original.column are not numbers -- you probably meant to omit the original mapping entirely and only map the generated position. If so, pass null for the original mapping instead of an object with empty or null values.";
|
|
81269
|
-
if (this._ignoreInvalidMapping) {
|
|
81270
|
-
if (typeof console !== "undefined" && console.warn) {
|
|
81271
|
-
console.warn(message);
|
|
81272
|
-
}
|
|
81273
|
-
return false;
|
|
81274
|
-
} else {
|
|
81275
|
-
throw new Error(message);
|
|
81276
|
-
}
|
|
81277
|
-
}
|
|
81278
|
-
if (aGenerated && "line" in aGenerated && "column" in aGenerated && aGenerated.line > 0 && aGenerated.column >= 0 && !aOriginal && !aSource && !aName) {
|
|
81279
|
-
return;
|
|
81280
|
-
} else if (aGenerated && "line" in aGenerated && "column" in aGenerated && aOriginal && "line" in aOriginal && "column" in aOriginal && aGenerated.line > 0 && aGenerated.column >= 0 && aOriginal.line > 0 && aOriginal.column >= 0 && aSource) {
|
|
81281
|
-
return;
|
|
81282
|
-
} else {
|
|
81283
|
-
var message = "Invalid mapping: " + JSON.stringify({
|
|
81284
|
-
generated: aGenerated,
|
|
81285
|
-
source: aSource,
|
|
81286
|
-
original: aOriginal,
|
|
81287
|
-
name: aName
|
|
81288
|
-
});
|
|
81289
|
-
if (this._ignoreInvalidMapping) {
|
|
81290
|
-
if (typeof console !== "undefined" && console.warn) {
|
|
81291
|
-
console.warn(message);
|
|
81292
|
-
}
|
|
81293
|
-
return false;
|
|
81294
|
-
} else {
|
|
81295
|
-
throw new Error(message);
|
|
81296
|
-
}
|
|
81297
|
-
}
|
|
81298
|
-
};
|
|
81299
|
-
SourceMapGenerator.prototype._serializeMappings = function SourceMapGenerator_serializeMappings() {
|
|
81300
|
-
var previousGeneratedColumn = 0;
|
|
81301
|
-
var previousGeneratedLine = 1;
|
|
81302
|
-
var previousOriginalColumn = 0;
|
|
81303
|
-
var previousOriginalLine = 0;
|
|
81304
|
-
var previousName = 0;
|
|
81305
|
-
var previousSource = 0;
|
|
81306
|
-
var result = "";
|
|
81307
|
-
var next;
|
|
81308
|
-
var mapping;
|
|
81309
|
-
var nameIdx;
|
|
81310
|
-
var sourceIdx;
|
|
81311
|
-
var mappings = this._mappings.toArray();
|
|
81312
|
-
for (var i = 0, len = mappings.length; i < len; i++) {
|
|
81313
|
-
mapping = mappings[i];
|
|
81314
|
-
next = "";
|
|
81315
|
-
if (mapping.generatedLine !== previousGeneratedLine) {
|
|
81316
|
-
previousGeneratedColumn = 0;
|
|
81317
|
-
while (mapping.generatedLine !== previousGeneratedLine) {
|
|
81318
|
-
next += ";";
|
|
81319
|
-
previousGeneratedLine++;
|
|
81320
|
-
}
|
|
81321
|
-
} else {
|
|
81322
|
-
if (i > 0) {
|
|
81323
|
-
if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) {
|
|
81324
|
-
continue;
|
|
81325
|
-
}
|
|
81326
|
-
next += ",";
|
|
81327
|
-
}
|
|
81328
|
-
}
|
|
81329
|
-
next += base64VLQ.encode(mapping.generatedColumn - previousGeneratedColumn);
|
|
81330
|
-
previousGeneratedColumn = mapping.generatedColumn;
|
|
81331
|
-
if (mapping.source != null) {
|
|
81332
|
-
sourceIdx = this._sources.indexOf(mapping.source);
|
|
81333
|
-
next += base64VLQ.encode(sourceIdx - previousSource);
|
|
81334
|
-
previousSource = sourceIdx;
|
|
81335
|
-
next += base64VLQ.encode(mapping.originalLine - 1 - previousOriginalLine);
|
|
81336
|
-
previousOriginalLine = mapping.originalLine - 1;
|
|
81337
|
-
next += base64VLQ.encode(mapping.originalColumn - previousOriginalColumn);
|
|
81338
|
-
previousOriginalColumn = mapping.originalColumn;
|
|
81339
|
-
if (mapping.name != null) {
|
|
81340
|
-
nameIdx = this._names.indexOf(mapping.name);
|
|
81341
|
-
next += base64VLQ.encode(nameIdx - previousName);
|
|
81342
|
-
previousName = nameIdx;
|
|
81343
|
-
}
|
|
81344
|
-
}
|
|
81345
|
-
result += next;
|
|
81346
|
-
}
|
|
81347
|
-
return result;
|
|
81348
|
-
};
|
|
81349
|
-
SourceMapGenerator.prototype._generateSourcesContent = function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) {
|
|
81350
|
-
return aSources.map(function(source) {
|
|
81351
|
-
if (!this._sourcesContents) {
|
|
81352
|
-
return null;
|
|
81353
|
-
}
|
|
81354
|
-
if (aSourceRoot != null) {
|
|
81355
|
-
source = util.relative(aSourceRoot, source);
|
|
81356
|
-
}
|
|
81357
|
-
var key2 = util.toSetString(source);
|
|
81358
|
-
return Object.prototype.hasOwnProperty.call(this._sourcesContents, key2) ? this._sourcesContents[key2] : null;
|
|
81359
|
-
}, this);
|
|
81360
|
-
};
|
|
81361
|
-
SourceMapGenerator.prototype.toJSON = function SourceMapGenerator_toJSON() {
|
|
81362
|
-
var map2 = {
|
|
81363
|
-
version: this._version,
|
|
81364
|
-
sources: this._sources.toArray(),
|
|
81365
|
-
names: this._names.toArray(),
|
|
81366
|
-
mappings: this._serializeMappings()
|
|
81367
|
-
};
|
|
81368
|
-
if (this._file != null) {
|
|
81369
|
-
map2.file = this._file;
|
|
81370
|
-
}
|
|
81371
|
-
if (this._sourceRoot != null) {
|
|
81372
|
-
map2.sourceRoot = this._sourceRoot;
|
|
81373
|
-
}
|
|
81374
|
-
if (this._sourcesContents) {
|
|
81375
|
-
map2.sourcesContent = this._generateSourcesContent(map2.sources, map2.sourceRoot);
|
|
81376
|
-
}
|
|
81377
|
-
return map2;
|
|
81378
|
-
};
|
|
81379
|
-
SourceMapGenerator.prototype.toString = function SourceMapGenerator_toString() {
|
|
81380
|
-
return JSON.stringify(this.toJSON());
|
|
81381
|
-
};
|
|
81382
|
-
exports2.SourceMapGenerator = SourceMapGenerator;
|
|
81383
|
-
}
|
|
81384
|
-
});
|
|
81385
|
-
|
|
81386
|
-
// ../../node_modules/source-map-js/lib/binary-search.js
|
|
81387
|
-
var require_binary_search = __commonJS({
|
|
81388
|
-
"../../node_modules/source-map-js/lib/binary-search.js"(exports2) {
|
|
81389
|
-
exports2.GREATEST_LOWER_BOUND = 1;
|
|
81390
|
-
exports2.LEAST_UPPER_BOUND = 2;
|
|
81391
|
-
function recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) {
|
|
81392
|
-
var mid = Math.floor((aHigh - aLow) / 2) + aLow;
|
|
81393
|
-
var cmp = aCompare(aNeedle, aHaystack[mid], true);
|
|
81394
|
-
if (cmp === 0) {
|
|
81395
|
-
return mid;
|
|
81396
|
-
} else if (cmp > 0) {
|
|
81397
|
-
if (aHigh - mid > 1) {
|
|
81398
|
-
return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias);
|
|
81399
|
-
}
|
|
81400
|
-
if (aBias == exports2.LEAST_UPPER_BOUND) {
|
|
81401
|
-
return aHigh < aHaystack.length ? aHigh : -1;
|
|
81402
|
-
} else {
|
|
81403
|
-
return mid;
|
|
81404
|
-
}
|
|
81405
|
-
} else {
|
|
81406
|
-
if (mid - aLow > 1) {
|
|
81407
|
-
return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias);
|
|
81408
|
-
}
|
|
81409
|
-
if (aBias == exports2.LEAST_UPPER_BOUND) {
|
|
81410
|
-
return mid;
|
|
81411
|
-
} else {
|
|
81412
|
-
return aLow < 0 ? -1 : aLow;
|
|
81413
|
-
}
|
|
81414
|
-
}
|
|
81415
|
-
}
|
|
81416
|
-
exports2.search = function search(aNeedle, aHaystack, aCompare, aBias) {
|
|
81417
|
-
if (aHaystack.length === 0) {
|
|
81418
|
-
return -1;
|
|
81419
|
-
}
|
|
81420
|
-
var index = recursiveSearch(
|
|
81421
|
-
-1,
|
|
81422
|
-
aHaystack.length,
|
|
81423
|
-
aNeedle,
|
|
81424
|
-
aHaystack,
|
|
81425
|
-
aCompare,
|
|
81426
|
-
aBias || exports2.GREATEST_LOWER_BOUND
|
|
81427
|
-
);
|
|
81428
|
-
if (index < 0) {
|
|
81429
|
-
return -1;
|
|
81430
|
-
}
|
|
81431
|
-
while (index - 1 >= 0) {
|
|
81432
|
-
if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) {
|
|
81433
|
-
break;
|
|
81434
|
-
}
|
|
81435
|
-
--index;
|
|
81436
|
-
}
|
|
81437
|
-
return index;
|
|
81438
|
-
};
|
|
81439
|
-
}
|
|
81440
|
-
});
|
|
81441
|
-
|
|
81442
|
-
// ../../node_modules/source-map-js/lib/quick-sort.js
|
|
81443
|
-
var require_quick_sort = __commonJS({
|
|
81444
|
-
"../../node_modules/source-map-js/lib/quick-sort.js"(exports2) {
|
|
81445
|
-
function SortTemplate(comparator) {
|
|
81446
|
-
function swap(ary, x, y) {
|
|
81447
|
-
var temp = ary[x];
|
|
81448
|
-
ary[x] = ary[y];
|
|
81449
|
-
ary[y] = temp;
|
|
81450
|
-
}
|
|
81451
|
-
function randomIntInRange(low, high) {
|
|
81452
|
-
return Math.round(low + Math.random() * (high - low));
|
|
81453
|
-
}
|
|
81454
|
-
function doQuickSort(ary, comparator2, p, r) {
|
|
81455
|
-
if (p < r) {
|
|
81456
|
-
var pivotIndex = randomIntInRange(p, r);
|
|
81457
|
-
var i = p - 1;
|
|
81458
|
-
swap(ary, pivotIndex, r);
|
|
81459
|
-
var pivot = ary[r];
|
|
81460
|
-
for (var j = p; j < r; j++) {
|
|
81461
|
-
if (comparator2(ary[j], pivot, false) <= 0) {
|
|
81462
|
-
i += 1;
|
|
81463
|
-
swap(ary, i, j);
|
|
81464
|
-
}
|
|
81465
|
-
}
|
|
81466
|
-
swap(ary, i + 1, j);
|
|
81467
|
-
var q = i + 1;
|
|
81468
|
-
doQuickSort(ary, comparator2, p, q - 1);
|
|
81469
|
-
doQuickSort(ary, comparator2, q + 1, r);
|
|
81470
|
-
}
|
|
81471
|
-
}
|
|
81472
|
-
return doQuickSort;
|
|
81473
|
-
}
|
|
81474
|
-
function cloneSort(comparator) {
|
|
81475
|
-
let template = SortTemplate.toString();
|
|
81476
|
-
let templateFn = new Function(`return ${template}`)();
|
|
81477
|
-
return templateFn(comparator);
|
|
81478
|
-
}
|
|
81479
|
-
var sortCache = /* @__PURE__ */ new WeakMap();
|
|
81480
|
-
exports2.quickSort = function(ary, comparator, start2 = 0) {
|
|
81481
|
-
let doQuickSort = sortCache.get(comparator);
|
|
81482
|
-
if (doQuickSort === void 0) {
|
|
81483
|
-
doQuickSort = cloneSort(comparator);
|
|
81484
|
-
sortCache.set(comparator, doQuickSort);
|
|
81485
|
-
}
|
|
81486
|
-
doQuickSort(ary, comparator, start2, ary.length - 1);
|
|
81487
|
-
};
|
|
81488
|
-
}
|
|
81489
|
-
});
|
|
81490
|
-
|
|
81491
|
-
// ../../node_modules/source-map-js/lib/source-map-consumer.js
|
|
81492
|
-
var require_source_map_consumer = __commonJS({
|
|
81493
|
-
"../../node_modules/source-map-js/lib/source-map-consumer.js"(exports2) {
|
|
81494
|
-
var util = require_util();
|
|
81495
|
-
var binarySearch = require_binary_search();
|
|
81496
|
-
var ArraySet = require_array_set().ArraySet;
|
|
81497
|
-
var base64VLQ = require_base64_vlq();
|
|
81498
|
-
var quickSort = require_quick_sort().quickSort;
|
|
81499
|
-
function SourceMapConsumer2(aSourceMap, aSourceMapURL) {
|
|
81500
|
-
var sourceMap = aSourceMap;
|
|
81501
|
-
if (typeof aSourceMap === "string") {
|
|
81502
|
-
sourceMap = util.parseSourceMapInput(aSourceMap);
|
|
81503
|
-
}
|
|
81504
|
-
return sourceMap.sections != null ? new IndexedSourceMapConsumer(sourceMap, aSourceMapURL) : new BasicSourceMapConsumer(sourceMap, aSourceMapURL);
|
|
81505
|
-
}
|
|
81506
|
-
SourceMapConsumer2.fromSourceMap = function(aSourceMap, aSourceMapURL) {
|
|
81507
|
-
return BasicSourceMapConsumer.fromSourceMap(aSourceMap, aSourceMapURL);
|
|
81508
|
-
};
|
|
81509
|
-
SourceMapConsumer2.prototype._version = 3;
|
|
81510
|
-
SourceMapConsumer2.prototype.__generatedMappings = null;
|
|
81511
|
-
Object.defineProperty(SourceMapConsumer2.prototype, "_generatedMappings", {
|
|
81512
|
-
configurable: true,
|
|
81513
|
-
enumerable: true,
|
|
81514
|
-
get: function() {
|
|
81515
|
-
if (!this.__generatedMappings) {
|
|
81516
|
-
this._parseMappings(this._mappings, this.sourceRoot);
|
|
81517
|
-
}
|
|
81518
|
-
return this.__generatedMappings;
|
|
81519
|
-
}
|
|
81520
|
-
});
|
|
81521
|
-
SourceMapConsumer2.prototype.__originalMappings = null;
|
|
81522
|
-
Object.defineProperty(SourceMapConsumer2.prototype, "_originalMappings", {
|
|
81523
|
-
configurable: true,
|
|
81524
|
-
enumerable: true,
|
|
81525
|
-
get: function() {
|
|
81526
|
-
if (!this.__originalMappings) {
|
|
81527
|
-
this._parseMappings(this._mappings, this.sourceRoot);
|
|
81528
|
-
}
|
|
81529
|
-
return this.__originalMappings;
|
|
81530
|
-
}
|
|
81531
|
-
});
|
|
81532
|
-
SourceMapConsumer2.prototype._charIsMappingSeparator = function SourceMapConsumer_charIsMappingSeparator(aStr, index) {
|
|
81533
|
-
var c = aStr.charAt(index);
|
|
81534
|
-
return c === ";" || c === ",";
|
|
81535
|
-
};
|
|
81536
|
-
SourceMapConsumer2.prototype._parseMappings = function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {
|
|
81537
|
-
throw new Error("Subclasses must implement _parseMappings");
|
|
81538
|
-
};
|
|
81539
|
-
SourceMapConsumer2.GENERATED_ORDER = 1;
|
|
81540
|
-
SourceMapConsumer2.ORIGINAL_ORDER = 2;
|
|
81541
|
-
SourceMapConsumer2.GREATEST_LOWER_BOUND = 1;
|
|
81542
|
-
SourceMapConsumer2.LEAST_UPPER_BOUND = 2;
|
|
81543
|
-
SourceMapConsumer2.prototype.eachMapping = function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) {
|
|
81544
|
-
var context2 = aContext || null;
|
|
81545
|
-
var order = aOrder || SourceMapConsumer2.GENERATED_ORDER;
|
|
81546
|
-
var mappings;
|
|
81547
|
-
switch (order) {
|
|
81548
|
-
case SourceMapConsumer2.GENERATED_ORDER:
|
|
81549
|
-
mappings = this._generatedMappings;
|
|
81550
|
-
break;
|
|
81551
|
-
case SourceMapConsumer2.ORIGINAL_ORDER:
|
|
81552
|
-
mappings = this._originalMappings;
|
|
81553
|
-
break;
|
|
81554
|
-
default:
|
|
81555
|
-
throw new Error("Unknown order of iteration.");
|
|
81556
|
-
}
|
|
81557
|
-
var sourceRoot = this.sourceRoot;
|
|
81558
|
-
var boundCallback = aCallback.bind(context2);
|
|
81559
|
-
var names = this._names;
|
|
81560
|
-
var sources = this._sources;
|
|
81561
|
-
var sourceMapURL = this._sourceMapURL;
|
|
81562
|
-
for (var i = 0, n = mappings.length; i < n; i++) {
|
|
81563
|
-
var mapping = mappings[i];
|
|
81564
|
-
var source = mapping.source === null ? null : sources.at(mapping.source);
|
|
81565
|
-
if (source !== null) {
|
|
81566
|
-
source = util.computeSourceURL(sourceRoot, source, sourceMapURL);
|
|
81567
|
-
}
|
|
81568
|
-
boundCallback({
|
|
81569
|
-
source,
|
|
81570
|
-
generatedLine: mapping.generatedLine,
|
|
81571
|
-
generatedColumn: mapping.generatedColumn,
|
|
81572
|
-
originalLine: mapping.originalLine,
|
|
81573
|
-
originalColumn: mapping.originalColumn,
|
|
81574
|
-
name: mapping.name === null ? null : names.at(mapping.name)
|
|
81575
|
-
});
|
|
81576
|
-
}
|
|
81577
|
-
};
|
|
81578
|
-
SourceMapConsumer2.prototype.allGeneratedPositionsFor = function SourceMapConsumer_allGeneratedPositionsFor(aArgs) {
|
|
81579
|
-
var line = util.getArg(aArgs, "line");
|
|
81580
|
-
var needle = {
|
|
81581
|
-
source: util.getArg(aArgs, "source"),
|
|
81582
|
-
originalLine: line,
|
|
81583
|
-
originalColumn: util.getArg(aArgs, "column", 0)
|
|
81584
|
-
};
|
|
81585
|
-
needle.source = this._findSourceIndex(needle.source);
|
|
81586
|
-
if (needle.source < 0) {
|
|
81587
|
-
return [];
|
|
81588
|
-
}
|
|
81589
|
-
var mappings = [];
|
|
81590
|
-
var index = this._findMapping(
|
|
81591
|
-
needle,
|
|
81592
|
-
this._originalMappings,
|
|
81593
|
-
"originalLine",
|
|
81594
|
-
"originalColumn",
|
|
81595
|
-
util.compareByOriginalPositions,
|
|
81596
|
-
binarySearch.LEAST_UPPER_BOUND
|
|
81597
|
-
);
|
|
81598
|
-
if (index >= 0) {
|
|
81599
|
-
var mapping = this._originalMappings[index];
|
|
81600
|
-
if (aArgs.column === void 0) {
|
|
81601
|
-
var originalLine = mapping.originalLine;
|
|
81602
|
-
while (mapping && mapping.originalLine === originalLine) {
|
|
81603
|
-
mappings.push({
|
|
81604
|
-
line: util.getArg(mapping, "generatedLine", null),
|
|
81605
|
-
column: util.getArg(mapping, "generatedColumn", null),
|
|
81606
|
-
lastColumn: util.getArg(mapping, "lastGeneratedColumn", null)
|
|
81607
|
-
});
|
|
81608
|
-
mapping = this._originalMappings[++index];
|
|
81609
|
-
}
|
|
81610
|
-
} else {
|
|
81611
|
-
var originalColumn = mapping.originalColumn;
|
|
81612
|
-
while (mapping && mapping.originalLine === line && mapping.originalColumn == originalColumn) {
|
|
81613
|
-
mappings.push({
|
|
81614
|
-
line: util.getArg(mapping, "generatedLine", null),
|
|
81615
|
-
column: util.getArg(mapping, "generatedColumn", null),
|
|
81616
|
-
lastColumn: util.getArg(mapping, "lastGeneratedColumn", null)
|
|
81617
|
-
});
|
|
81618
|
-
mapping = this._originalMappings[++index];
|
|
81619
|
-
}
|
|
81620
|
-
}
|
|
81621
|
-
}
|
|
81622
|
-
return mappings;
|
|
81623
|
-
};
|
|
81624
|
-
exports2.SourceMapConsumer = SourceMapConsumer2;
|
|
81625
|
-
function BasicSourceMapConsumer(aSourceMap, aSourceMapURL) {
|
|
81626
|
-
var sourceMap = aSourceMap;
|
|
81627
|
-
if (typeof aSourceMap === "string") {
|
|
81628
|
-
sourceMap = util.parseSourceMapInput(aSourceMap);
|
|
81629
|
-
}
|
|
81630
|
-
var version3 = util.getArg(sourceMap, "version");
|
|
81631
|
-
var sources = util.getArg(sourceMap, "sources");
|
|
81632
|
-
var names = util.getArg(sourceMap, "names", []);
|
|
81633
|
-
var sourceRoot = util.getArg(sourceMap, "sourceRoot", null);
|
|
81634
|
-
var sourcesContent = util.getArg(sourceMap, "sourcesContent", null);
|
|
81635
|
-
var mappings = util.getArg(sourceMap, "mappings");
|
|
81636
|
-
var file2 = util.getArg(sourceMap, "file", null);
|
|
81637
|
-
if (version3 != this._version) {
|
|
81638
|
-
throw new Error("Unsupported version: " + version3);
|
|
81639
|
-
}
|
|
81640
|
-
if (sourceRoot) {
|
|
81641
|
-
sourceRoot = util.normalize(sourceRoot);
|
|
81642
|
-
}
|
|
81643
|
-
sources = sources.map(String).map(util.normalize).map(function(source) {
|
|
81644
|
-
return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source) ? util.relative(sourceRoot, source) : source;
|
|
81645
|
-
});
|
|
81646
|
-
this._names = ArraySet.fromArray(names.map(String), true);
|
|
81647
|
-
this._sources = ArraySet.fromArray(sources, true);
|
|
81648
|
-
this._absoluteSources = this._sources.toArray().map(function(s) {
|
|
81649
|
-
return util.computeSourceURL(sourceRoot, s, aSourceMapURL);
|
|
81650
|
-
});
|
|
81651
|
-
this.sourceRoot = sourceRoot;
|
|
81652
|
-
this.sourcesContent = sourcesContent;
|
|
81653
|
-
this._mappings = mappings;
|
|
81654
|
-
this._sourceMapURL = aSourceMapURL;
|
|
81655
|
-
this.file = file2;
|
|
81656
|
-
}
|
|
81657
|
-
BasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer2.prototype);
|
|
81658
|
-
BasicSourceMapConsumer.prototype.consumer = SourceMapConsumer2;
|
|
81659
|
-
BasicSourceMapConsumer.prototype._findSourceIndex = function(aSource) {
|
|
81660
|
-
var relativeSource = aSource;
|
|
81661
|
-
if (this.sourceRoot != null) {
|
|
81662
|
-
relativeSource = util.relative(this.sourceRoot, relativeSource);
|
|
81663
|
-
}
|
|
81664
|
-
if (this._sources.has(relativeSource)) {
|
|
81665
|
-
return this._sources.indexOf(relativeSource);
|
|
81666
|
-
}
|
|
81667
|
-
var i;
|
|
81668
|
-
for (i = 0; i < this._absoluteSources.length; ++i) {
|
|
81669
|
-
if (this._absoluteSources[i] == aSource) {
|
|
81670
|
-
return i;
|
|
81671
|
-
}
|
|
81672
|
-
}
|
|
81673
|
-
return -1;
|
|
81674
|
-
};
|
|
81675
|
-
BasicSourceMapConsumer.fromSourceMap = function SourceMapConsumer_fromSourceMap(aSourceMap, aSourceMapURL) {
|
|
81676
|
-
var smc = Object.create(BasicSourceMapConsumer.prototype);
|
|
81677
|
-
var names = smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true);
|
|
81678
|
-
var sources = smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true);
|
|
81679
|
-
smc.sourceRoot = aSourceMap._sourceRoot;
|
|
81680
|
-
smc.sourcesContent = aSourceMap._generateSourcesContent(
|
|
81681
|
-
smc._sources.toArray(),
|
|
81682
|
-
smc.sourceRoot
|
|
81683
|
-
);
|
|
81684
|
-
smc.file = aSourceMap._file;
|
|
81685
|
-
smc._sourceMapURL = aSourceMapURL;
|
|
81686
|
-
smc._absoluteSources = smc._sources.toArray().map(function(s) {
|
|
81687
|
-
return util.computeSourceURL(smc.sourceRoot, s, aSourceMapURL);
|
|
81688
|
-
});
|
|
81689
|
-
var generatedMappings = aSourceMap._mappings.toArray().slice();
|
|
81690
|
-
var destGeneratedMappings = smc.__generatedMappings = [];
|
|
81691
|
-
var destOriginalMappings = smc.__originalMappings = [];
|
|
81692
|
-
for (var i = 0, length = generatedMappings.length; i < length; i++) {
|
|
81693
|
-
var srcMapping = generatedMappings[i];
|
|
81694
|
-
var destMapping = new Mapping();
|
|
81695
|
-
destMapping.generatedLine = srcMapping.generatedLine;
|
|
81696
|
-
destMapping.generatedColumn = srcMapping.generatedColumn;
|
|
81697
|
-
if (srcMapping.source) {
|
|
81698
|
-
destMapping.source = sources.indexOf(srcMapping.source);
|
|
81699
|
-
destMapping.originalLine = srcMapping.originalLine;
|
|
81700
|
-
destMapping.originalColumn = srcMapping.originalColumn;
|
|
81701
|
-
if (srcMapping.name) {
|
|
81702
|
-
destMapping.name = names.indexOf(srcMapping.name);
|
|
81703
|
-
}
|
|
81704
|
-
destOriginalMappings.push(destMapping);
|
|
81705
|
-
}
|
|
81706
|
-
destGeneratedMappings.push(destMapping);
|
|
81707
|
-
}
|
|
81708
|
-
quickSort(smc.__originalMappings, util.compareByOriginalPositions);
|
|
81709
|
-
return smc;
|
|
81710
|
-
};
|
|
81711
|
-
BasicSourceMapConsumer.prototype._version = 3;
|
|
81712
|
-
Object.defineProperty(BasicSourceMapConsumer.prototype, "sources", {
|
|
81713
|
-
get: function() {
|
|
81714
|
-
return this._absoluteSources.slice();
|
|
81715
|
-
}
|
|
81716
|
-
});
|
|
81717
|
-
function Mapping() {
|
|
81718
|
-
this.generatedLine = 0;
|
|
81719
|
-
this.generatedColumn = 0;
|
|
81720
|
-
this.source = null;
|
|
81721
|
-
this.originalLine = null;
|
|
81722
|
-
this.originalColumn = null;
|
|
81723
|
-
this.name = null;
|
|
81724
|
-
}
|
|
81725
|
-
var compareGenerated = util.compareByGeneratedPositionsDeflatedNoLine;
|
|
81726
|
-
function sortGenerated(array2, start2) {
|
|
81727
|
-
let l = array2.length;
|
|
81728
|
-
let n = array2.length - start2;
|
|
81729
|
-
if (n <= 1) {
|
|
81730
|
-
return;
|
|
81731
|
-
} else if (n == 2) {
|
|
81732
|
-
let a = array2[start2];
|
|
81733
|
-
let b = array2[start2 + 1];
|
|
81734
|
-
if (compareGenerated(a, b) > 0) {
|
|
81735
|
-
array2[start2] = b;
|
|
81736
|
-
array2[start2 + 1] = a;
|
|
81737
|
-
}
|
|
81738
|
-
} else if (n < 20) {
|
|
81739
|
-
for (let i = start2; i < l; i++) {
|
|
81740
|
-
for (let j = i; j > start2; j--) {
|
|
81741
|
-
let a = array2[j - 1];
|
|
81742
|
-
let b = array2[j];
|
|
81743
|
-
if (compareGenerated(a, b) <= 0) {
|
|
81744
|
-
break;
|
|
81745
|
-
}
|
|
81746
|
-
array2[j - 1] = b;
|
|
81747
|
-
array2[j] = a;
|
|
81748
|
-
}
|
|
81749
|
-
}
|
|
81750
|
-
} else {
|
|
81751
|
-
quickSort(array2, compareGenerated, start2);
|
|
81752
|
-
}
|
|
81753
|
-
}
|
|
81754
|
-
BasicSourceMapConsumer.prototype._parseMappings = function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {
|
|
81755
|
-
var generatedLine = 1;
|
|
81756
|
-
var previousGeneratedColumn = 0;
|
|
81757
|
-
var previousOriginalLine = 0;
|
|
81758
|
-
var previousOriginalColumn = 0;
|
|
81759
|
-
var previousSource = 0;
|
|
81760
|
-
var previousName = 0;
|
|
81761
|
-
var length = aStr.length;
|
|
81762
|
-
var index = 0;
|
|
81763
|
-
var cachedSegments = {};
|
|
81764
|
-
var temp = {};
|
|
81765
|
-
var originalMappings = [];
|
|
81766
|
-
var generatedMappings = [];
|
|
81767
|
-
var mapping, str, segment, end, value;
|
|
81768
|
-
let subarrayStart = 0;
|
|
81769
|
-
while (index < length) {
|
|
81770
|
-
if (aStr.charAt(index) === ";") {
|
|
81771
|
-
generatedLine++;
|
|
81772
|
-
index++;
|
|
81773
|
-
previousGeneratedColumn = 0;
|
|
81774
|
-
sortGenerated(generatedMappings, subarrayStart);
|
|
81775
|
-
subarrayStart = generatedMappings.length;
|
|
81776
|
-
} else if (aStr.charAt(index) === ",") {
|
|
81777
|
-
index++;
|
|
81778
|
-
} else {
|
|
81779
|
-
mapping = new Mapping();
|
|
81780
|
-
mapping.generatedLine = generatedLine;
|
|
81781
|
-
for (end = index; end < length; end++) {
|
|
81782
|
-
if (this._charIsMappingSeparator(aStr, end)) {
|
|
81783
|
-
break;
|
|
81784
|
-
}
|
|
81785
|
-
}
|
|
81786
|
-
str = aStr.slice(index, end);
|
|
81787
|
-
segment = [];
|
|
81788
|
-
while (index < end) {
|
|
81789
|
-
base64VLQ.decode(aStr, index, temp);
|
|
81790
|
-
value = temp.value;
|
|
81791
|
-
index = temp.rest;
|
|
81792
|
-
segment.push(value);
|
|
81793
|
-
}
|
|
81794
|
-
if (segment.length === 2) {
|
|
81795
|
-
throw new Error("Found a source, but no line and column");
|
|
81796
|
-
}
|
|
81797
|
-
if (segment.length === 3) {
|
|
81798
|
-
throw new Error("Found a source and line, but no column");
|
|
81799
|
-
}
|
|
81800
|
-
mapping.generatedColumn = previousGeneratedColumn + segment[0];
|
|
81801
|
-
previousGeneratedColumn = mapping.generatedColumn;
|
|
81802
|
-
if (segment.length > 1) {
|
|
81803
|
-
mapping.source = previousSource + segment[1];
|
|
81804
|
-
previousSource += segment[1];
|
|
81805
|
-
mapping.originalLine = previousOriginalLine + segment[2];
|
|
81806
|
-
previousOriginalLine = mapping.originalLine;
|
|
81807
|
-
mapping.originalLine += 1;
|
|
81808
|
-
mapping.originalColumn = previousOriginalColumn + segment[3];
|
|
81809
|
-
previousOriginalColumn = mapping.originalColumn;
|
|
81810
|
-
if (segment.length > 4) {
|
|
81811
|
-
mapping.name = previousName + segment[4];
|
|
81812
|
-
previousName += segment[4];
|
|
81813
|
-
}
|
|
81814
|
-
}
|
|
81815
|
-
generatedMappings.push(mapping);
|
|
81816
|
-
if (typeof mapping.originalLine === "number") {
|
|
81817
|
-
let currentSource = mapping.source;
|
|
81818
|
-
while (originalMappings.length <= currentSource) {
|
|
81819
|
-
originalMappings.push(null);
|
|
81820
|
-
}
|
|
81821
|
-
if (originalMappings[currentSource] === null) {
|
|
81822
|
-
originalMappings[currentSource] = [];
|
|
81823
|
-
}
|
|
81824
|
-
originalMappings[currentSource].push(mapping);
|
|
81825
|
-
}
|
|
81826
|
-
}
|
|
81827
|
-
}
|
|
81828
|
-
sortGenerated(generatedMappings, subarrayStart);
|
|
81829
|
-
this.__generatedMappings = generatedMappings;
|
|
81830
|
-
for (var i = 0; i < originalMappings.length; i++) {
|
|
81831
|
-
if (originalMappings[i] != null) {
|
|
81832
|
-
quickSort(originalMappings[i], util.compareByOriginalPositionsNoSource);
|
|
81833
|
-
}
|
|
81834
|
-
}
|
|
81835
|
-
this.__originalMappings = [].concat(...originalMappings);
|
|
81836
|
-
};
|
|
81837
|
-
BasicSourceMapConsumer.prototype._findMapping = function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName, aColumnName, aComparator, aBias) {
|
|
81838
|
-
if (aNeedle[aLineName] <= 0) {
|
|
81839
|
-
throw new TypeError("Line must be greater than or equal to 1, got " + aNeedle[aLineName]);
|
|
81840
|
-
}
|
|
81841
|
-
if (aNeedle[aColumnName] < 0) {
|
|
81842
|
-
throw new TypeError("Column must be greater than or equal to 0, got " + aNeedle[aColumnName]);
|
|
81843
|
-
}
|
|
81844
|
-
return binarySearch.search(aNeedle, aMappings, aComparator, aBias);
|
|
81845
|
-
};
|
|
81846
|
-
BasicSourceMapConsumer.prototype.computeColumnSpans = function SourceMapConsumer_computeColumnSpans() {
|
|
81847
|
-
for (var index = 0; index < this._generatedMappings.length; ++index) {
|
|
81848
|
-
var mapping = this._generatedMappings[index];
|
|
81849
|
-
if (index + 1 < this._generatedMappings.length) {
|
|
81850
|
-
var nextMapping = this._generatedMappings[index + 1];
|
|
81851
|
-
if (mapping.generatedLine === nextMapping.generatedLine) {
|
|
81852
|
-
mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1;
|
|
81853
|
-
continue;
|
|
81854
|
-
}
|
|
81855
|
-
}
|
|
81856
|
-
mapping.lastGeneratedColumn = Infinity;
|
|
81857
|
-
}
|
|
81858
|
-
};
|
|
81859
|
-
BasicSourceMapConsumer.prototype.originalPositionFor = function SourceMapConsumer_originalPositionFor(aArgs) {
|
|
81860
|
-
var needle = {
|
|
81861
|
-
generatedLine: util.getArg(aArgs, "line"),
|
|
81862
|
-
generatedColumn: util.getArg(aArgs, "column")
|
|
81863
|
-
};
|
|
81864
|
-
var index = this._findMapping(
|
|
81865
|
-
needle,
|
|
81866
|
-
this._generatedMappings,
|
|
81867
|
-
"generatedLine",
|
|
81868
|
-
"generatedColumn",
|
|
81869
|
-
util.compareByGeneratedPositionsDeflated,
|
|
81870
|
-
util.getArg(aArgs, "bias", SourceMapConsumer2.GREATEST_LOWER_BOUND)
|
|
81871
|
-
);
|
|
81872
|
-
if (index >= 0) {
|
|
81873
|
-
var mapping = this._generatedMappings[index];
|
|
81874
|
-
if (mapping.generatedLine === needle.generatedLine) {
|
|
81875
|
-
var source = util.getArg(mapping, "source", null);
|
|
81876
|
-
if (source !== null) {
|
|
81877
|
-
source = this._sources.at(source);
|
|
81878
|
-
source = util.computeSourceURL(this.sourceRoot, source, this._sourceMapURL);
|
|
81879
|
-
}
|
|
81880
|
-
var name = util.getArg(mapping, "name", null);
|
|
81881
|
-
if (name !== null) {
|
|
81882
|
-
name = this._names.at(name);
|
|
81883
|
-
}
|
|
81884
|
-
return {
|
|
81885
|
-
source,
|
|
81886
|
-
line: util.getArg(mapping, "originalLine", null),
|
|
81887
|
-
column: util.getArg(mapping, "originalColumn", null),
|
|
81888
|
-
name
|
|
81889
|
-
};
|
|
81890
|
-
}
|
|
81891
|
-
}
|
|
81892
|
-
return {
|
|
81893
|
-
source: null,
|
|
81894
|
-
line: null,
|
|
81895
|
-
column: null,
|
|
81896
|
-
name: null
|
|
81897
|
-
};
|
|
81898
|
-
};
|
|
81899
|
-
BasicSourceMapConsumer.prototype.hasContentsOfAllSources = function BasicSourceMapConsumer_hasContentsOfAllSources() {
|
|
81900
|
-
if (!this.sourcesContent) {
|
|
81901
|
-
return false;
|
|
81902
|
-
}
|
|
81903
|
-
return this.sourcesContent.length >= this._sources.size() && !this.sourcesContent.some(function(sc) {
|
|
81904
|
-
return sc == null;
|
|
81905
|
-
});
|
|
81906
|
-
};
|
|
81907
|
-
BasicSourceMapConsumer.prototype.sourceContentFor = function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {
|
|
81908
|
-
if (!this.sourcesContent) {
|
|
81909
|
-
return null;
|
|
81910
|
-
}
|
|
81911
|
-
var index = this._findSourceIndex(aSource);
|
|
81912
|
-
if (index >= 0) {
|
|
81913
|
-
return this.sourcesContent[index];
|
|
81914
|
-
}
|
|
81915
|
-
var relativeSource = aSource;
|
|
81916
|
-
if (this.sourceRoot != null) {
|
|
81917
|
-
relativeSource = util.relative(this.sourceRoot, relativeSource);
|
|
81918
|
-
}
|
|
81919
|
-
var url2;
|
|
81920
|
-
if (this.sourceRoot != null && (url2 = util.urlParse(this.sourceRoot))) {
|
|
81921
|
-
var fileUriAbsPath = relativeSource.replace(/^file:\/\//, "");
|
|
81922
|
-
if (url2.scheme == "file" && this._sources.has(fileUriAbsPath)) {
|
|
81923
|
-
return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)];
|
|
81924
|
-
}
|
|
81925
|
-
if ((!url2.path || url2.path == "/") && this._sources.has("/" + relativeSource)) {
|
|
81926
|
-
return this.sourcesContent[this._sources.indexOf("/" + relativeSource)];
|
|
81927
|
-
}
|
|
81928
|
-
}
|
|
81929
|
-
if (nullOnMissing) {
|
|
81930
|
-
return null;
|
|
81931
|
-
} else {
|
|
81932
|
-
throw new Error('"' + relativeSource + '" is not in the SourceMap.');
|
|
81933
|
-
}
|
|
81934
|
-
};
|
|
81935
|
-
BasicSourceMapConsumer.prototype.generatedPositionFor = function SourceMapConsumer_generatedPositionFor(aArgs) {
|
|
81936
|
-
var source = util.getArg(aArgs, "source");
|
|
81937
|
-
source = this._findSourceIndex(source);
|
|
81938
|
-
if (source < 0) {
|
|
81939
|
-
return {
|
|
81940
|
-
line: null,
|
|
81941
|
-
column: null,
|
|
81942
|
-
lastColumn: null
|
|
81943
|
-
};
|
|
81944
|
-
}
|
|
81945
|
-
var needle = {
|
|
81946
|
-
source,
|
|
81947
|
-
originalLine: util.getArg(aArgs, "line"),
|
|
81948
|
-
originalColumn: util.getArg(aArgs, "column")
|
|
81949
|
-
};
|
|
81950
|
-
var index = this._findMapping(
|
|
81951
|
-
needle,
|
|
81952
|
-
this._originalMappings,
|
|
81953
|
-
"originalLine",
|
|
81954
|
-
"originalColumn",
|
|
81955
|
-
util.compareByOriginalPositions,
|
|
81956
|
-
util.getArg(aArgs, "bias", SourceMapConsumer2.GREATEST_LOWER_BOUND)
|
|
81957
|
-
);
|
|
81958
|
-
if (index >= 0) {
|
|
81959
|
-
var mapping = this._originalMappings[index];
|
|
81960
|
-
if (mapping.source === needle.source) {
|
|
81961
|
-
return {
|
|
81962
|
-
line: util.getArg(mapping, "generatedLine", null),
|
|
81963
|
-
column: util.getArg(mapping, "generatedColumn", null),
|
|
81964
|
-
lastColumn: util.getArg(mapping, "lastGeneratedColumn", null)
|
|
81965
|
-
};
|
|
81966
|
-
}
|
|
81967
|
-
}
|
|
81968
|
-
return {
|
|
81969
|
-
line: null,
|
|
81970
|
-
column: null,
|
|
81971
|
-
lastColumn: null
|
|
81972
|
-
};
|
|
81973
|
-
};
|
|
81974
|
-
exports2.BasicSourceMapConsumer = BasicSourceMapConsumer;
|
|
81975
|
-
function IndexedSourceMapConsumer(aSourceMap, aSourceMapURL) {
|
|
81976
|
-
var sourceMap = aSourceMap;
|
|
81977
|
-
if (typeof aSourceMap === "string") {
|
|
81978
|
-
sourceMap = util.parseSourceMapInput(aSourceMap);
|
|
81979
|
-
}
|
|
81980
|
-
var version3 = util.getArg(sourceMap, "version");
|
|
81981
|
-
var sections = util.getArg(sourceMap, "sections");
|
|
81982
|
-
if (version3 != this._version) {
|
|
81983
|
-
throw new Error("Unsupported version: " + version3);
|
|
81984
|
-
}
|
|
81985
|
-
this._sources = new ArraySet();
|
|
81986
|
-
this._names = new ArraySet();
|
|
81987
|
-
var lastOffset = {
|
|
81988
|
-
line: -1,
|
|
81989
|
-
column: 0
|
|
81990
|
-
};
|
|
81991
|
-
this._sections = sections.map(function(s) {
|
|
81992
|
-
if (s.url) {
|
|
81993
|
-
throw new Error("Support for url field in sections not implemented.");
|
|
81994
|
-
}
|
|
81995
|
-
var offset = util.getArg(s, "offset");
|
|
81996
|
-
var offsetLine = util.getArg(offset, "line");
|
|
81997
|
-
var offsetColumn = util.getArg(offset, "column");
|
|
81998
|
-
if (offsetLine < lastOffset.line || offsetLine === lastOffset.line && offsetColumn < lastOffset.column) {
|
|
81999
|
-
throw new Error("Section offsets must be ordered and non-overlapping.");
|
|
82000
|
-
}
|
|
82001
|
-
lastOffset = offset;
|
|
82002
|
-
return {
|
|
82003
|
-
generatedOffset: {
|
|
82004
|
-
// The offset fields are 0-based, but we use 1-based indices when
|
|
82005
|
-
// encoding/decoding from VLQ.
|
|
82006
|
-
generatedLine: offsetLine + 1,
|
|
82007
|
-
generatedColumn: offsetColumn + 1
|
|
82008
|
-
},
|
|
82009
|
-
consumer: new SourceMapConsumer2(util.getArg(s, "map"), aSourceMapURL)
|
|
82010
|
-
};
|
|
82011
|
-
});
|
|
82012
|
-
}
|
|
82013
|
-
IndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer2.prototype);
|
|
82014
|
-
IndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer2;
|
|
82015
|
-
IndexedSourceMapConsumer.prototype._version = 3;
|
|
82016
|
-
Object.defineProperty(IndexedSourceMapConsumer.prototype, "sources", {
|
|
82017
|
-
get: function() {
|
|
82018
|
-
var sources = [];
|
|
82019
|
-
for (var i = 0; i < this._sections.length; i++) {
|
|
82020
|
-
for (var j = 0; j < this._sections[i].consumer.sources.length; j++) {
|
|
82021
|
-
sources.push(this._sections[i].consumer.sources[j]);
|
|
82022
|
-
}
|
|
82023
|
-
}
|
|
82024
|
-
return sources;
|
|
82025
|
-
}
|
|
82026
|
-
});
|
|
82027
|
-
IndexedSourceMapConsumer.prototype.originalPositionFor = function IndexedSourceMapConsumer_originalPositionFor(aArgs) {
|
|
82028
|
-
var needle = {
|
|
82029
|
-
generatedLine: util.getArg(aArgs, "line"),
|
|
82030
|
-
generatedColumn: util.getArg(aArgs, "column")
|
|
82031
|
-
};
|
|
82032
|
-
var sectionIndex = binarySearch.search(
|
|
82033
|
-
needle,
|
|
82034
|
-
this._sections,
|
|
82035
|
-
function(needle2, section2) {
|
|
82036
|
-
var cmp = needle2.generatedLine - section2.generatedOffset.generatedLine;
|
|
82037
|
-
if (cmp) {
|
|
82038
|
-
return cmp;
|
|
82039
|
-
}
|
|
82040
|
-
return needle2.generatedColumn - section2.generatedOffset.generatedColumn;
|
|
82041
|
-
}
|
|
82042
|
-
);
|
|
82043
|
-
var section = this._sections[sectionIndex];
|
|
82044
|
-
if (!section) {
|
|
82045
|
-
return {
|
|
82046
|
-
source: null,
|
|
82047
|
-
line: null,
|
|
82048
|
-
column: null,
|
|
82049
|
-
name: null
|
|
82050
|
-
};
|
|
82051
|
-
}
|
|
82052
|
-
return section.consumer.originalPositionFor({
|
|
82053
|
-
line: needle.generatedLine - (section.generatedOffset.generatedLine - 1),
|
|
82054
|
-
column: needle.generatedColumn - (section.generatedOffset.generatedLine === needle.generatedLine ? section.generatedOffset.generatedColumn - 1 : 0),
|
|
82055
|
-
bias: aArgs.bias
|
|
82056
|
-
});
|
|
82057
|
-
};
|
|
82058
|
-
IndexedSourceMapConsumer.prototype.hasContentsOfAllSources = function IndexedSourceMapConsumer_hasContentsOfAllSources() {
|
|
82059
|
-
return this._sections.every(function(s) {
|
|
82060
|
-
return s.consumer.hasContentsOfAllSources();
|
|
82061
|
-
});
|
|
82062
|
-
};
|
|
82063
|
-
IndexedSourceMapConsumer.prototype.sourceContentFor = function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {
|
|
82064
|
-
for (var i = 0; i < this._sections.length; i++) {
|
|
82065
|
-
var section = this._sections[i];
|
|
82066
|
-
var content = section.consumer.sourceContentFor(aSource, true);
|
|
82067
|
-
if (content || content === "") {
|
|
82068
|
-
return content;
|
|
82069
|
-
}
|
|
82070
|
-
}
|
|
82071
|
-
if (nullOnMissing) {
|
|
82072
|
-
return null;
|
|
82073
|
-
} else {
|
|
82074
|
-
throw new Error('"' + aSource + '" is not in the SourceMap.');
|
|
82075
|
-
}
|
|
82076
|
-
};
|
|
82077
|
-
IndexedSourceMapConsumer.prototype.generatedPositionFor = function IndexedSourceMapConsumer_generatedPositionFor(aArgs) {
|
|
82078
|
-
for (var i = 0; i < this._sections.length; i++) {
|
|
82079
|
-
var section = this._sections[i];
|
|
82080
|
-
if (section.consumer._findSourceIndex(util.getArg(aArgs, "source")) === -1) {
|
|
82081
|
-
continue;
|
|
82082
|
-
}
|
|
82083
|
-
var generatedPosition = section.consumer.generatedPositionFor(aArgs);
|
|
82084
|
-
if (generatedPosition) {
|
|
82085
|
-
var ret = {
|
|
82086
|
-
line: generatedPosition.line + (section.generatedOffset.generatedLine - 1),
|
|
82087
|
-
column: generatedPosition.column + (section.generatedOffset.generatedLine === generatedPosition.line ? section.generatedOffset.generatedColumn - 1 : 0)
|
|
82088
|
-
};
|
|
82089
|
-
return ret;
|
|
82090
|
-
}
|
|
82091
|
-
}
|
|
82092
|
-
return {
|
|
82093
|
-
line: null,
|
|
82094
|
-
column: null
|
|
82095
|
-
};
|
|
82096
|
-
};
|
|
82097
|
-
IndexedSourceMapConsumer.prototype._parseMappings = function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) {
|
|
82098
|
-
this.__generatedMappings = [];
|
|
82099
|
-
this.__originalMappings = [];
|
|
82100
|
-
for (var i = 0; i < this._sections.length; i++) {
|
|
82101
|
-
var section = this._sections[i];
|
|
82102
|
-
var sectionMappings = section.consumer._generatedMappings;
|
|
82103
|
-
for (var j = 0; j < sectionMappings.length; j++) {
|
|
82104
|
-
var mapping = sectionMappings[j];
|
|
82105
|
-
var source = section.consumer._sources.at(mapping.source);
|
|
82106
|
-
if (source !== null) {
|
|
82107
|
-
source = util.computeSourceURL(section.consumer.sourceRoot, source, this._sourceMapURL);
|
|
82108
|
-
}
|
|
82109
|
-
this._sources.add(source);
|
|
82110
|
-
source = this._sources.indexOf(source);
|
|
82111
|
-
var name = null;
|
|
82112
|
-
if (mapping.name) {
|
|
82113
|
-
name = section.consumer._names.at(mapping.name);
|
|
82114
|
-
this._names.add(name);
|
|
82115
|
-
name = this._names.indexOf(name);
|
|
82116
|
-
}
|
|
82117
|
-
var adjustedMapping = {
|
|
82118
|
-
source,
|
|
82119
|
-
generatedLine: mapping.generatedLine + (section.generatedOffset.generatedLine - 1),
|
|
82120
|
-
generatedColumn: mapping.generatedColumn + (section.generatedOffset.generatedLine === mapping.generatedLine ? section.generatedOffset.generatedColumn - 1 : 0),
|
|
82121
|
-
originalLine: mapping.originalLine,
|
|
82122
|
-
originalColumn: mapping.originalColumn,
|
|
82123
|
-
name
|
|
82124
|
-
};
|
|
82125
|
-
this.__generatedMappings.push(adjustedMapping);
|
|
82126
|
-
if (typeof adjustedMapping.originalLine === "number") {
|
|
82127
|
-
this.__originalMappings.push(adjustedMapping);
|
|
82128
|
-
}
|
|
82129
|
-
}
|
|
82130
|
-
}
|
|
82131
|
-
quickSort(this.__generatedMappings, util.compareByGeneratedPositionsDeflated);
|
|
82132
|
-
quickSort(this.__originalMappings, util.compareByOriginalPositions);
|
|
82133
|
-
};
|
|
82134
|
-
exports2.IndexedSourceMapConsumer = IndexedSourceMapConsumer;
|
|
82135
|
-
}
|
|
82136
|
-
});
|
|
82137
|
-
|
|
82138
|
-
// ../../node_modules/source-map-js/lib/source-node.js
|
|
82139
|
-
var require_source_node = __commonJS({
|
|
82140
|
-
"../../node_modules/source-map-js/lib/source-node.js"(exports2) {
|
|
82141
|
-
var SourceMapGenerator = require_source_map_generator().SourceMapGenerator;
|
|
82142
|
-
var util = require_util();
|
|
82143
|
-
var REGEX_NEWLINE = /(\r?\n)/;
|
|
82144
|
-
var NEWLINE_CODE = 10;
|
|
82145
|
-
var isSourceNode = "$$$isSourceNode$$$";
|
|
82146
|
-
function SourceNode(aLine, aColumn, aSource, aChunks, aName) {
|
|
82147
|
-
this.children = [];
|
|
82148
|
-
this.sourceContents = {};
|
|
82149
|
-
this.line = aLine == null ? null : aLine;
|
|
82150
|
-
this.column = aColumn == null ? null : aColumn;
|
|
82151
|
-
this.source = aSource == null ? null : aSource;
|
|
82152
|
-
this.name = aName == null ? null : aName;
|
|
82153
|
-
this[isSourceNode] = true;
|
|
82154
|
-
if (aChunks != null) this.add(aChunks);
|
|
82155
|
-
}
|
|
82156
|
-
SourceNode.fromStringWithSourceMap = function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) {
|
|
82157
|
-
var node = new SourceNode();
|
|
82158
|
-
var remainingLines = aGeneratedCode.split(REGEX_NEWLINE);
|
|
82159
|
-
var remainingLinesIndex = 0;
|
|
82160
|
-
var shiftNextLine = function() {
|
|
82161
|
-
var lineContents = getNextLine();
|
|
82162
|
-
var newLine = getNextLine() || "";
|
|
82163
|
-
return lineContents + newLine;
|
|
82164
|
-
function getNextLine() {
|
|
82165
|
-
return remainingLinesIndex < remainingLines.length ? remainingLines[remainingLinesIndex++] : void 0;
|
|
82166
|
-
}
|
|
82167
|
-
};
|
|
82168
|
-
var lastGeneratedLine = 1, lastGeneratedColumn = 0;
|
|
82169
|
-
var lastMapping = null;
|
|
82170
|
-
aSourceMapConsumer.eachMapping(function(mapping) {
|
|
82171
|
-
if (lastMapping !== null) {
|
|
82172
|
-
if (lastGeneratedLine < mapping.generatedLine) {
|
|
82173
|
-
addMappingWithCode(lastMapping, shiftNextLine());
|
|
82174
|
-
lastGeneratedLine++;
|
|
82175
|
-
lastGeneratedColumn = 0;
|
|
82176
|
-
} else {
|
|
82177
|
-
var nextLine = remainingLines[remainingLinesIndex] || "";
|
|
82178
|
-
var code = nextLine.substr(0, mapping.generatedColumn - lastGeneratedColumn);
|
|
82179
|
-
remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn - lastGeneratedColumn);
|
|
82180
|
-
lastGeneratedColumn = mapping.generatedColumn;
|
|
82181
|
-
addMappingWithCode(lastMapping, code);
|
|
82182
|
-
lastMapping = mapping;
|
|
82183
|
-
return;
|
|
82184
|
-
}
|
|
82185
|
-
}
|
|
82186
|
-
while (lastGeneratedLine < mapping.generatedLine) {
|
|
82187
|
-
node.add(shiftNextLine());
|
|
82188
|
-
lastGeneratedLine++;
|
|
82189
|
-
}
|
|
82190
|
-
if (lastGeneratedColumn < mapping.generatedColumn) {
|
|
82191
|
-
var nextLine = remainingLines[remainingLinesIndex] || "";
|
|
82192
|
-
node.add(nextLine.substr(0, mapping.generatedColumn));
|
|
82193
|
-
remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn);
|
|
82194
|
-
lastGeneratedColumn = mapping.generatedColumn;
|
|
82195
|
-
}
|
|
82196
|
-
lastMapping = mapping;
|
|
82197
|
-
}, this);
|
|
82198
|
-
if (remainingLinesIndex < remainingLines.length) {
|
|
82199
|
-
if (lastMapping) {
|
|
82200
|
-
addMappingWithCode(lastMapping, shiftNextLine());
|
|
82201
|
-
}
|
|
82202
|
-
node.add(remainingLines.splice(remainingLinesIndex).join(""));
|
|
82203
|
-
}
|
|
82204
|
-
aSourceMapConsumer.sources.forEach(function(sourceFile) {
|
|
82205
|
-
var content = aSourceMapConsumer.sourceContentFor(sourceFile);
|
|
82206
|
-
if (content != null) {
|
|
82207
|
-
if (aRelativePath != null) {
|
|
82208
|
-
sourceFile = util.join(aRelativePath, sourceFile);
|
|
82209
|
-
}
|
|
82210
|
-
node.setSourceContent(sourceFile, content);
|
|
82211
|
-
}
|
|
82212
|
-
});
|
|
82213
|
-
return node;
|
|
82214
|
-
function addMappingWithCode(mapping, code) {
|
|
82215
|
-
if (mapping === null || mapping.source === void 0) {
|
|
82216
|
-
node.add(code);
|
|
82217
|
-
} else {
|
|
82218
|
-
var source = aRelativePath ? util.join(aRelativePath, mapping.source) : mapping.source;
|
|
82219
|
-
node.add(new SourceNode(
|
|
82220
|
-
mapping.originalLine,
|
|
82221
|
-
mapping.originalColumn,
|
|
82222
|
-
source,
|
|
82223
|
-
code,
|
|
82224
|
-
mapping.name
|
|
82225
|
-
));
|
|
82226
|
-
}
|
|
82227
|
-
}
|
|
82228
|
-
};
|
|
82229
|
-
SourceNode.prototype.add = function SourceNode_add(aChunk) {
|
|
82230
|
-
if (Array.isArray(aChunk)) {
|
|
82231
|
-
aChunk.forEach(function(chunk) {
|
|
82232
|
-
this.add(chunk);
|
|
82233
|
-
}, this);
|
|
82234
|
-
} else if (aChunk[isSourceNode] || typeof aChunk === "string") {
|
|
82235
|
-
if (aChunk) {
|
|
82236
|
-
this.children.push(aChunk);
|
|
82237
|
-
}
|
|
82238
|
-
} else {
|
|
82239
|
-
throw new TypeError(
|
|
82240
|
-
"Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk
|
|
82241
|
-
);
|
|
82242
|
-
}
|
|
82243
|
-
return this;
|
|
82244
|
-
};
|
|
82245
|
-
SourceNode.prototype.prepend = function SourceNode_prepend(aChunk) {
|
|
82246
|
-
if (Array.isArray(aChunk)) {
|
|
82247
|
-
for (var i = aChunk.length - 1; i >= 0; i--) {
|
|
82248
|
-
this.prepend(aChunk[i]);
|
|
82249
|
-
}
|
|
82250
|
-
} else if (aChunk[isSourceNode] || typeof aChunk === "string") {
|
|
82251
|
-
this.children.unshift(aChunk);
|
|
82252
|
-
} else {
|
|
82253
|
-
throw new TypeError(
|
|
82254
|
-
"Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk
|
|
82255
|
-
);
|
|
82256
|
-
}
|
|
82257
|
-
return this;
|
|
82258
|
-
};
|
|
82259
|
-
SourceNode.prototype.walk = function SourceNode_walk(aFn) {
|
|
82260
|
-
var chunk;
|
|
82261
|
-
for (var i = 0, len = this.children.length; i < len; i++) {
|
|
82262
|
-
chunk = this.children[i];
|
|
82263
|
-
if (chunk[isSourceNode]) {
|
|
82264
|
-
chunk.walk(aFn);
|
|
82265
|
-
} else {
|
|
82266
|
-
if (chunk !== "") {
|
|
82267
|
-
aFn(chunk, {
|
|
82268
|
-
source: this.source,
|
|
82269
|
-
line: this.line,
|
|
82270
|
-
column: this.column,
|
|
82271
|
-
name: this.name
|
|
82272
|
-
});
|
|
82273
|
-
}
|
|
82274
|
-
}
|
|
82275
|
-
}
|
|
82276
|
-
};
|
|
82277
|
-
SourceNode.prototype.join = function SourceNode_join(aSep) {
|
|
82278
|
-
var newChildren;
|
|
82279
|
-
var i;
|
|
82280
|
-
var len = this.children.length;
|
|
82281
|
-
if (len > 0) {
|
|
82282
|
-
newChildren = [];
|
|
82283
|
-
for (i = 0; i < len - 1; i++) {
|
|
82284
|
-
newChildren.push(this.children[i]);
|
|
82285
|
-
newChildren.push(aSep);
|
|
82286
|
-
}
|
|
82287
|
-
newChildren.push(this.children[i]);
|
|
82288
|
-
this.children = newChildren;
|
|
82289
|
-
}
|
|
82290
|
-
return this;
|
|
82291
|
-
};
|
|
82292
|
-
SourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) {
|
|
82293
|
-
var lastChild = this.children[this.children.length - 1];
|
|
82294
|
-
if (lastChild[isSourceNode]) {
|
|
82295
|
-
lastChild.replaceRight(aPattern, aReplacement);
|
|
82296
|
-
} else if (typeof lastChild === "string") {
|
|
82297
|
-
this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement);
|
|
82298
|
-
} else {
|
|
82299
|
-
this.children.push("".replace(aPattern, aReplacement));
|
|
82300
|
-
}
|
|
82301
|
-
return this;
|
|
82302
|
-
};
|
|
82303
|
-
SourceNode.prototype.setSourceContent = function SourceNode_setSourceContent(aSourceFile, aSourceContent) {
|
|
82304
|
-
this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent;
|
|
82305
|
-
};
|
|
82306
|
-
SourceNode.prototype.walkSourceContents = function SourceNode_walkSourceContents(aFn) {
|
|
82307
|
-
for (var i = 0, len = this.children.length; i < len; i++) {
|
|
82308
|
-
if (this.children[i][isSourceNode]) {
|
|
82309
|
-
this.children[i].walkSourceContents(aFn);
|
|
82310
|
-
}
|
|
82311
|
-
}
|
|
82312
|
-
var sources = Object.keys(this.sourceContents);
|
|
82313
|
-
for (var i = 0, len = sources.length; i < len; i++) {
|
|
82314
|
-
aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]);
|
|
82315
|
-
}
|
|
82316
|
-
};
|
|
82317
|
-
SourceNode.prototype.toString = function SourceNode_toString() {
|
|
82318
|
-
var str = "";
|
|
82319
|
-
this.walk(function(chunk) {
|
|
82320
|
-
str += chunk;
|
|
82321
|
-
});
|
|
82322
|
-
return str;
|
|
82323
|
-
};
|
|
82324
|
-
SourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) {
|
|
82325
|
-
var generated = {
|
|
82326
|
-
code: "",
|
|
82327
|
-
line: 1,
|
|
82328
|
-
column: 0
|
|
82329
|
-
};
|
|
82330
|
-
var map2 = new SourceMapGenerator(aArgs);
|
|
82331
|
-
var sourceMappingActive = false;
|
|
82332
|
-
var lastOriginalSource = null;
|
|
82333
|
-
var lastOriginalLine = null;
|
|
82334
|
-
var lastOriginalColumn = null;
|
|
82335
|
-
var lastOriginalName = null;
|
|
82336
|
-
this.walk(function(chunk, original) {
|
|
82337
|
-
generated.code += chunk;
|
|
82338
|
-
if (original.source !== null && original.line !== null && original.column !== null) {
|
|
82339
|
-
if (lastOriginalSource !== original.source || lastOriginalLine !== original.line || lastOriginalColumn !== original.column || lastOriginalName !== original.name) {
|
|
82340
|
-
map2.addMapping({
|
|
82341
|
-
source: original.source,
|
|
82342
|
-
original: {
|
|
82343
|
-
line: original.line,
|
|
82344
|
-
column: original.column
|
|
82345
|
-
},
|
|
82346
|
-
generated: {
|
|
82347
|
-
line: generated.line,
|
|
82348
|
-
column: generated.column
|
|
82349
|
-
},
|
|
82350
|
-
name: original.name
|
|
82351
|
-
});
|
|
82352
|
-
}
|
|
82353
|
-
lastOriginalSource = original.source;
|
|
82354
|
-
lastOriginalLine = original.line;
|
|
82355
|
-
lastOriginalColumn = original.column;
|
|
82356
|
-
lastOriginalName = original.name;
|
|
82357
|
-
sourceMappingActive = true;
|
|
82358
|
-
} else if (sourceMappingActive) {
|
|
82359
|
-
map2.addMapping({
|
|
82360
|
-
generated: {
|
|
82361
|
-
line: generated.line,
|
|
82362
|
-
column: generated.column
|
|
82363
|
-
}
|
|
82364
|
-
});
|
|
82365
|
-
lastOriginalSource = null;
|
|
82366
|
-
sourceMappingActive = false;
|
|
82367
|
-
}
|
|
82368
|
-
for (var idx = 0, length = chunk.length; idx < length; idx++) {
|
|
82369
|
-
if (chunk.charCodeAt(idx) === NEWLINE_CODE) {
|
|
82370
|
-
generated.line++;
|
|
82371
|
-
generated.column = 0;
|
|
82372
|
-
if (idx + 1 === length) {
|
|
82373
|
-
lastOriginalSource = null;
|
|
82374
|
-
sourceMappingActive = false;
|
|
82375
|
-
} else if (sourceMappingActive) {
|
|
82376
|
-
map2.addMapping({
|
|
82377
|
-
source: original.source,
|
|
82378
|
-
original: {
|
|
82379
|
-
line: original.line,
|
|
82380
|
-
column: original.column
|
|
82381
|
-
},
|
|
82382
|
-
generated: {
|
|
82383
|
-
line: generated.line,
|
|
82384
|
-
column: generated.column
|
|
82385
|
-
},
|
|
82386
|
-
name: original.name
|
|
82387
|
-
});
|
|
82388
|
-
}
|
|
82389
|
-
} else {
|
|
82390
|
-
generated.column++;
|
|
82391
|
-
}
|
|
82392
|
-
}
|
|
82393
|
-
});
|
|
82394
|
-
this.walkSourceContents(function(sourceFile, sourceContent) {
|
|
82395
|
-
map2.setSourceContent(sourceFile, sourceContent);
|
|
82396
|
-
});
|
|
82397
|
-
return { code: generated.code, map: map2 };
|
|
82398
|
-
};
|
|
82399
|
-
exports2.SourceNode = SourceNode;
|
|
82400
|
-
}
|
|
82401
|
-
});
|
|
82402
|
-
|
|
82403
|
-
// ../../node_modules/source-map-js/source-map.js
|
|
82404
|
-
var require_source_map = __commonJS({
|
|
82405
|
-
"../../node_modules/source-map-js/source-map.js"(exports2) {
|
|
82406
|
-
exports2.SourceMapGenerator = require_source_map_generator().SourceMapGenerator;
|
|
82407
|
-
exports2.SourceMapConsumer = require_source_map_consumer().SourceMapConsumer;
|
|
82408
|
-
exports2.SourceNode = require_source_node().SourceNode;
|
|
82409
|
-
}
|
|
82410
|
-
});
|
|
82411
|
-
|
|
82412
80547
|
// ../../node_modules/pngjs/lib/chunkstream.js
|
|
82413
80548
|
var require_chunkstream = __commonJS({
|
|
82414
80549
|
"../../node_modules/pngjs/lib/chunkstream.js"(exports2, module2) {
|
|
@@ -95734,7 +93869,7 @@ var _CI_VENDOR_COUNT_FOR_TEST = vendors_default.length;
|
|
|
95734
93869
|
var SESSION_ID = (0, import_node_crypto3.randomUUID)();
|
|
95735
93870
|
function readCliVersion() {
|
|
95736
93871
|
if (true) {
|
|
95737
|
-
return "0.22.1";
|
|
93872
|
+
return "0.22.2-next.1";
|
|
95738
93873
|
}
|
|
95739
93874
|
return "0.0.0";
|
|
95740
93875
|
}
|
|
@@ -98275,14 +96410,10 @@ var axServiceBlueprint = {
|
|
|
98275
96410
|
// ../tool-server/src/utils/capability.ts
|
|
98276
96411
|
init_src();
|
|
98277
96412
|
var UnsupportedOperationError = class extends Error {
|
|
98278
|
-
toolId;
|
|
98279
|
-
device;
|
|
98280
96413
|
constructor(toolId, device, reason) {
|
|
98281
96414
|
const detail = reason ? ` (${reason})` : "";
|
|
98282
96415
|
super(`Tool '${toolId}' is not supported on ${device.platform} ${device.kind}${detail}.`);
|
|
98283
96416
|
this.name = "UnsupportedOperationError";
|
|
98284
|
-
this.toolId = toolId;
|
|
98285
|
-
this.device = device;
|
|
98286
96417
|
withFailureSignal(this, {
|
|
98287
96418
|
error_code: FAILURE_CODES.TOOL_CAPABILITY_UNSUPPORTED_OPERATION,
|
|
98288
96419
|
failure_stage: "tool_capability_assert_supported",
|
|
@@ -109239,12 +107370,7 @@ async function setClipboardText(cdp, text) {
|
|
|
109239
107370
|
}
|
|
109240
107371
|
}
|
|
109241
107372
|
var ClipboardSyncState = class {
|
|
109242
|
-
|
|
109243
|
-
set(enabled) {
|
|
109244
|
-
this.enabled = enabled;
|
|
109245
|
-
}
|
|
109246
|
-
isEnabled() {
|
|
109247
|
-
return this.enabled;
|
|
107373
|
+
set(_enabled) {
|
|
109248
107374
|
}
|
|
109249
107375
|
};
|
|
109250
107376
|
|
|
@@ -115033,7 +113159,6 @@ var http = __toESM(require("node:http"));
|
|
|
115033
113159
|
init_src();
|
|
115034
113160
|
|
|
115035
113161
|
// ../tool-server/src/utils/debugger/source-maps.ts
|
|
115036
|
-
var import_source_map_js = __toESM(require_source_map());
|
|
115037
113162
|
var ALLOWED_SOURCE_MAP_HOSTS = /* @__PURE__ */ new Set(["localhost", "127.0.0.1", "::1"]);
|
|
115038
113163
|
function isAllowedSourceMapURL(raw) {
|
|
115039
113164
|
let parsed;
|
|
@@ -115048,17 +113173,14 @@ function isAllowedSourceMapURL(raw) {
|
|
|
115048
113173
|
return ALLOWED_SOURCE_MAP_HOSTS.has(hostname3);
|
|
115049
113174
|
}
|
|
115050
113175
|
var MAX_SOURCE_MAP_BYTES = 64 * 1024 * 1024;
|
|
115051
|
-
async function
|
|
113176
|
+
async function drainCappedBody(res, maxBytes = MAX_SOURCE_MAP_BYTES) {
|
|
115052
113177
|
const declared = Number(res.headers.get("content-length"));
|
|
115053
113178
|
if (Number.isFinite(declared) && declared > maxBytes) {
|
|
115054
113179
|
throw new Error(`source map body too large (content-length ${declared} > ${maxBytes})`);
|
|
115055
113180
|
}
|
|
115056
113181
|
const body = res.body;
|
|
115057
|
-
if (!body || typeof body.getReader !== "function")
|
|
115058
|
-
return res.json();
|
|
115059
|
-
}
|
|
113182
|
+
if (!body || typeof body.getReader !== "function") return;
|
|
115060
113183
|
const reader = body.getReader();
|
|
115061
|
-
const chunks = [];
|
|
115062
113184
|
let total = 0;
|
|
115063
113185
|
for (; ; ) {
|
|
115064
113186
|
const { done, value } = await reader.read();
|
|
@@ -115069,112 +113191,32 @@ async function readCappedJson(res, maxBytes = MAX_SOURCE_MAP_BYTES) {
|
|
|
115069
113191
|
await reader.cancel();
|
|
115070
113192
|
throw new Error(`source map body exceeded ${maxBytes} bytes`);
|
|
115071
113193
|
}
|
|
115072
|
-
chunks.push(value);
|
|
115073
113194
|
}
|
|
115074
113195
|
}
|
|
115075
|
-
return JSON.parse(Buffer.concat(chunks).toString("utf-8"));
|
|
115076
113196
|
}
|
|
115077
113197
|
var SourceMapsRegistry = class {
|
|
115078
|
-
maps = [];
|
|
115079
113198
|
pendingRegistrations = [];
|
|
115080
|
-
projectRoot;
|
|
115081
|
-
constructor(projectRoot) {
|
|
115082
|
-
this.projectRoot = projectRoot;
|
|
115083
|
-
}
|
|
115084
113199
|
/**
|
|
115085
|
-
* Begin fetching
|
|
115086
|
-
*
|
|
113200
|
+
* Begin fetching the source map a Debugger.scriptParsed event points at.
|
|
113201
|
+
* Takes the whole event shape, though only the URL is read now. Returns
|
|
113202
|
+
* immediately; use `waitForPending()` to block until every fetch has settled.
|
|
115087
113203
|
*/
|
|
115088
113204
|
registerFromScriptParsed(scriptUrl, scriptId, sourceMapURL) {
|
|
115089
113205
|
if (!sourceMapURL) return;
|
|
115090
|
-
const p = this.doRegister(
|
|
113206
|
+
const p = this.doRegister(sourceMapURL);
|
|
115091
113207
|
this.pendingRegistrations.push(p);
|
|
115092
113208
|
}
|
|
115093
113209
|
async waitForPending() {
|
|
115094
113210
|
await Promise.allSettled(this.pendingRegistrations);
|
|
115095
113211
|
this.pendingRegistrations = [];
|
|
115096
113212
|
}
|
|
115097
|
-
|
|
115098
|
-
* Resolve an original source file + line to its generated position in the bundle.
|
|
115099
|
-
*
|
|
115100
|
-
* `filePath` may be project-relative ("src/Foo.tsx"), absolute, or aliased
|
|
115101
|
-
* ("/[metro-project]/App.tsx").
|
|
115102
|
-
*/
|
|
115103
|
-
toGeneratedPosition(filePath, line1Based, column0Based = 0) {
|
|
115104
|
-
const candidates = this.buildSourceCandidates(filePath);
|
|
115105
|
-
for (const map2 of this.maps) {
|
|
115106
|
-
for (const candidate of candidates) {
|
|
115107
|
-
if (!map2.sources.some((s) => s === candidate)) continue;
|
|
115108
|
-
try {
|
|
115109
|
-
const pos = map2.consumer.generatedPositionFor({
|
|
115110
|
-
source: candidate,
|
|
115111
|
-
line: line1Based,
|
|
115112
|
-
column: column0Based,
|
|
115113
|
-
bias: import_source_map_js.SourceMapConsumer.LEAST_UPPER_BOUND
|
|
115114
|
-
});
|
|
115115
|
-
if (pos.line !== null) {
|
|
115116
|
-
return {
|
|
115117
|
-
scriptUrl: map2.scriptUrl,
|
|
115118
|
-
scriptId: map2.scriptId,
|
|
115119
|
-
line1Based: pos.line,
|
|
115120
|
-
column0Based: pos.column ?? 0
|
|
115121
|
-
};
|
|
115122
|
-
}
|
|
115123
|
-
} catch {
|
|
115124
|
-
}
|
|
115125
|
-
}
|
|
115126
|
-
}
|
|
115127
|
-
return null;
|
|
115128
|
-
}
|
|
115129
|
-
/** Matching entry in a registered map's `sources`, or null. */
|
|
115130
|
-
findMatchingSource(filePath) {
|
|
115131
|
-
const candidates = this.buildSourceCandidates(filePath);
|
|
115132
|
-
for (const map2 of this.maps) {
|
|
115133
|
-
for (const candidate of candidates) {
|
|
115134
|
-
if (map2.sources.includes(candidate)) return candidate;
|
|
115135
|
-
}
|
|
115136
|
-
}
|
|
115137
|
-
return null;
|
|
115138
|
-
}
|
|
115139
|
-
buildSourceCandidates(filePath) {
|
|
115140
|
-
const normalized = filePath.replace(/\\/g, "/").replace(/^\.\//, "");
|
|
115141
|
-
const candidates = [];
|
|
115142
|
-
if (normalized.startsWith("/")) {
|
|
115143
|
-
candidates.push(normalized);
|
|
115144
|
-
}
|
|
115145
|
-
candidates.push(`/[metro-project]/${normalized}`);
|
|
115146
|
-
if (this.projectRoot) {
|
|
115147
|
-
candidates.push(`${this.projectRoot}/${normalized}`);
|
|
115148
|
-
}
|
|
115149
|
-
const suffix = normalized.startsWith("/") ? normalized : `/${normalized}`;
|
|
115150
|
-
for (const map2 of this.maps) {
|
|
115151
|
-
for (const src of map2.sources) {
|
|
115152
|
-
if (src.endsWith(suffix) && !candidates.includes(src)) {
|
|
115153
|
-
candidates.push(src);
|
|
115154
|
-
}
|
|
115155
|
-
}
|
|
115156
|
-
}
|
|
115157
|
-
return candidates;
|
|
115158
|
-
}
|
|
115159
|
-
async doRegister(scriptUrl, scriptId, sourceMapURL) {
|
|
113213
|
+
async doRegister(sourceMapURL) {
|
|
115160
113214
|
try {
|
|
115161
|
-
|
|
115162
|
-
if (sourceMapURL
|
|
115163
|
-
|
|
115164
|
-
|
|
115165
|
-
|
|
115166
|
-
rawData = JSON.parse(decoded);
|
|
115167
|
-
} else {
|
|
115168
|
-
if (!isAllowedSourceMapURL(sourceMapURL)) return;
|
|
115169
|
-
const res = await fetch(sourceMapURL, { redirect: "error" });
|
|
115170
|
-
if (!res.ok) return;
|
|
115171
|
-
rawData = await readCappedJson(res);
|
|
115172
|
-
}
|
|
115173
|
-
const consumer = new import_source_map_js.SourceMapConsumer(rawData);
|
|
115174
|
-
const consumerSources = consumer.sources;
|
|
115175
|
-
const rawSources = rawData?.sources;
|
|
115176
|
-
const sources = Array.isArray(consumerSources) ? Array.from(consumerSources) : Array.isArray(rawSources) ? rawSources.slice() : [];
|
|
115177
|
-
this.maps.push({ scriptUrl, scriptId, consumer, sources });
|
|
113215
|
+
if (sourceMapURL.startsWith("data:")) return;
|
|
113216
|
+
if (!isAllowedSourceMapURL(sourceMapURL)) return;
|
|
113217
|
+
const res = await fetch(sourceMapURL, { redirect: "error" });
|
|
113218
|
+
if (!res.ok) return;
|
|
113219
|
+
await drainCappedBody(res);
|
|
115178
113220
|
} catch {
|
|
115179
113221
|
}
|
|
115180
113222
|
}
|
|
@@ -115454,13 +113496,6 @@ function makeStubSourceResolver() {
|
|
|
115454
113496
|
readSourceFragment: unsupported
|
|
115455
113497
|
};
|
|
115456
113498
|
}
|
|
115457
|
-
var StubSourceMapsRegistry = class extends SourceMapsRegistry {
|
|
115458
|
-
constructor() {
|
|
115459
|
-
super("");
|
|
115460
|
-
}
|
|
115461
|
-
async waitForPending() {
|
|
115462
|
-
}
|
|
115463
|
-
};
|
|
115464
113499
|
var chromiumJsRuntimeDebuggerBlueprint = {
|
|
115465
113500
|
namespace: CHROMIUM_JS_RUNTIME_DEBUGGER_NAMESPACE,
|
|
115466
113501
|
getURN(payload) {
|
|
@@ -115526,7 +113561,7 @@ var chromiumJsRuntimeDebuggerBlueprint = {
|
|
|
115526
113561
|
const consoleServer = await createConsoleLogServer(consoleEvents, logWriter);
|
|
115527
113562
|
await cdp.addBinding("__argent_callback").catch(() => {
|
|
115528
113563
|
});
|
|
115529
|
-
const sourceMaps = new
|
|
113564
|
+
const sourceMaps = new SourceMapsRegistry();
|
|
115530
113565
|
const sourceResolver = makeStubSourceResolver();
|
|
115531
113566
|
const api = {
|
|
115532
113567
|
port,
|
|
@@ -117225,7 +115260,7 @@ var jsRuntimeDebuggerBlueprint = {
|
|
|
117225
115260
|
});
|
|
117226
115261
|
const cdp = new CDPClient(selected.webSocketUrl);
|
|
117227
115262
|
await cdp.connect();
|
|
117228
|
-
const sourceMaps = new SourceMapsRegistry(
|
|
115263
|
+
const sourceMaps = new SourceMapsRegistry();
|
|
117229
115264
|
cdp.events.on("scriptParsed", (script) => {
|
|
117230
115265
|
sourceMaps.registerFromScriptParsed(script.url, script.scriptId, script.sourceMapURL);
|
|
117231
115266
|
});
|
|
@@ -119705,9 +117740,6 @@ function makeIosImpl(registry2) {
|
|
|
119705
117740
|
}
|
|
119706
117741
|
|
|
119707
117742
|
// ../tool-server/src/utils/simctl-backend.ts
|
|
119708
|
-
var import_node_child_process20 = require("node:child_process");
|
|
119709
|
-
var import_node_util14 = require("node:util");
|
|
119710
|
-
var execFileAsync14 = (0, import_node_util14.promisify)(import_node_child_process20.execFile);
|
|
119711
117743
|
var remoteSimctl = {
|
|
119712
117744
|
launch: simctlLaunch,
|
|
119713
117745
|
terminate: simctlTerminate
|
|
@@ -119909,10 +117941,10 @@ Common Android packages: com.android.settings, com.android.chrome, com.google.an
|
|
|
119909
117941
|
init_zod();
|
|
119910
117942
|
|
|
119911
117943
|
// ../tool-server/src/tools/restart-app/platforms/ios.ts
|
|
119912
|
-
var
|
|
119913
|
-
var
|
|
117944
|
+
var import_node_child_process20 = require("node:child_process");
|
|
117945
|
+
var import_node_util14 = require("node:util");
|
|
119914
117946
|
init_src();
|
|
119915
|
-
var
|
|
117947
|
+
var execFileAsync14 = (0, import_node_util14.promisify)(import_node_child_process20.execFile);
|
|
119916
117948
|
function makeIosImpl2(registry2) {
|
|
119917
117949
|
return {
|
|
119918
117950
|
requires: ["xcrun"],
|
|
@@ -119926,11 +117958,11 @@ function makeIosImpl2(registry2) {
|
|
|
119926
117958
|
const blocked = await precheckNativeDevtools(nativeDevtools, udid);
|
|
119927
117959
|
if (blocked) return blocked;
|
|
119928
117960
|
try {
|
|
119929
|
-
await
|
|
117961
|
+
await execFileAsync14("xcrun", await simctlArgsForUdid(udid, ["terminate", udid, bundleId]));
|
|
119930
117962
|
} catch {
|
|
119931
117963
|
}
|
|
119932
117964
|
try {
|
|
119933
|
-
await
|
|
117965
|
+
await execFileAsync14("xcrun", await simctlArgsForUdid(udid, ["launch", udid, bundleId]));
|
|
119934
117966
|
} catch (err) {
|
|
119935
117967
|
throw new FailureError(
|
|
119936
117968
|
`Failed to restart iOS app ${bundleId} on ${udid}.`,
|
|
@@ -120089,11 +118121,11 @@ Returns { restarted, bundleId }. Fails if the app is not installed.`,
|
|
|
120089
118121
|
init_zod();
|
|
120090
118122
|
|
|
120091
118123
|
// ../tool-server/src/tools/reinstall-app/platforms/ios.ts
|
|
120092
|
-
var
|
|
120093
|
-
var
|
|
118124
|
+
var import_node_child_process21 = require("node:child_process");
|
|
118125
|
+
var import_node_util15 = require("node:util");
|
|
120094
118126
|
var import_node_path15 = require("node:path");
|
|
120095
118127
|
init_src();
|
|
120096
|
-
var
|
|
118128
|
+
var execFileAsync15 = (0, import_node_util15.promisify)(import_node_child_process21.execFile);
|
|
120097
118129
|
var iosImpl = {
|
|
120098
118130
|
requires: ["xcrun"],
|
|
120099
118131
|
handler: async (_services, params) => {
|
|
@@ -120101,11 +118133,11 @@ var iosImpl = {
|
|
|
120101
118133
|
const absolute = (0, import_node_path15.resolve)(appPath);
|
|
120102
118134
|
const prefix = simctlPrefix(await deviceSetForUdid(udid));
|
|
120103
118135
|
try {
|
|
120104
|
-
await
|
|
118136
|
+
await execFileAsync15("xcrun", [...prefix, "uninstall", udid, bundleId]);
|
|
120105
118137
|
} catch {
|
|
120106
118138
|
}
|
|
120107
118139
|
try {
|
|
120108
|
-
await
|
|
118140
|
+
await execFileAsync15("xcrun", [...prefix, "install", udid, absolute]);
|
|
120109
118141
|
} catch (err) {
|
|
120110
118142
|
throw new FailureError(
|
|
120111
118143
|
`Failed to install iOS app bundle on ${udid}.`,
|
|
@@ -120261,10 +118293,10 @@ var PERMISSION_NAMES = [
|
|
|
120261
118293
|
];
|
|
120262
118294
|
|
|
120263
118295
|
// ../tool-server/src/tools/settings-permissions/platforms/ios.ts
|
|
120264
|
-
var
|
|
120265
|
-
var
|
|
118296
|
+
var import_node_child_process22 = require("node:child_process");
|
|
118297
|
+
var import_node_util16 = require("node:util");
|
|
120266
118298
|
init_src();
|
|
120267
|
-
var
|
|
118299
|
+
var execFileAsync16 = (0, import_node_util16.promisify)(import_node_child_process22.execFile);
|
|
120268
118300
|
var SIMCTL_ACTION = {
|
|
120269
118301
|
grant: "grant",
|
|
120270
118302
|
deny: "revoke",
|
|
@@ -120289,7 +118321,7 @@ var NON_TCC_GRANT_NEEDS_INSTALL = /* @__PURE__ */ new Set([
|
|
|
120289
118321
|
]);
|
|
120290
118322
|
var localBackend = {
|
|
120291
118323
|
async run(udid, simctlAction, service, bundleId) {
|
|
120292
|
-
await
|
|
118324
|
+
await execFileAsync16(
|
|
120293
118325
|
"xcrun",
|
|
120294
118326
|
await simctlArgsForUdid(udid, ["privacy", udid, simctlAction, service, bundleId]),
|
|
120295
118327
|
{ timeout: 3e4 }
|
|
@@ -120297,7 +118329,7 @@ var localBackend = {
|
|
|
120297
118329
|
},
|
|
120298
118330
|
async isInstalled(udid, bundleId) {
|
|
120299
118331
|
try {
|
|
120300
|
-
await
|
|
118332
|
+
await execFileAsync16(
|
|
120301
118333
|
"xcrun",
|
|
120302
118334
|
await simctlArgsForUdid(udid, ["get_app_container", udid, bundleId]),
|
|
120303
118335
|
{ timeout: 15e3 }
|
|
@@ -120580,8 +118612,8 @@ Returns { action, permission, bundleId, applied, skipped? }: \`applied\` lists t
|
|
|
120580
118612
|
init_zod();
|
|
120581
118613
|
|
|
120582
118614
|
// ../tool-server/src/tools/open-url/platforms/ios.ts
|
|
120583
|
-
var
|
|
120584
|
-
var
|
|
118615
|
+
var import_node_child_process23 = require("node:child_process");
|
|
118616
|
+
var import_node_util17 = require("node:util");
|
|
120585
118617
|
init_src();
|
|
120586
118618
|
|
|
120587
118619
|
// ../tool-server/src/tools/open-url/deep-link-note.ts
|
|
@@ -120591,12 +118623,12 @@ function httpDeepLinkNote(url2) {
|
|
|
120591
118623
|
}
|
|
120592
118624
|
|
|
120593
118625
|
// ../tool-server/src/tools/open-url/platforms/ios.ts
|
|
120594
|
-
var
|
|
118626
|
+
var execFileAsync17 = (0, import_node_util17.promisify)(import_node_child_process23.execFile);
|
|
120595
118627
|
var iosImpl3 = {
|
|
120596
118628
|
requires: ["xcrun"],
|
|
120597
118629
|
handler: async (_services, params) => {
|
|
120598
118630
|
try {
|
|
120599
|
-
await
|
|
118631
|
+
await execFileAsync17(
|
|
120600
118632
|
"xcrun",
|
|
120601
118633
|
await simctlArgsForUdid(params.udid, ["openurl", params.udid, params.url])
|
|
120602
118634
|
);
|
|
@@ -120712,8 +118744,8 @@ Returns { opened, url, note? }. note carries the deep-linking caveat when a web
|
|
|
120712
118744
|
};
|
|
120713
118745
|
|
|
120714
118746
|
// ../tool-server/src/tools/screenshot/index.ts
|
|
120715
|
-
var
|
|
120716
|
-
var
|
|
118747
|
+
var import_node_child_process24 = require("node:child_process");
|
|
118748
|
+
var import_node_util18 = require("node:util");
|
|
120717
118749
|
var os9 = __toESM(require("node:os"));
|
|
120718
118750
|
var path22 = __toESM(require("node:path"));
|
|
120719
118751
|
init_zod();
|
|
@@ -121127,7 +119159,7 @@ function scalePng(src, scale) {
|
|
|
121127
119159
|
}
|
|
121128
119160
|
|
|
121129
119161
|
// ../tool-server/src/tools/screenshot/index.ts
|
|
121130
|
-
var
|
|
119162
|
+
var execFileAsync18 = (0, import_node_util18.promisify)(import_node_child_process24.execFile);
|
|
121131
119163
|
var zodSchema15 = external_exports.object({
|
|
121132
119164
|
udid: external_exports.string().describe(
|
|
121133
119165
|
"Target device id from `list-devices` (iOS UDID, Android serial, Apple TV UDID, Vega serial, or Chromium id)."
|
|
@@ -121157,11 +119189,11 @@ async function tvScreenshot(udid, scale, signal) {
|
|
|
121157
119189
|
os9.tmpdir(),
|
|
121158
119190
|
`argent-tv-screenshot-${udid.slice(0, 8)}-${process.hrtime.bigint()}.png`
|
|
121159
119191
|
);
|
|
121160
|
-
await
|
|
119192
|
+
await execFileAsync18("xcrun", await simctlArgsForUdid(udid, ["io", udid, "screenshot", file2]), {
|
|
121161
119193
|
signal
|
|
121162
119194
|
});
|
|
121163
119195
|
if (scale < 1) {
|
|
121164
|
-
await
|
|
119196
|
+
await execFileAsync18("sips", ["-Z", String(await tvTargetLongSide(file2, scale)), file2], {
|
|
121165
119197
|
signal
|
|
121166
119198
|
}).catch(() => {
|
|
121167
119199
|
});
|
|
@@ -121171,7 +119203,7 @@ async function tvScreenshot(udid, scale, signal) {
|
|
|
121171
119203
|
async function tvTargetLongSide(file2, scale) {
|
|
121172
119204
|
let longSide = 3840;
|
|
121173
119205
|
try {
|
|
121174
|
-
const { stdout } = await
|
|
119206
|
+
const { stdout } = await execFileAsync18("sips", ["-g", "pixelWidth", "-g", "pixelHeight", file2]);
|
|
121175
119207
|
const width = Number(/pixelWidth:\s*(\d+)/.exec(stdout)?.[1]);
|
|
121176
119208
|
const height = Number(/pixelHeight:\s*(\d+)/.exec(stdout)?.[1]);
|
|
121177
119209
|
if (Number.isFinite(width) && Number.isFinite(height) && width > 0 && height > 0) {
|
|
@@ -121385,18 +119417,39 @@ Before tapping, determine the correct coordinates by using discovery tools \u201
|
|
|
121385
119417
|
// ../tool-server/src/tools/gesture-swipe/index.ts
|
|
121386
119418
|
init_zod();
|
|
121387
119419
|
var sleep3 = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
121388
|
-
var
|
|
119420
|
+
var MOMENTUM_FREE_EASE_EXPONENT = 3;
|
|
119421
|
+
var DEFAULT_DURATION_MS = 300;
|
|
119422
|
+
var MOMENTUM_FREE_MIN_DURATION_MS = 150;
|
|
119423
|
+
var MAX_DURATION_MS = 1e4;
|
|
121389
119424
|
var zodSchema17 = external_exports.object({
|
|
121390
119425
|
udid: external_exports.string().describe("Target device id from `list-devices` (iOS UDID or Android serial)."),
|
|
121391
119426
|
fromX: external_exports.number().describe("Start x: normalized 0.0\u20131.0 (not pixels; same as tap)"),
|
|
121392
119427
|
fromY: external_exports.number().describe("Start y: normalized 0.0\u20131.0 (not pixels; same as tap)"),
|
|
121393
119428
|
toX: external_exports.number().describe("End x: normalized 0.0\u20131.0 (not pixels; same as tap)"),
|
|
121394
119429
|
toY: external_exports.number().describe("End y: normalized 0.0\u20131.0 (not pixels; same as tap)"),
|
|
121395
|
-
durationMs: external_exports.number().
|
|
121396
|
-
|
|
121397
|
-
|
|
119430
|
+
durationMs: external_exports.number().max(MAX_DURATION_MS, {
|
|
119431
|
+
message: `durationMs must be at most ${MAX_DURATION_MS} (10s): every frame is a real 16ms sleep with the finger held down, so a larger value is that many milliseconds of wall clock spent holding a touch the device cannot shake off.`
|
|
119432
|
+
}).optional().describe(
|
|
119433
|
+
`Total gesture duration in milliseconds (default 300, at most ${MAX_DURATION_MS} - the gesture holds a finger down for exactly this long)`
|
|
119434
|
+
),
|
|
119435
|
+
momentum: external_exports.boolean().optional().describe(
|
|
119436
|
+
`Whether the swipe releases with momentum; default true (a natural flinging swipe). Pass false for a momentum-free swipe at the default durationMs: the finger decelerates into the end point (ease-out) so the OS reads ~0 release velocity and applies little to no fling. Use false for scroll-to-element loops. momentum: false needs durationMs >= ${MOMENTUM_FREE_MIN_DURATION_MS} and is rejected below it: a shorter ease-out gives the OS velocity fit too little wall clock to read the deceleration as a stop, and it flings harder than a plain swipe instead (on Android, backwards). At ${MOMENTUM_FREE_MIN_DURATION_MS} itself the swipe lands short of where the finger stopped, and 2 of 47 runs still flung backwards.`
|
|
119437
|
+
),
|
|
119438
|
+
// `momentum`'s shipped spelling, with the opposite polarity. Declared so this
|
|
119439
|
+
// non-strict object refuses it instead of stripping it and flinging - the exact
|
|
119440
|
+
// inverse of the gesture the caller asked for.
|
|
119441
|
+
settle: external_exports.never({
|
|
119442
|
+
error: "gesture-swipe's `settle` was renamed to `momentum`, with the opposite sense \u2014 write `momentum: false` for the momentum-free swipe that `settle: true` used to mean (plain `settle: false` was the default, so just drop it)"
|
|
119443
|
+
}).optional().describe(
|
|
119444
|
+
"Retired: renamed to `momentum` with the opposite sense. Pass `momentum: false` for what `settle: true` meant; `settle: false` was the default, so drop the key."
|
|
121398
119445
|
)
|
|
121399
|
-
})
|
|
119446
|
+
}).refine(
|
|
119447
|
+
(p) => p.momentum !== false || (p.durationMs ?? DEFAULT_DURATION_MS) >= MOMENTUM_FREE_MIN_DURATION_MS,
|
|
119448
|
+
{
|
|
119449
|
+
message: `momentum: false needs durationMs of at least ${MOMENTUM_FREE_MIN_DURATION_MS}: below that the ease-out has too little wall clock for the OS velocity fit to read it as a stop rather than a flick, so it flings harder than a plain swipe and, on Android, backwards. Raise durationMs, or drop momentum: false for a plain flinging swipe at the duration you asked for.`,
|
|
119450
|
+
path: ["durationMs"]
|
|
119451
|
+
}
|
|
119452
|
+
);
|
|
121400
119453
|
var capability9 = {
|
|
121401
119454
|
apple: { simulator: true, device: true },
|
|
121402
119455
|
appleRemote: { simulator: true },
|
|
@@ -121409,11 +119462,13 @@ var gestureSwipeTool = {
|
|
|
121409
119462
|
completedMsg: ({ params }) => `Swiped from (${Math.round(params.fromX * 100)}%, ${Math.round(params.fromY * 100)}%) to (${Math.round(params.toX * 100)}%, ${Math.round(params.toY * 100)}%)`,
|
|
121410
119463
|
failedMsg: ({ failureSignal: failureSignal2 }) => `Failed to swipe: ${failureSignal2.error_code}`
|
|
121411
119464
|
},
|
|
119465
|
+
// The bounds are spelled out rather than interpolated: extract-tools scans this
|
|
119466
|
+
// description statically, so a `${}` in it drops the tool out of the scan.
|
|
121412
119467
|
description: `Execute a smooth swipe / drag touch gesture between two points on the device (iOS simulator or Android emulator). All from/to positions are normalized 0.0\u20131.0 (fractions of screen width/height, not pixels), same as gesture-tap.
|
|
121413
119468
|
Generates interpolated Move events for a natural feel (~60fps).
|
|
121414
119469
|
Swipe up (fromY > toY) to scroll content down.
|
|
121415
119470
|
Use when you need to scroll a list, dismiss a modal, drag an element, or navigate between pages. Not supported on Chromium \u2014 use gesture-scroll there instead.
|
|
121416
|
-
Pass
|
|
119471
|
+
Pass momentum:false for a momentum-free swipe that lands where the finger lifts (little to no fling at the 300 default), when you need a deterministic scroll distance; it needs durationMs >= 150 and is rejected below that, a shorter ease-out leaving the OS too little wall clock to read the deceleration as a stop. At 150 it lands short of the lift point instead, and 2 of 47 runs still flung backwards. A plain swipe takes any duration up to 10000ms and is delivered as close to the speed it was authored as a 16ms frame allows: below ~32ms the whole travel lands in one or two frames, which the OS flings as hard as it flings anything. Returns { swiped: true, timestampMs }. Fails if the simulator-server / emulator backend is not reachable for the given device.`,
|
|
121417
119472
|
alwaysLoad: true,
|
|
121418
119473
|
searchHint: "swipe scroll drag pan gesture device simulator emulator touch move",
|
|
121419
119474
|
zodSchema: zodSchema17,
|
|
@@ -121421,18 +119476,47 @@ Pass settle:true for a momentum-free swipe that lands exactly where the finger l
|
|
|
121421
119476
|
services: (params) => ({
|
|
121422
119477
|
simulatorServer: simulatorServerRef(resolveDevice(params.udid))
|
|
121423
119478
|
}),
|
|
121424
|
-
async execute(services, params) {
|
|
121425
|
-
const duration3 = params.durationMs ??
|
|
121426
|
-
const
|
|
119479
|
+
async execute(services, params, ctx) {
|
|
119480
|
+
const duration3 = params.durationMs ?? DEFAULT_DURATION_MS;
|
|
119481
|
+
const momentumFree = params.momentum === false;
|
|
121427
119482
|
const timestampMs = Date.now();
|
|
121428
119483
|
const api = services.simulatorServer;
|
|
121429
119484
|
const steps = Math.max(1, Math.round(duration3 / 16));
|
|
119485
|
+
let lastX = 0;
|
|
119486
|
+
let lastY = 0;
|
|
121430
119487
|
for (let i = 0; i <= steps; i++) {
|
|
119488
|
+
if (ctx?.signal?.aborted) {
|
|
119489
|
+
if (i > 0) {
|
|
119490
|
+
sendCommand(api, {
|
|
119491
|
+
cmd: "touch",
|
|
119492
|
+
type: "Up",
|
|
119493
|
+
x: lastX,
|
|
119494
|
+
y: lastY,
|
|
119495
|
+
second_x: null,
|
|
119496
|
+
second_y: null
|
|
119497
|
+
});
|
|
119498
|
+
}
|
|
119499
|
+
const err = new Error(
|
|
119500
|
+
`gesture-swipe aborted - cancelled mid-gesture after ${i} of ${steps + 1} frames`
|
|
119501
|
+
);
|
|
119502
|
+
err.name = "AbortError";
|
|
119503
|
+
throw err;
|
|
119504
|
+
}
|
|
121431
119505
|
const t = i / steps;
|
|
121432
|
-
const progress =
|
|
119506
|
+
const progress = momentumFree ? 1 - Math.pow(1 - t, MOMENTUM_FREE_EASE_EXPONENT) : t;
|
|
121433
119507
|
const x = params.fromX + (params.toX - params.fromX) * progress;
|
|
121434
119508
|
const y = params.fromY + (params.toY - params.fromY) * progress;
|
|
121435
119509
|
const type = i === 0 ? "Down" : i === steps ? "Up" : "Move";
|
|
119510
|
+
if (type === "Up") {
|
|
119511
|
+
sendCommand(api, {
|
|
119512
|
+
cmd: "touch",
|
|
119513
|
+
type: "Move",
|
|
119514
|
+
x,
|
|
119515
|
+
y,
|
|
119516
|
+
second_x: null,
|
|
119517
|
+
second_y: null
|
|
119518
|
+
});
|
|
119519
|
+
}
|
|
121436
119520
|
sendCommand(api, {
|
|
121437
119521
|
cmd: "touch",
|
|
121438
119522
|
type,
|
|
@@ -121441,6 +119525,8 @@ Pass settle:true for a momentum-free swipe that lands exactly where the finger l
|
|
|
121441
119525
|
second_x: null,
|
|
121442
119526
|
second_y: null
|
|
121443
119527
|
});
|
|
119528
|
+
lastX = x;
|
|
119529
|
+
lastY = y;
|
|
121444
119530
|
if (i < steps) await sleep3(16);
|
|
121445
119531
|
}
|
|
121446
119532
|
return { swiped: true, timestampMs };
|
|
@@ -121516,13 +119602,30 @@ Returns { scrolled: true, timestampMs }. Fails if the Chromium CDP session is no
|
|
|
121516
119602
|
// ../tool-server/src/tools/gesture-drag/index.ts
|
|
121517
119603
|
init_zod();
|
|
121518
119604
|
var sleep5 = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
119605
|
+
var MOMENTUM_FREE_EASE_EXPONENT2 = 3;
|
|
119606
|
+
var MOMENTUM_FREE_MIN_STEPS = 8;
|
|
119607
|
+
var MAX_DURATION_MS2 = 1e4;
|
|
121519
119608
|
var zodSchema19 = external_exports.object({
|
|
121520
119609
|
udid: external_exports.string().describe("Target Chromium device id from `list-devices` (chromium-cdp-<port>)."),
|
|
121521
119610
|
fromX: external_exports.number().describe("Press x: normalized 0.0\u20131.0 (fraction of window width, not pixels)."),
|
|
121522
119611
|
fromY: external_exports.number().describe("Press y: normalized 0.0\u20131.0 (fraction of window height, not pixels)."),
|
|
121523
119612
|
toX: external_exports.number().describe("Release x: normalized 0.0\u20131.0 (not pixels; same space as tap)."),
|
|
121524
119613
|
toY: external_exports.number().describe("Release y: normalized 0.0\u20131.0 (not pixels; same space as tap)."),
|
|
121525
|
-
durationMs: external_exports.number().
|
|
119614
|
+
durationMs: external_exports.number().max(MAX_DURATION_MS2, {
|
|
119615
|
+
message: `durationMs must be at most ${MAX_DURATION_MS2} (10s): the drag holds the left button down for exactly this long, one frame per ~16ms, so a larger value is that much wall clock spent mid-press.`
|
|
119616
|
+
}).optional().describe(
|
|
119617
|
+
`Total drag duration in milliseconds (default 300, at most ${MAX_DURATION_MS2} - the button stays down for exactly this long), interpolated at ~60fps.`
|
|
119618
|
+
),
|
|
119619
|
+
momentum: external_exports.boolean().optional().describe(
|
|
119620
|
+
"Whether the drag releases with momentum; default true (a constant-speed drag). Pass false to decelerate into the release point (ease-out) so an app deriving fling from pointer release velocity (carousels, drag libraries) reads ~0 and applies little to no momentum \u2014 use it when the drag must stop where it was aimed rather than fling past. Deceleration needs wall clock: under ~100ms the whole drag fits inside the velocity window a page averages over (tens of ms), so some fling survives, and under ~70ms its extra frames cannot dispatch fast enough to fit durationMs. Keep durationMs at its default when the fling must be fully suppressed."
|
|
119621
|
+
),
|
|
119622
|
+
// `momentum`'s earlier spelling, with the opposite polarity. Declared so this
|
|
119623
|
+
// non-strict object refuses it instead of stripping it and running the default.
|
|
119624
|
+
settle: external_exports.never({
|
|
119625
|
+
error: "gesture-drag's `settle` was renamed to `momentum`, with the opposite sense - write `momentum: false` for the momentum-free drag that `settle: true` used to mean (plain `settle: false` was the default, so just drop it)"
|
|
119626
|
+
}).optional().describe(
|
|
119627
|
+
"Retired: renamed to `momentum` with the opposite sense. Pass `momentum: false` for what `settle: true` meant; `settle: false` was the default, so drop the key."
|
|
119628
|
+
)
|
|
121526
119629
|
});
|
|
121527
119630
|
var capability11 = {
|
|
121528
119631
|
chromium: { app: true }
|
|
@@ -121534,9 +119637,9 @@ var gestureDragTool = {
|
|
|
121534
119637
|
completedMsg: ({ params }) => `Dragged from (${Math.round(params.fromX * 100)}%, ${Math.round(params.fromY * 100)}%) to (${Math.round(params.toX * 100)}%, ${Math.round(params.toY * 100)}%)`,
|
|
121535
119638
|
failedMsg: ({ failureSignal: failureSignal2 }) => `Failed to drag: ${failureSignal2.error_code}`
|
|
121536
119639
|
},
|
|
121537
|
-
description: `Press the left mouse button at a start point, move to an end point, and release \u2014 a desktop mouse drag in a Chromium app. All positions are normalized 0.0\u20131.0 (fractions of the window, not pixels), same coordinate space as gesture-tap and describe. Interpolates mouse-move events at ~60fps over durationMs for a natural drag.
|
|
119640
|
+
description: `Press the left mouse button at a start point, move to an end point, and release \u2014 a desktop mouse drag in a Chromium app. All positions are normalized 0.0\u20131.0 (fractions of the window, not pixels), same coordinate space as gesture-tap and describe, except that a coordinate of exactly 1.0 lands one pixel inside the window edge (gesture-tap maps it to the edge itself). Interpolates mouse-move events at ~60fps over durationMs for a natural drag (a momentum-free drag samples more finely when durationMs is short, so its ease-out has a curve).
|
|
121538
119641
|
Use for slider thumbs, drag-and-drop, text selection, or draggable UI elements. Dragging never scrolls content on desktop \u2014 use gesture-scroll for lists/pages. Chromium only \u2014 on iOS/Android use gesture-swipe.
|
|
121539
|
-
Returns { dragged: true, timestampMs }. Fails if the Chromium CDP session is not reachable for the given device.`,
|
|
119642
|
+
Pass momentum:false for a momentum-free drag that decelerates into the release, so apps that compute a fling from the pointer stream read ~0 velocity and the drag ends where it was aimed instead of flinging past it (a durationMs under ~100ms is too short for the deceleration to suppress the fling entirely). Returns { dragged: true, timestampMs }. Fails if the Chromium CDP session is not reachable for the given device.`,
|
|
121540
119643
|
alwaysLoad: true,
|
|
121541
119644
|
searchHint: "drag drop slider mouse press move release chromium select",
|
|
121542
119645
|
zodSchema: zodSchema19,
|
|
@@ -121544,15 +119647,49 @@ Returns { dragged: true, timestampMs }. Fails if the Chromium CDP session is not
|
|
|
121544
119647
|
services: (params) => ({
|
|
121545
119648
|
chromium: chromiumCdpRef(resolveDevice(params.udid))
|
|
121546
119649
|
}),
|
|
121547
|
-
async execute(services, params) {
|
|
119650
|
+
async execute(services, params, ctx) {
|
|
121548
119651
|
const timestampMs = Date.now();
|
|
121549
119652
|
const chromium = services.chromium;
|
|
121550
119653
|
await assertChromiumWindowVisible(chromium, "drag", "chromium_drag_window_hidden");
|
|
121551
119654
|
const vp = chromium.getViewport();
|
|
121552
|
-
const
|
|
121553
|
-
const
|
|
119655
|
+
const clampPx2 = (px, size) => Math.min(Math.max(px, 0), size - 1);
|
|
119656
|
+
const startPx = {
|
|
119657
|
+
x: clampPx2(params.fromX * vp.width, vp.width),
|
|
119658
|
+
y: clampPx2(params.fromY * vp.height, vp.height)
|
|
119659
|
+
};
|
|
119660
|
+
const endPx = {
|
|
119661
|
+
x: clampPx2(params.toX * vp.width, vp.width),
|
|
119662
|
+
y: clampPx2(params.toY * vp.height, vp.height)
|
|
119663
|
+
};
|
|
121554
119664
|
const durationMs = params.durationMs ?? 300;
|
|
121555
|
-
const
|
|
119665
|
+
const momentumFree = params.momentum === false;
|
|
119666
|
+
const steps = Math.max(momentumFree ? MOMENTUM_FREE_MIN_STEPS : 2, Math.round(durationMs / 16));
|
|
119667
|
+
const frameMs = durationMs / steps;
|
|
119668
|
+
const t0 = Date.now();
|
|
119669
|
+
let lastX = startPx.x;
|
|
119670
|
+
let lastY = startPx.y;
|
|
119671
|
+
const abortError = (frame) => {
|
|
119672
|
+
const err = new Error(
|
|
119673
|
+
`gesture-drag aborted - cancelled mid-drag after ${frame} of ${steps + 1} frames`
|
|
119674
|
+
);
|
|
119675
|
+
err.name = "AbortError";
|
|
119676
|
+
return err;
|
|
119677
|
+
};
|
|
119678
|
+
const releaseAndAbort = async (frame) => {
|
|
119679
|
+
const err = abortError(frame);
|
|
119680
|
+
try {
|
|
119681
|
+
await chromium.dispatchMouseEvent({
|
|
119682
|
+
type: "mouseReleased",
|
|
119683
|
+
x: lastX,
|
|
119684
|
+
y: lastY,
|
|
119685
|
+
clickCount: 1
|
|
119686
|
+
});
|
|
119687
|
+
} catch (releaseErr) {
|
|
119688
|
+
err.cause = releaseErr;
|
|
119689
|
+
}
|
|
119690
|
+
throw err;
|
|
119691
|
+
};
|
|
119692
|
+
if (ctx?.signal?.aborted) throw abortError(0);
|
|
121556
119693
|
await chromium.dispatchMouseEvent({
|
|
121557
119694
|
type: "mousePressed",
|
|
121558
119695
|
x: startPx.x,
|
|
@@ -121560,15 +119697,19 @@ Returns { dragged: true, timestampMs }. Fails if the Chromium CDP session is not
|
|
|
121560
119697
|
clickCount: 1
|
|
121561
119698
|
});
|
|
121562
119699
|
for (let i = 1; i < steps; i++) {
|
|
119700
|
+
if (ctx?.signal?.aborted) await releaseAndAbort(i);
|
|
119701
|
+
await sleep5(Math.max(0, t0 + i * frameMs - Date.now()));
|
|
121563
119702
|
const t = i / steps;
|
|
121564
|
-
|
|
121565
|
-
|
|
121566
|
-
|
|
121567
|
-
|
|
121568
|
-
|
|
121569
|
-
|
|
121570
|
-
|
|
121571
|
-
|
|
119703
|
+
const progress = momentumFree ? 1 - Math.pow(1 - t, MOMENTUM_FREE_EASE_EXPONENT2) : t;
|
|
119704
|
+
const x = startPx.x + (endPx.x - startPx.x) * progress;
|
|
119705
|
+
const y = startPx.y + (endPx.y - startPx.y) * progress;
|
|
119706
|
+
await chromium.dispatchMouseEvent({ type: "mouseMoved", x, y, button: "left" });
|
|
119707
|
+
lastX = x;
|
|
119708
|
+
lastY = y;
|
|
119709
|
+
}
|
|
119710
|
+
if (ctx?.signal?.aborted) await releaseAndAbort(steps);
|
|
119711
|
+
await sleep5(Math.max(0, t0 + durationMs - Date.now()));
|
|
119712
|
+
if (ctx?.signal?.aborted) await releaseAndAbort(steps);
|
|
121572
119713
|
await chromium.dispatchMouseEvent({
|
|
121573
119714
|
type: "mouseReleased",
|
|
121574
119715
|
x: endPx.x,
|
|
@@ -122771,12 +120912,12 @@ var shakeZodSchema = external_exports.object({
|
|
|
122771
120912
|
});
|
|
122772
120913
|
|
|
122773
120914
|
// ../tool-server/src/tools/shake/platforms/ios.ts
|
|
122774
|
-
var
|
|
122775
|
-
var
|
|
120915
|
+
var import_node_child_process26 = require("node:child_process");
|
|
120916
|
+
var import_node_util19 = require("node:util");
|
|
122776
120917
|
init_src();
|
|
122777
120918
|
|
|
122778
120919
|
// ../tool-server/src/utils/window-shake.ts
|
|
122779
|
-
var
|
|
120920
|
+
var import_node_child_process25 = require("node:child_process");
|
|
122780
120921
|
var MICROINTERACTIONS_FLAG = "microinteractions";
|
|
122781
120922
|
var AMPLITUDE = 22;
|
|
122782
120923
|
var STEPS = 60;
|
|
@@ -122882,7 +121023,7 @@ end run
|
|
|
122882
121023
|
}
|
|
122883
121024
|
function runOsascript(script) {
|
|
122884
121025
|
return new Promise((resolve12, reject) => {
|
|
122885
|
-
const child = (0,
|
|
121026
|
+
const child = (0, import_node_child_process25.execFile)(
|
|
122886
121027
|
"/usr/bin/osascript",
|
|
122887
121028
|
["-"],
|
|
122888
121029
|
{ timeout: OSASCRIPT_TIMEOUT_MS },
|
|
@@ -122975,7 +121116,7 @@ async function prepareHostWindowShake(target) {
|
|
|
122975
121116
|
}
|
|
122976
121117
|
|
|
122977
121118
|
// ../tool-server/src/tools/shake/platforms/ios.ts
|
|
122978
|
-
var
|
|
121119
|
+
var execFileAsync19 = (0, import_node_util19.promisify)(import_node_child_process26.execFile);
|
|
122979
121120
|
var SHAKE_NOTIFICATION = "com.apple.UIKit.SimulatorShake";
|
|
122980
121121
|
var SHAKE_INTERVAL_MS = 400;
|
|
122981
121122
|
var sleep11 = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
@@ -123015,7 +121156,7 @@ var iosImpl4 = {
|
|
|
123015
121156
|
if (i > 0) await sleep11(SHAKE_INTERVAL_MS);
|
|
123016
121157
|
shaker.begin();
|
|
123017
121158
|
try {
|
|
123018
|
-
await
|
|
121159
|
+
await execFileAsync19("xcrun", args, { timeout: 15e3 });
|
|
123019
121160
|
} catch (err) {
|
|
123020
121161
|
const error52 = err instanceof Error ? err : new Error(String(err));
|
|
123021
121162
|
throw shakeFailure(udid, error52.message, error52);
|
|
@@ -129788,9 +127929,9 @@ a prior tap), use individual tool calls instead.
|
|
|
129788
127929
|
Allowed tools and their args (udid is auto-injected, do NOT include it in args):
|
|
129789
127930
|
|
|
129790
127931
|
gesture-tap: { x: number, y: number, clickCount?: number } [ios/android/chromium]
|
|
129791
|
-
gesture-swipe: { fromX: number, fromY: number, toX: number, toY: number, durationMs?: number }
|
|
127932
|
+
gesture-swipe: { fromX: number, fromY: number, toX: number, toY: number, durationMs?: number, momentum?: boolean } [ios/android]
|
|
129792
127933
|
gesture-scroll: { x: number, y: number, deltaX?: number, deltaY?: number, durationMs?: number } [chromium only]
|
|
129793
|
-
gesture-drag: { fromX: number, fromY: number, toX: number, toY: number, durationMs?: number }
|
|
127934
|
+
gesture-drag: { fromX: number, fromY: number, toX: number, toY: number, durationMs?: number, momentum?: boolean } [chromium only]
|
|
129794
127935
|
gesture-custom: { events: [{ type: "Down"|"Move"|"Up", x: number, y: number, x2?: number, y2?: number, delayMs?: number }], interpolate?: number } [ios/android]
|
|
129795
127936
|
gesture-pinch: { centerX: number, centerY: number, startDistance: number, endDistance: number, endCenterX?: number, endCenterY?: number, angle?: number, durationMs?: number } [ios/android]
|
|
129796
127937
|
gesture-rotate: { centerX: number, centerY: number, radius?: number, radiusX?: number, radiusY?: number, startAngle: number, endAngle: number, durationMs?: number } [ios/android]
|
|
@@ -135733,8 +133874,8 @@ var import_util8 = require("util");
|
|
|
135733
133874
|
var DEFAULT_EXEC_TIMEOUT_MS = 6e4;
|
|
135734
133875
|
var DEFAULT_EXEC_MAX_BUFFER = 256 * 1024 * 1024;
|
|
135735
133876
|
async function execFileAsyncWithTimeout(file2, args, options = {}) {
|
|
135736
|
-
const
|
|
135737
|
-
const { stdout, stderr } = await
|
|
133877
|
+
const execFileAsync24 = (0, import_util8.promisify)(import_child_process2.execFile);
|
|
133878
|
+
const { stdout, stderr } = await execFileAsync24(file2, args, {
|
|
135738
133879
|
encoding: "utf-8",
|
|
135739
133880
|
...options,
|
|
135740
133881
|
// Applied after ...options so a caller cannot weaken the guards; maxBuffer
|
|
@@ -139747,7 +137888,7 @@ var WATERMARK_PNG_HEIGHT = 277;
|
|
|
139747
137888
|
var WATERMARK_PNG_BASE64 = "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";
|
|
139748
137889
|
|
|
139749
137890
|
// ../tool-server/src/tools/screen-recording/watermark.ts
|
|
139750
|
-
var
|
|
137891
|
+
var execFileAsync20 = (0, import_util9.promisify)(import_child_process6.execFile);
|
|
139751
137892
|
var OUTPUT_FPS = 30;
|
|
139752
137893
|
var FFMPEG_FALLBACK_PATHS = [
|
|
139753
137894
|
"/opt/homebrew/bin/ffmpeg",
|
|
@@ -139764,7 +137905,7 @@ var MASK_DARK_MAX_LUMA = 90;
|
|
|
139764
137905
|
var MASK_LIGHT_MIN_LUMA = 165;
|
|
139765
137906
|
async function resolveBinary(name, fallbacks) {
|
|
139766
137907
|
try {
|
|
139767
|
-
await
|
|
137908
|
+
await execFileAsync20("/bin/sh", ["-c", `command -v ${name}`], { timeout: 2e3 });
|
|
139768
137909
|
return name;
|
|
139769
137910
|
} catch {
|
|
139770
137911
|
}
|
|
@@ -142453,7 +140594,7 @@ Returns { stopped } - the URNs of the services that were actually live and got s
|
|
|
142453
140594
|
|
|
142454
140595
|
// ../tool-server/src/tools/simulator/stop-metro.ts
|
|
142455
140596
|
init_zod();
|
|
142456
|
-
var
|
|
140597
|
+
var import_node_child_process27 = require("node:child_process");
|
|
142457
140598
|
function parseNetstatListeningPids(netstatOutput, port) {
|
|
142458
140599
|
const pids = /* @__PURE__ */ new Set();
|
|
142459
140600
|
for (const line of netstatOutput.split(/\r?\n/)) {
|
|
@@ -142469,7 +140610,7 @@ function parseNetstatListeningPids(netstatOutput, port) {
|
|
|
142469
140610
|
}
|
|
142470
140611
|
function listeningPids(port) {
|
|
142471
140612
|
if (process.platform === "win32") {
|
|
142472
|
-
const output2 = (0,
|
|
140613
|
+
const output2 = (0, import_node_child_process27.execFileSync)("netstat", ["-ano"], {
|
|
142473
140614
|
encoding: "utf-8",
|
|
142474
140615
|
timeout: 5e3,
|
|
142475
140616
|
// `netstat -ano` dumps every socket on the host; overflowing Node's
|
|
@@ -142478,7 +140619,7 @@ function listeningPids(port) {
|
|
|
142478
140619
|
});
|
|
142479
140620
|
return parseNetstatListeningPids(output2, port);
|
|
142480
140621
|
}
|
|
142481
|
-
const output = (0,
|
|
140622
|
+
const output = (0, import_node_child_process27.execFileSync)("lsof", ["-ti", `tcp:${port}`, "-sTCP:LISTEN"], {
|
|
142482
140623
|
encoding: "utf-8",
|
|
142483
140624
|
timeout: 5e3
|
|
142484
140625
|
}).trim();
|
|
@@ -142851,6 +140992,12 @@ function chromiumLaunchSpec(launch) {
|
|
|
142851
140992
|
return typeof c === "string" ? { path: c } : { path: c.path, args: c.args };
|
|
142852
140993
|
}
|
|
142853
140994
|
function selectorToYaml(sel) {
|
|
140995
|
+
const unknown2 = Object.keys(sel).filter((key2) => !WRITABLE_SELECTOR_KEYS.includes(key2));
|
|
140996
|
+
if (unknown2.length > 0) {
|
|
140997
|
+
throw new Error(
|
|
140998
|
+
`Cannot serialize flow selector: ${describeUnknownKeys(unknown2, WRITABLE_SELECTOR_KEYS)} - allowed keys: ${WRITABLE_SELECTOR_KEYS.join(", ")}.`
|
|
140999
|
+
);
|
|
141000
|
+
}
|
|
142854
141001
|
if (sel.text !== void 0 && sel.textMatches !== void 0) {
|
|
142855
141002
|
throw new Error(
|
|
142856
141003
|
'Cannot serialize flow selector without losing constraints: both `text` and `textMatches` are set, but flow YAML can represent only one `text` constraint (a literal string or `{ matches: "<regex>" }`). Use either literal or regex text matching.'
|
|
@@ -142973,6 +141120,79 @@ function targetToYaml(step) {
|
|
|
142973
141120
|
}
|
|
142974
141121
|
return { x: step.x, y: step.y };
|
|
142975
141122
|
}
|
|
141123
|
+
function swipeTargetToYaml(target, label) {
|
|
141124
|
+
const yaml = targetToYaml(target);
|
|
141125
|
+
if (typeof yaml !== "string" && "x" in yaml && !Object.keys(target).every((key2) => key2 === "x" || key2 === "y")) {
|
|
141126
|
+
throw new Error(`Cannot serialize flow ${label}: a coordinate target takes only { x, y }`);
|
|
141127
|
+
}
|
|
141128
|
+
return yaml;
|
|
141129
|
+
}
|
|
141130
|
+
var SWIPE_MIN_TRAVEL = 0.03;
|
|
141131
|
+
var SWIPE_MIN_DURATION_MS = 150;
|
|
141132
|
+
var SWIPE_MAX_DURATION_MS = 1e4;
|
|
141133
|
+
var LONG_PRESS_MAX_DURATION_MS = SWIPE_MAX_DURATION_MS;
|
|
141134
|
+
function swipeByToYaml(by) {
|
|
141135
|
+
const keys = Object.keys(by);
|
|
141136
|
+
if (keys.some((key2) => key2 !== "x" && key2 !== "y")) {
|
|
141137
|
+
throw new Error("Cannot serialize flow swipe.by: accepts only x and y");
|
|
141138
|
+
}
|
|
141139
|
+
const axes = ["x", "y"].filter((axis) => by[axis] !== void 0);
|
|
141140
|
+
if (axes.length === 0) {
|
|
141141
|
+
throw new Error("Cannot serialize flow swipe.by: needs at least one of x or y");
|
|
141142
|
+
}
|
|
141143
|
+
const result = {};
|
|
141144
|
+
for (const axis of axes) {
|
|
141145
|
+
const value = by[axis];
|
|
141146
|
+
if (!Number.isFinite(value) || value === 0 || value < -1 || value > 1) {
|
|
141147
|
+
throw new Error(
|
|
141148
|
+
`Cannot serialize flow swipe.by.${axis}: must be a non-zero fraction of the screen between -1 and 1`
|
|
141149
|
+
);
|
|
141150
|
+
}
|
|
141151
|
+
result[axis] = value;
|
|
141152
|
+
}
|
|
141153
|
+
const magnitude = Math.hypot(result.x ?? 0, result.y ?? 0);
|
|
141154
|
+
if (magnitude < SWIPE_MIN_TRAVEL) {
|
|
141155
|
+
throw new Error(
|
|
141156
|
+
`Cannot serialize flow swipe.by: travels only ${magnitude} \u2014 below the minimum swipe travel of ${SWIPE_MIN_TRAVEL} \u2014 a travel that small is a tap, not a swipe`
|
|
141157
|
+
);
|
|
141158
|
+
}
|
|
141159
|
+
return result;
|
|
141160
|
+
}
|
|
141161
|
+
function swipeByLabel(by) {
|
|
141162
|
+
return ["x", "y"].filter((axis) => by[axis] !== void 0).map((axis) => `${axis}=${by[axis]}`).join(", ");
|
|
141163
|
+
}
|
|
141164
|
+
function isPositiveMs(raw) {
|
|
141165
|
+
return typeof raw === "number" && Number.isFinite(raw) && raw > 0;
|
|
141166
|
+
}
|
|
141167
|
+
function positiveMsToYaml(value, label) {
|
|
141168
|
+
if (!isPositiveMs(value)) {
|
|
141169
|
+
throw new Error(`Cannot serialize flow ${label}: needs a positive number of milliseconds`);
|
|
141170
|
+
}
|
|
141171
|
+
return value;
|
|
141172
|
+
}
|
|
141173
|
+
function swipeDurationToYaml(value) {
|
|
141174
|
+
const duration3 = positiveMsToYaml(value, "swipe.duration");
|
|
141175
|
+
if (duration3 < SWIPE_MIN_DURATION_MS) {
|
|
141176
|
+
throw new Error(
|
|
141177
|
+
`Cannot serialize flow swipe.duration: only ${duration3}ms \u2014 below the minimum swipe duration of ${SWIPE_MIN_DURATION_MS}ms \u2014 that leaves too few 16ms frames for the content to track the travel it was given, so it overshoots instead of landing on it`
|
|
141178
|
+
);
|
|
141179
|
+
}
|
|
141180
|
+
if (duration3 > SWIPE_MAX_DURATION_MS) {
|
|
141181
|
+
throw new Error(
|
|
141182
|
+
`Cannot serialize flow swipe.duration: ${duration3}ms - above the maximum swipe duration of ${SWIPE_MAX_DURATION_MS}ms - the step would hold a finger on the screen for exactly that long, one dispatched frame per 16ms`
|
|
141183
|
+
);
|
|
141184
|
+
}
|
|
141185
|
+
return duration3;
|
|
141186
|
+
}
|
|
141187
|
+
function longPressDurationToYaml(value) {
|
|
141188
|
+
const duration3 = positiveMsToYaml(value, "long-press.duration");
|
|
141189
|
+
if (duration3 > LONG_PRESS_MAX_DURATION_MS) {
|
|
141190
|
+
throw new Error(
|
|
141191
|
+
`Cannot serialize flow long-press.duration: ${duration3}ms - above the maximum long-press duration of ${LONG_PRESS_MAX_DURATION_MS}ms - the step would hold a finger down for exactly that long`
|
|
141192
|
+
);
|
|
141193
|
+
}
|
|
141194
|
+
return duration3;
|
|
141195
|
+
}
|
|
142976
141196
|
function waitToYaml(condition, selector, expectedText, textMatch, timeoutMs) {
|
|
142977
141197
|
const sel = selectorToYaml(selector);
|
|
142978
141198
|
let body;
|
|
@@ -142990,7 +141210,7 @@ function waitToYaml(condition, selector, expectedText, textMatch, timeoutMs) {
|
|
|
142990
141210
|
body = textWaitToYaml(sel, expectedText, textMatch);
|
|
142991
141211
|
break;
|
|
142992
141212
|
}
|
|
142993
|
-
if (timeoutMs !== void 0) body.timeout = timeoutMs;
|
|
141213
|
+
if (timeoutMs !== void 0) body.timeout = positiveMsToYaml(timeoutMs, "await.timeout");
|
|
142994
141214
|
return body;
|
|
142995
141215
|
}
|
|
142996
141216
|
function idleToYaml(step) {
|
|
@@ -143026,9 +141246,29 @@ function toYamlStep(step) {
|
|
|
143026
141246
|
case "long-press": {
|
|
143027
141247
|
const target = targetToYaml(step);
|
|
143028
141248
|
return {
|
|
143029
|
-
"long-press": step.duration !== void 0 ? { on: target, duration: step.duration } : target
|
|
141249
|
+
"long-press": step.duration !== void 0 ? { on: target, duration: longPressDurationToYaml(step.duration) } : target
|
|
143030
141250
|
};
|
|
143031
141251
|
}
|
|
141252
|
+
case "swipe": {
|
|
141253
|
+
const travels = ["direction", "to", "by"].filter((key2) => step[key2] !== void 0);
|
|
141254
|
+
if (travels.length !== 1) {
|
|
141255
|
+
throw new Error("Cannot serialize flow swipe: needs exactly one of direction, to, or by");
|
|
141256
|
+
}
|
|
141257
|
+
if (step.momentum !== void 0 && typeof step.momentum !== "boolean") {
|
|
141258
|
+
throw new Error("Cannot serialize flow swipe.momentum: must be true or false");
|
|
141259
|
+
}
|
|
141260
|
+
if (step.direction !== void 0 && step.from === void 0 && step.to === void 0 && step.by === void 0 && step.momentum !== false && step.duration === void 0) {
|
|
141261
|
+
return { swipe: step.direction };
|
|
141262
|
+
}
|
|
141263
|
+
const body = {};
|
|
141264
|
+
if (step.from !== void 0) body.from = swipeTargetToYaml(step.from, "swipe.from");
|
|
141265
|
+
if (step.direction !== void 0) body.direction = step.direction;
|
|
141266
|
+
if (step.to !== void 0) body.to = swipeTargetToYaml(step.to, "swipe.to");
|
|
141267
|
+
if (step.by !== void 0) body.by = swipeByToYaml(step.by);
|
|
141268
|
+
if (step.momentum === false) body.momentum = false;
|
|
141269
|
+
if (step.duration !== void 0) body.duration = swipeDurationToYaml(step.duration);
|
|
141270
|
+
return { swipe: body };
|
|
141271
|
+
}
|
|
143032
141272
|
case "type": {
|
|
143033
141273
|
const body = {
|
|
143034
141274
|
into: selectorToYaml(step.into),
|
|
@@ -143121,6 +141361,12 @@ function badEntry(raw, detail) {
|
|
|
143121
141361
|
error_kind: "validation"
|
|
143122
141362
|
});
|
|
143123
141363
|
}
|
|
141364
|
+
function parsePositiveMs(raw, entry, label, example) {
|
|
141365
|
+
if (!isPositiveMs(raw)) {
|
|
141366
|
+
badEntry(entry, `${label} needs a positive number of milliseconds (e.g. \`${example}\`)`);
|
|
141367
|
+
}
|
|
141368
|
+
return raw;
|
|
141369
|
+
}
|
|
143124
141370
|
function validatePattern(raw, pattern, where) {
|
|
143125
141371
|
try {
|
|
143126
141372
|
new RegExp(pattern);
|
|
@@ -143184,6 +141430,17 @@ var SELECTOR_KEYS = [
|
|
|
143184
141430
|
"any",
|
|
143185
141431
|
...SELECTOR_RELATIONS
|
|
143186
141432
|
];
|
|
141433
|
+
var WRITABLE_SELECTOR_KEYS = Object.keys({
|
|
141434
|
+
text: true,
|
|
141435
|
+
textMatches: true,
|
|
141436
|
+
identifier: true,
|
|
141437
|
+
role: true,
|
|
141438
|
+
any: true,
|
|
141439
|
+
loose: true,
|
|
141440
|
+
within: true,
|
|
141441
|
+
after: true,
|
|
141442
|
+
next: true
|
|
141443
|
+
});
|
|
143187
141444
|
var MAX_SELECTOR_SCOPES = 6;
|
|
143188
141445
|
function parseSelector(raw, where, budget = { scopes: MAX_SELECTOR_SCOPES }) {
|
|
143189
141446
|
if (budget.scopes < 0) {
|
|
@@ -143314,7 +141571,7 @@ function parseWaitFields(raw, kind) {
|
|
|
143314
141571
|
"assert has no timeout \u2014 it is an immediate check; use `await` for a timed wait"
|
|
143315
141572
|
);
|
|
143316
141573
|
}
|
|
143317
|
-
timeout =
|
|
141574
|
+
timeout = parsePositiveMs(b.timeout, { [kind]: b }, "await.timeout", "timeout: 10000");
|
|
143318
141575
|
}
|
|
143319
141576
|
rejectUnknownKeys(
|
|
143320
141577
|
{ [kind]: b },
|
|
@@ -143483,6 +141740,7 @@ var STEP_DIRECTIVE_KEYS = [
|
|
|
143483
141740
|
"tool",
|
|
143484
141741
|
"tap",
|
|
143485
141742
|
"long-press",
|
|
141743
|
+
"swipe",
|
|
143486
141744
|
"type",
|
|
143487
141745
|
"await",
|
|
143488
141746
|
"assert",
|
|
@@ -143581,13 +141839,19 @@ function parseLongPress(body, entry) {
|
|
|
143581
141839
|
}
|
|
143582
141840
|
const step = { kind: "long-press", ...parseTarget(obj.on, "long-press.on") };
|
|
143583
141841
|
if (obj.duration !== void 0) {
|
|
143584
|
-
|
|
141842
|
+
const duration3 = parsePositiveMs(
|
|
141843
|
+
obj.duration,
|
|
141844
|
+
entry,
|
|
141845
|
+
"long-press.duration",
|
|
141846
|
+
"duration: 1200"
|
|
141847
|
+
);
|
|
141848
|
+
if (duration3 > LONG_PRESS_MAX_DURATION_MS) {
|
|
143585
141849
|
badEntry(
|
|
143586
141850
|
entry,
|
|
143587
|
-
|
|
141851
|
+
`long-press.duration is ${duration3}ms - above the maximum long-press duration of ${LONG_PRESS_MAX_DURATION_MS}ms; the step holds a finger down for exactly that long, and on Chromium it dispatches a gesture-drag that refuses more`
|
|
143588
141852
|
);
|
|
143589
141853
|
}
|
|
143590
|
-
step.duration =
|
|
141854
|
+
step.duration = duration3;
|
|
143591
141855
|
}
|
|
143592
141856
|
return step;
|
|
143593
141857
|
}
|
|
@@ -143757,6 +142021,116 @@ function completeRunExtension(value) {
|
|
|
143757
142021
|
const candidate = `${value}.yaml`;
|
|
143758
142022
|
return FLOW_FILE_NAME_PATTERN.test(path32.posix.basename(candidate)) ? candidate : value;
|
|
143759
142023
|
}
|
|
142024
|
+
var SWIPE_DIRECTIONS = ["up", "down", "left", "right"];
|
|
142025
|
+
var SWIPE_OPTION_KEYS = ["from", "direction", "to", "by", "momentum", "duration"];
|
|
142026
|
+
function parseSwipeBy(raw, entry) {
|
|
142027
|
+
if (raw === null || typeof raw !== "object") {
|
|
142028
|
+
badEntry(entry, "swipe.by needs { x } and/or { y } \u2014 signed 0\u20131 fractions of the screen");
|
|
142029
|
+
}
|
|
142030
|
+
const obj = raw;
|
|
142031
|
+
rejectUnknownKeys(entry, obj, ["x", "y"], "swipe.by");
|
|
142032
|
+
if (obj.x === void 0 && obj.y === void 0) {
|
|
142033
|
+
badEntry(entry, "swipe.by needs at least one of x, y");
|
|
142034
|
+
}
|
|
142035
|
+
const by = {};
|
|
142036
|
+
for (const axis of ["x", "y"]) {
|
|
142037
|
+
const v = obj[axis];
|
|
142038
|
+
if (v === void 0) continue;
|
|
142039
|
+
if (typeof v !== "number" || !Number.isFinite(v) || v === 0 || v < -1 || v > 1) {
|
|
142040
|
+
badEntry(
|
|
142041
|
+
entry,
|
|
142042
|
+
`swipe.by.${axis} must be a non-zero fraction of the screen between -1 and 1 (omit the axis instead of 0)`
|
|
142043
|
+
);
|
|
142044
|
+
}
|
|
142045
|
+
by[axis] = v;
|
|
142046
|
+
}
|
|
142047
|
+
const magnitude = Math.hypot(by.x ?? 0, by.y ?? 0);
|
|
142048
|
+
if (magnitude < SWIPE_MIN_TRAVEL) {
|
|
142049
|
+
badEntry(
|
|
142050
|
+
entry,
|
|
142051
|
+
`swipe.by travels only ${magnitude} \u2014 below the minimum swipe travel of ${SWIPE_MIN_TRAVEL}; a travel that small is a tap, not a swipe`
|
|
142052
|
+
);
|
|
142053
|
+
}
|
|
142054
|
+
return by;
|
|
142055
|
+
}
|
|
142056
|
+
function parseSwipe(body, entry) {
|
|
142057
|
+
if (typeof body === "string") {
|
|
142058
|
+
if (!SWIPE_DIRECTIONS.includes(body)) {
|
|
142059
|
+
badEntry(
|
|
142060
|
+
entry,
|
|
142061
|
+
`swipe takes a direction (${SWIPE_DIRECTIONS.join(", ")}) \u2014 to anchor on an element use swipe: { from: <target>, direction: \u2026 }`
|
|
142062
|
+
);
|
|
142063
|
+
}
|
|
142064
|
+
return { kind: "swipe", direction: body };
|
|
142065
|
+
}
|
|
142066
|
+
if (body === null || typeof body !== "object") {
|
|
142067
|
+
badEntry(entry, `swipe needs a direction (${SWIPE_DIRECTIONS.join(", ")}) or an options map`);
|
|
142068
|
+
}
|
|
142069
|
+
const obj = body;
|
|
142070
|
+
if (hasSelectorField(obj)) {
|
|
142071
|
+
badEntry(
|
|
142072
|
+
entry,
|
|
142073
|
+
'the swipe options form takes a nested target \u2014 e.g. swipe: { from: { text: "Card" }, direction: left }'
|
|
142074
|
+
);
|
|
142075
|
+
}
|
|
142076
|
+
if (obj.x !== void 0 || obj.y !== void 0) {
|
|
142077
|
+
badEntry(
|
|
142078
|
+
entry,
|
|
142079
|
+
"the swipe options form takes a nested point \u2014 e.g. swipe: { from: { x: 0.5, y: 0.5 }, direction: left }"
|
|
142080
|
+
);
|
|
142081
|
+
}
|
|
142082
|
+
if (obj.settle !== void 0) {
|
|
142083
|
+
badEntry(
|
|
142084
|
+
entry,
|
|
142085
|
+
"swipe.settle was renamed to swipe.momentum, with the opposite sense \u2014 write `momentum: false` for the momentum-free swipe that `settle: true` used to mean (plain `settle: false` was the default, so just drop it)"
|
|
142086
|
+
);
|
|
142087
|
+
}
|
|
142088
|
+
rejectUnknownKeys(entry, obj, SWIPE_OPTION_KEYS, "swipe");
|
|
142089
|
+
const travels = ["direction", "to", "by"].filter((k) => obj[k] !== void 0);
|
|
142090
|
+
if (travels.length !== 1) {
|
|
142091
|
+
badEntry(entry, "swipe needs exactly one of `direction`, `to`, or `by`");
|
|
142092
|
+
}
|
|
142093
|
+
const step = { kind: "swipe" };
|
|
142094
|
+
if (obj.from !== void 0) step.from = parseTarget(obj.from, "swipe.from");
|
|
142095
|
+
switch (travels[0]) {
|
|
142096
|
+
case "direction": {
|
|
142097
|
+
if (typeof obj.direction !== "string" || !SWIPE_DIRECTIONS.includes(obj.direction)) {
|
|
142098
|
+
badEntry(entry, `swipe.direction must be one of ${SWIPE_DIRECTIONS.join(", ")}`);
|
|
142099
|
+
}
|
|
142100
|
+
step.direction = obj.direction;
|
|
142101
|
+
break;
|
|
142102
|
+
}
|
|
142103
|
+
case "to":
|
|
142104
|
+
step.to = parseTarget(obj.to, "swipe.to");
|
|
142105
|
+
break;
|
|
142106
|
+
case "by":
|
|
142107
|
+
step.by = parseSwipeBy(obj.by, entry);
|
|
142108
|
+
break;
|
|
142109
|
+
}
|
|
142110
|
+
if (obj.momentum !== void 0) {
|
|
142111
|
+
if (typeof obj.momentum !== "boolean") {
|
|
142112
|
+
badEntry(entry, "swipe.momentum must be true or false");
|
|
142113
|
+
}
|
|
142114
|
+
if (!obj.momentum) step.momentum = false;
|
|
142115
|
+
}
|
|
142116
|
+
if (obj.duration !== void 0) {
|
|
142117
|
+
const duration3 = parsePositiveMs(obj.duration, entry, "swipe.duration", "duration: 800");
|
|
142118
|
+
if (duration3 < SWIPE_MIN_DURATION_MS) {
|
|
142119
|
+
badEntry(
|
|
142120
|
+
entry,
|
|
142121
|
+
`swipe.duration is only ${duration3}ms \u2014 below the minimum swipe duration of ${SWIPE_MIN_DURATION_MS}ms; that leaves too few 16ms frames for the content to track the travel it was given, so it overshoots instead of landing on it`
|
|
142122
|
+
);
|
|
142123
|
+
}
|
|
142124
|
+
if (duration3 > SWIPE_MAX_DURATION_MS) {
|
|
142125
|
+
badEntry(
|
|
142126
|
+
entry,
|
|
142127
|
+
`swipe.duration is ${duration3}ms - above the maximum swipe duration of ${SWIPE_MAX_DURATION_MS}ms; the step holds a finger on the screen for exactly that long, one dispatched frame per 16ms, and nothing outside the run can cut it short`
|
|
142128
|
+
);
|
|
142129
|
+
}
|
|
142130
|
+
step.duration = duration3;
|
|
142131
|
+
}
|
|
142132
|
+
return step;
|
|
142133
|
+
}
|
|
143760
142134
|
function fromYamlStep(raw, blockDepth = 0) {
|
|
143761
142135
|
const entry = raw;
|
|
143762
142136
|
if ("optional" in raw) {
|
|
@@ -143798,6 +142172,7 @@ function fromYamlStep(raw, blockDepth = 0) {
|
|
|
143798
142172
|
if ("long-press" in raw) {
|
|
143799
142173
|
return parseLongPress(raw["long-press"], raw);
|
|
143800
142174
|
}
|
|
142175
|
+
if ("swipe" in raw) return parseSwipe(raw.swipe, raw);
|
|
143801
142176
|
if ("type" in raw) {
|
|
143802
142177
|
const body = raw.type;
|
|
143803
142178
|
if (!body || typeof body !== "object") badEntry(raw, "type needs { into, text }");
|
|
@@ -144414,6 +142789,7 @@ function stepRequiresDevice(registry2, step) {
|
|
|
144414
142789
|
case "launch":
|
|
144415
142790
|
case "tap":
|
|
144416
142791
|
case "long-press":
|
|
142792
|
+
case "swipe":
|
|
144417
142793
|
case "type":
|
|
144418
142794
|
case "await":
|
|
144419
142795
|
case "assert":
|
|
@@ -145255,22 +143631,32 @@ async function settleTree(env, opts = {}) {
|
|
|
145255
143631
|
if (!await sleepOrAbort(SETTLE_POLL_MS, env.signal)) return void 0;
|
|
145256
143632
|
}
|
|
145257
143633
|
}
|
|
145258
|
-
async function
|
|
143634
|
+
async function waitForFrames(env, selectors) {
|
|
143635
|
+
const pending = selectors.flatMap((selector, i) => selector ? [{ i, selector }] : []);
|
|
143636
|
+
if (pending.length === 0) return selectors.map(() => void 0);
|
|
145259
143637
|
const deadline = Date.now() + DEFAULT_ACTION_TIMEOUT_MS;
|
|
143638
|
+
let unresolved = pending[0].selector;
|
|
145260
143639
|
for (; ; ) {
|
|
145261
143640
|
if (env.signal?.aborted) return "aborted";
|
|
145262
143641
|
const tree = await settleTree(env);
|
|
145263
143642
|
if (tree) {
|
|
145264
|
-
const
|
|
145265
|
-
|
|
143643
|
+
const frames = selectors.map((s) => s ? flowSelectorToFrame(tree, s) : void 0);
|
|
143644
|
+
const missing = pending.find(({ i }) => frames[i] === void 0);
|
|
143645
|
+
if (!missing) return frames;
|
|
143646
|
+
unresolved = missing.selector;
|
|
145266
143647
|
} else if (env.signal?.aborted) {
|
|
145267
143648
|
return "aborted";
|
|
145268
143649
|
}
|
|
145269
|
-
if (Date.now() >= deadline) return
|
|
143650
|
+
if (Date.now() >= deadline) return { unresolved };
|
|
145270
143651
|
const sleepMs = Math.min(POLL_INTERVAL_MS, Math.max(0, deadline - Date.now()));
|
|
145271
143652
|
if (!await sleepOrAbort(sleepMs, env.signal)) return "aborted";
|
|
145272
143653
|
}
|
|
145273
143654
|
}
|
|
143655
|
+
async function waitForFrame(env, selector) {
|
|
143656
|
+
const frames = await waitForFrames(env, [selector]);
|
|
143657
|
+
if (frames === "aborted") return "aborted";
|
|
143658
|
+
return Array.isArray(frames) ? frames[0] : void 0;
|
|
143659
|
+
}
|
|
145274
143660
|
function framesOverlap(a, b) {
|
|
145275
143661
|
return a.x < b.x + b.width && b.x < a.x + a.width && a.y < b.y + b.height && b.y < a.y + a.height;
|
|
145276
143662
|
}
|
|
@@ -145334,14 +143720,19 @@ async function scrollIncrement(env, direction, region) {
|
|
|
145334
143720
|
to = { x: clamp014(cx + dist), y: cy };
|
|
145335
143721
|
break;
|
|
145336
143722
|
}
|
|
145337
|
-
|
|
145338
|
-
|
|
145339
|
-
|
|
145340
|
-
|
|
145341
|
-
|
|
145342
|
-
|
|
145343
|
-
|
|
145344
|
-
|
|
143723
|
+
try {
|
|
143724
|
+
await invokeOnDevice(env, "gesture-swipe", {
|
|
143725
|
+
fromX: cx,
|
|
143726
|
+
fromY: cy,
|
|
143727
|
+
toX: to.x,
|
|
143728
|
+
toY: to.y,
|
|
143729
|
+
momentum: false,
|
|
143730
|
+
durationMs: 600
|
|
143731
|
+
});
|
|
143732
|
+
} catch (err) {
|
|
143733
|
+
if (env.signal?.aborted) return;
|
|
143734
|
+
throw err;
|
|
143735
|
+
}
|
|
145345
143736
|
}
|
|
145346
143737
|
async function scrollToVisible(env, target, direction, within) {
|
|
145347
143738
|
let prevFp;
|
|
@@ -145375,7 +143766,7 @@ function offscreenHint(sel) {
|
|
|
145375
143766
|
return `no visible element matched selector ${describeSelector(sel)} \u2014 if it is off-screen, add a scroll-to step before this one`;
|
|
145376
143767
|
}
|
|
145377
143768
|
async function runDirective(env, step) {
|
|
145378
|
-
if (env.device.platform === "vega" && (step.kind === "tap" || step.kind === "long-press" || step.kind === "type" || step.kind === "scroll-to" || step.kind === "pinch" || step.kind === "rotate")) {
|
|
143769
|
+
if (env.device.platform === "vega" && (step.kind === "tap" || step.kind === "long-press" || step.kind === "swipe" || step.kind === "type" || step.kind === "scroll-to" || step.kind === "pinch" || step.kind === "rotate")) {
|
|
145379
143770
|
return {
|
|
145380
143771
|
ok: false,
|
|
145381
143772
|
reason: `${step.kind} is a touch directive and Vega is remote-driven \u2014 move focus with \`tool: tv-remote\` steps (and type via \`tool: keyboard\`) instead`
|
|
@@ -145392,6 +143783,8 @@ async function runDirective(env, step) {
|
|
|
145392
143783
|
return runTap(env, step);
|
|
145393
143784
|
case "long-press":
|
|
145394
143785
|
return runLongPress(env, step);
|
|
143786
|
+
case "swipe":
|
|
143787
|
+
return runSwipe(env, step);
|
|
145395
143788
|
case "type":
|
|
145396
143789
|
return runType(env, step);
|
|
145397
143790
|
case "await":
|
|
@@ -145439,10 +143832,16 @@ async function resolveTargetPoint(env, target) {
|
|
|
145439
143832
|
}
|
|
145440
143833
|
return { point: getDescribeTapPoint(frame) };
|
|
145441
143834
|
}
|
|
143835
|
+
const point = targetPointFromFrame(target, void 0);
|
|
143836
|
+
if ("fail" in point) return point;
|
|
143837
|
+
const settle = await settleForGesture(env);
|
|
143838
|
+
if (settle.aborted) return { fail: ABORTED_OUTCOME };
|
|
143839
|
+
return { point, ...warned(settle) };
|
|
143840
|
+
}
|
|
143841
|
+
function targetPointFromFrame(target, frame) {
|
|
143842
|
+
if (frame) return getDescribeTapPoint(frame);
|
|
145442
143843
|
if (typeof target.x === "number" && typeof target.y === "number") {
|
|
145443
|
-
|
|
145444
|
-
if (settle.aborted) return { fail: ABORTED_OUTCOME };
|
|
145445
|
-
return { point: { x: target.x, y: target.y }, ...warned(settle) };
|
|
143844
|
+
return { x: target.x, y: target.y };
|
|
145446
143845
|
}
|
|
145447
143846
|
return { fail: { ok: false, reason: "gesture needs a selector or x/y coordinates" } };
|
|
145448
143847
|
}
|
|
@@ -145462,13 +143861,18 @@ async function runLongPress(env, step) {
|
|
|
145462
143861
|
const point = resolved.point;
|
|
145463
143862
|
const duration3 = step.duration ?? DEFAULT_LONG_PRESS_MS;
|
|
145464
143863
|
if (env.device.platform === "chromium") {
|
|
145465
|
-
|
|
145466
|
-
|
|
145467
|
-
|
|
145468
|
-
|
|
145469
|
-
|
|
145470
|
-
|
|
145471
|
-
|
|
143864
|
+
try {
|
|
143865
|
+
await invokeOnDevice(env, "gesture-drag", {
|
|
143866
|
+
fromX: point.x,
|
|
143867
|
+
fromY: point.y,
|
|
143868
|
+
toX: point.x,
|
|
143869
|
+
toY: point.y,
|
|
143870
|
+
durationMs: duration3
|
|
143871
|
+
});
|
|
143872
|
+
} catch (err) {
|
|
143873
|
+
if (env.signal?.aborted) return ABORTED_OUTCOME;
|
|
143874
|
+
throw err;
|
|
143875
|
+
}
|
|
145472
143876
|
} else {
|
|
145473
143877
|
await invokeOnDevice(env, "gesture-custom", {
|
|
145474
143878
|
events: [
|
|
@@ -145588,6 +143992,132 @@ async function runRotate(env, step) {
|
|
|
145588
143992
|
}
|
|
145589
143993
|
return { ok: true, ...warned(settle) };
|
|
145590
143994
|
}
|
|
143995
|
+
var SWIPE_GEOMETRY = {
|
|
143996
|
+
left: { start: { x: 0.9, y: 0.5 }, axis: "x", end: 0.1 },
|
|
143997
|
+
right: { start: { x: 0.1, y: 0.5 }, axis: "x", end: 0.9 },
|
|
143998
|
+
down: { start: { x: 0.5, y: 0.2 }, axis: "y", end: 0.9 },
|
|
143999
|
+
up: { start: { x: 0.5, y: 0.5 }, axis: "y", end: 0.1 }
|
|
144000
|
+
};
|
|
144001
|
+
async function runSwipe(env, step) {
|
|
144002
|
+
const ends = [step.from, step.to];
|
|
144003
|
+
const selectors = ends.map((end2) => end2 && "selector" in end2 ? end2.selector : void 0);
|
|
144004
|
+
const frames = await waitForFrames(env, selectors);
|
|
144005
|
+
if (frames === "aborted") return ABORTED_OUTCOME;
|
|
144006
|
+
if (!Array.isArray(frames)) return { ok: false, reason: offscreenHint(frames.unresolved) };
|
|
144007
|
+
const [fromFrame, toFrame] = frames;
|
|
144008
|
+
let settle = {};
|
|
144009
|
+
if (selectors.every((selector) => selector === void 0)) {
|
|
144010
|
+
settle = await settleForGesture(env);
|
|
144011
|
+
if (settle.aborted) return ABORTED_OUTCOME;
|
|
144012
|
+
}
|
|
144013
|
+
let toPoint;
|
|
144014
|
+
if (step.to) {
|
|
144015
|
+
const p = targetPointFromFrame(step.to, toFrame);
|
|
144016
|
+
if ("fail" in p) return p.fail;
|
|
144017
|
+
toPoint = p;
|
|
144018
|
+
}
|
|
144019
|
+
let start2;
|
|
144020
|
+
if (step.from) {
|
|
144021
|
+
const p = targetPointFromFrame(step.from, fromFrame);
|
|
144022
|
+
if ("fail" in p) return p.fail;
|
|
144023
|
+
start2 = p;
|
|
144024
|
+
} else if (step.direction) {
|
|
144025
|
+
start2 = { ...SWIPE_GEOMETRY[step.direction].start };
|
|
144026
|
+
} else {
|
|
144027
|
+
start2 = { x: 0.5, y: 0.5 };
|
|
144028
|
+
}
|
|
144029
|
+
if (!Number.isFinite(start2.x) || start2.x < 0 || start2.x > 1 || !Number.isFinite(start2.y) || start2.y < 0 || start2.y > 1) {
|
|
144030
|
+
return {
|
|
144031
|
+
ok: false,
|
|
144032
|
+
reason: `swipe.from resolved outside the normalized screen: (${start2.x}, ${start2.y}); both coordinates must be between 0 and 1`
|
|
144033
|
+
};
|
|
144034
|
+
}
|
|
144035
|
+
let end;
|
|
144036
|
+
if (step.direction) {
|
|
144037
|
+
const g = SWIPE_GEOMETRY[step.direction];
|
|
144038
|
+
const startOnTravelAxis = start2[g.axis];
|
|
144039
|
+
const endOnTravelAxis = step.from ? clamp014(startOnTravelAxis + (g.end - g.start[g.axis])) : g.end;
|
|
144040
|
+
end = g.axis === "x" ? { x: endOnTravelAxis, y: start2.y } : { x: start2.x, y: endOnTravelAxis };
|
|
144041
|
+
const travel2 = Math.abs(endOnTravelAxis - startOnTravelAxis);
|
|
144042
|
+
if (travel2 < SWIPE_MIN_TRAVEL) {
|
|
144043
|
+
return {
|
|
144044
|
+
ok: false,
|
|
144045
|
+
reason: `cannot swipe ${step.direction} from ${g.axis}=${startOnTravelAxis}: only ${travel2} of travel to the screen edge, less than the minimum swipe travel of ${SWIPE_MIN_TRAVEL} \u2014 a tap, not a swipe`
|
|
144046
|
+
};
|
|
144047
|
+
}
|
|
144048
|
+
} else if (step.by) {
|
|
144049
|
+
const overflowAxis = ["x", "y"].find((axis) => {
|
|
144050
|
+
const d = step.by[axis];
|
|
144051
|
+
return d !== void 0 && (start2[axis] + d < 0 || start2[axis] + d > 1);
|
|
144052
|
+
});
|
|
144053
|
+
if (overflowAxis === void 0) {
|
|
144054
|
+
end = {
|
|
144055
|
+
x: step.by.x !== void 0 ? start2.x + step.by.x : start2.x,
|
|
144056
|
+
y: step.by.y !== void 0 ? start2.y + step.by.y : start2.y
|
|
144057
|
+
};
|
|
144058
|
+
} else if (step.from) {
|
|
144059
|
+
const requested = step.by[overflowAxis];
|
|
144060
|
+
const raw = start2[overflowAxis] + requested;
|
|
144061
|
+
return {
|
|
144062
|
+
ok: false,
|
|
144063
|
+
reason: `swipe.by.${overflowAxis} of ${requested} from ${overflowAxis}=${start2[overflowAxis]} lands at ${raw}, off the normalized screen; reduce the delta so from + by stays within [0, 1]`
|
|
144064
|
+
};
|
|
144065
|
+
} else {
|
|
144066
|
+
end = { x: start2.x, y: start2.y };
|
|
144067
|
+
for (const axis of ["x", "y"]) {
|
|
144068
|
+
const d = step.by[axis];
|
|
144069
|
+
if (d === void 0) {
|
|
144070
|
+
end[axis] = start2[axis];
|
|
144071
|
+
continue;
|
|
144072
|
+
}
|
|
144073
|
+
const s = start2[axis];
|
|
144074
|
+
const lo = Math.min(s, s + d);
|
|
144075
|
+
const hi = Math.max(s, s + d);
|
|
144076
|
+
const shift = lo < 0 ? -lo : hi > 1 ? 1 - hi : 0;
|
|
144077
|
+
start2[axis] = s + shift;
|
|
144078
|
+
end[axis] = s + d + shift;
|
|
144079
|
+
}
|
|
144080
|
+
}
|
|
144081
|
+
} else {
|
|
144082
|
+
end = toPoint;
|
|
144083
|
+
if (!Number.isFinite(end.x) || end.x < 0 || end.x > 1 || !Number.isFinite(end.y) || end.y < 0 || end.y > 1) {
|
|
144084
|
+
return {
|
|
144085
|
+
ok: false,
|
|
144086
|
+
reason: `swipe.to resolved outside the normalized screen: (${end.x}, ${end.y}); both coordinates must be between 0 and 1`
|
|
144087
|
+
};
|
|
144088
|
+
}
|
|
144089
|
+
if (Math.hypot(end.x - start2.x, end.y - start2.y) < SWIPE_MIN_TRAVEL) {
|
|
144090
|
+
return {
|
|
144091
|
+
ok: false,
|
|
144092
|
+
reason: `swipe.to (${end.x}, ${end.y}) resolved within the minimum swipe travel of the start point (${start2.x}, ${start2.y}); aim it at a point or element farther from the start`
|
|
144093
|
+
};
|
|
144094
|
+
}
|
|
144095
|
+
}
|
|
144096
|
+
const travel = {
|
|
144097
|
+
fromX: start2.x,
|
|
144098
|
+
fromY: start2.y,
|
|
144099
|
+
toX: end.x,
|
|
144100
|
+
toY: end.y,
|
|
144101
|
+
...step.duration !== void 0 ? { durationMs: step.duration } : {},
|
|
144102
|
+
...step.momentum === false ? { momentum: false } : {}
|
|
144103
|
+
};
|
|
144104
|
+
try {
|
|
144105
|
+
await invokeOnDevice(
|
|
144106
|
+
env,
|
|
144107
|
+
env.device.platform === "chromium" ? "gesture-drag" : "gesture-swipe",
|
|
144108
|
+
travel
|
|
144109
|
+
);
|
|
144110
|
+
} catch (err) {
|
|
144111
|
+
if (env.signal?.aborted) return ABORTED_OUTCOME;
|
|
144112
|
+
throw err;
|
|
144113
|
+
}
|
|
144114
|
+
try {
|
|
144115
|
+
await settleTree(env);
|
|
144116
|
+
} catch {
|
|
144117
|
+
}
|
|
144118
|
+
if (env.signal?.aborted) return ABORTED_OUTCOME;
|
|
144119
|
+
return { ok: true, ...warned(settle) };
|
|
144120
|
+
}
|
|
145591
144121
|
async function runType(env, step) {
|
|
145592
144122
|
const frame = await waitForFrame(env, step.into);
|
|
145593
144123
|
if (frame === "aborted") return ABORTED_OUTCOME;
|
|
@@ -145919,6 +144449,9 @@ function textConditionLabel(sel, expectedText, textMatch) {
|
|
|
145919
144449
|
const expected = expectedText ?? "";
|
|
145920
144450
|
return textMatch === "matches" ? `text ${selector} matches /${expected}/` : textMatch === "equals" ? `text ${selector} == ${JSON.stringify(expected)}` : `text ${selector} contains ${JSON.stringify(expected)}`;
|
|
145921
144451
|
}
|
|
144452
|
+
function targetLabel(target) {
|
|
144453
|
+
return "selector" in target ? selectorLabel(target.selector) : `(${target.x}, ${target.y})`;
|
|
144454
|
+
}
|
|
145922
144455
|
var zodSchema62 = external_exports.object({
|
|
145923
144456
|
name: external_exports.string().describe("Name of the flow being recorded \u2014 the one passed to flow-start-recording."),
|
|
145924
144457
|
project_root: external_exports.string().describe(
|
|
@@ -146046,11 +144579,23 @@ function summarizeStep(step, n) {
|
|
|
146046
144579
|
return `${n}. run: ${step.flow}`;
|
|
146047
144580
|
case "tap":
|
|
146048
144581
|
case "long-press": {
|
|
146049
|
-
const target =
|
|
144582
|
+
const target = targetLabel(
|
|
144583
|
+
step.selector ? { selector: step.selector } : { x: step.x, y: step.y }
|
|
144584
|
+
);
|
|
146050
144585
|
const times = step.kind === "tap" && step.times !== void 0 && step.times > 1 ? ` \xD7${step.times}` : "";
|
|
146051
144586
|
const held = step.kind === "long-press" && step.duration !== void 0 ? ` for ${step.duration}ms` : "";
|
|
146052
144587
|
return `${n}. ${step.kind}: ${target}${times}${held}`;
|
|
146053
144588
|
}
|
|
144589
|
+
case "swipe": {
|
|
144590
|
+
const travel = step.direction ?? (step.by ? `by ${swipeByLabel(step.by)}` : `to ${targetLabel(step.to)}`);
|
|
144591
|
+
const from2 = step.from ? ` from ${targetLabel(step.from)}` : "";
|
|
144592
|
+
const options = [
|
|
144593
|
+
...step.momentum === false ? ["momentum-free"] : [],
|
|
144594
|
+
...step.duration !== void 0 ? [`${step.duration}ms`] : []
|
|
144595
|
+
];
|
|
144596
|
+
const tail = options.length > 0 ? ` (${options.join(", ")})` : "";
|
|
144597
|
+
return `${n}. swipe: ${travel}${from2}${tail}`;
|
|
144598
|
+
}
|
|
146054
144599
|
case "type":
|
|
146055
144600
|
return `${n}. type: ${selectorLabel(step.into)} \u2190 "${step.text}"`;
|
|
146056
144601
|
case "await":
|
|
@@ -146092,7 +144637,7 @@ var zodSchema63 = external_exports.object({
|
|
|
146092
144637
|
"Absolute path to the project root of the flow being recorded \u2014 the same value passed to flow-start-recording. Together with `name` it identifies which recording this step belongs to."
|
|
146093
144638
|
),
|
|
146094
144639
|
command: external_exports.string().describe(
|
|
146095
|
-
'MCP tool name (e.g. "gesture-tap", "screenshot", "launch-app") \u2014 a TOOL, not a flow directive. A flow-file directive name ("tap", "launch", "run", "type", "await", "assert", "pinch", "echo", "wait", "long-press", "scroll-to", "snapshot", "when") is answered with guidance, and nothing runs or is recorded: most name the tool that records the directive, while "wait", "long-press", "scroll-to", "snapshot" and "when" have no recording tool at all and are answered with what to do instead. A recording tool (flow-add-step, flow-add-echo, flow-start-recording, flow-finish-recording) is refused the same way, each for its own reason \u2014 nesting one would erase this flow at replay, end the take, or write the step twice.'
|
|
144640
|
+
'MCP tool name (e.g. "gesture-tap", "screenshot", "launch-app") \u2014 a TOOL, not a flow directive. A flow-file directive name ("tap", "launch", "run", "type", "await", "assert", "pinch", "swipe", "echo", "wait", "long-press", "scroll-to", "snapshot", "when") is answered with guidance, and nothing runs or is recorded: most name the tool that records the directive, while "wait", "long-press", "scroll-to", "snapshot" and "when" have no recording tool at all and are answered with what to do instead. A recording tool (flow-add-step, flow-add-echo, flow-start-recording, flow-finish-recording) is refused the same way, each for its own reason \u2014 nesting one would erase this flow at replay, end the take, or write the step twice.'
|
|
146096
144641
|
),
|
|
146097
144642
|
args: external_exports.string().optional().describe(
|
|
146098
144643
|
`Tool arguments as a JSON string, e.g. '{"udid": "ABC", "x": 0.5, "y": 0.3}'. Omit for tools with no arguments.`
|
|
@@ -146346,6 +144891,9 @@ function isToolNotFound(err, command) {
|
|
|
146346
144891
|
return err instanceof ToolNotFoundError && err.toolId === command;
|
|
146347
144892
|
}
|
|
146348
144893
|
function directiveCommandHint(command) {
|
|
144894
|
+
if (command === "swipe") {
|
|
144895
|
+
return `"swipe" is a flow directive, not a tool. Record the movement by calling \`gesture-swipe\` (\`gesture-drag\` on chromium, where gesture-swipe is not supported) through flow-add-step. It is stored as the raw \`tool:\` step for whichever one you called; converting it to \`swipe:\` is part of the polish pass.`;
|
|
144896
|
+
}
|
|
146349
144897
|
if (command === "echo") {
|
|
146350
144898
|
return `"echo" is a flow directive, not a tool. Call \`flow-add-echo\` DIRECTLY \u2014 not through flow-add-step, which would run it as a nested tool AND record a \`tool: flow-add-echo\` step that fails on every replay.`;
|
|
146351
144899
|
}
|
|
@@ -146731,7 +145279,7 @@ var import_pngjs3 = __toESM(require_png());
|
|
|
146731
145279
|
// ../tool-server/src/tools/screenshot-diff/screenshot-diff-ocr.ts
|
|
146732
145280
|
var import_child_process8 = require("child_process");
|
|
146733
145281
|
var import_util10 = require("util");
|
|
146734
|
-
var
|
|
145282
|
+
var execFileAsync21 = (0, import_util10.promisify)(import_child_process8.execFile);
|
|
146735
145283
|
var OCR_TIMEOUT_MS = 1e4;
|
|
146736
145284
|
var OCR_MAX_BUFFER_BYTES = 32 * 1024 * 1024;
|
|
146737
145285
|
var TESSERACT_BINARY = "tesseract";
|
|
@@ -146776,7 +145324,7 @@ async function extractOcrTextBlocks(imagePath) {
|
|
|
146776
145324
|
}
|
|
146777
145325
|
}
|
|
146778
145326
|
async function recognizeTsv(imagePath) {
|
|
146779
|
-
const { stdout } = await
|
|
145327
|
+
const { stdout } = await execFileAsync21(
|
|
146780
145328
|
TESSERACT_BINARY,
|
|
146781
145329
|
[
|
|
146782
145330
|
imagePath,
|
|
@@ -148988,15 +147536,15 @@ async function runSnapshot(env, opts) {
|
|
|
148988
147536
|
}
|
|
148989
147537
|
|
|
148990
147538
|
// ../tool-server/src/utils/status-bar.ts
|
|
148991
|
-
var
|
|
148992
|
-
var
|
|
147539
|
+
var import_node_child_process28 = require("node:child_process");
|
|
147540
|
+
var import_node_util20 = require("node:util");
|
|
148993
147541
|
init_adb();
|
|
148994
|
-
var
|
|
147542
|
+
var execFileAsync22 = (0, import_node_util20.promisify)(import_node_child_process28.execFile);
|
|
148995
147543
|
var DEMO_BROADCAST = "am broadcast -a com.android.systemui.demo";
|
|
148996
147544
|
async function pinStatusBar(device) {
|
|
148997
147545
|
try {
|
|
148998
147546
|
if (device.platform === "ios") {
|
|
148999
|
-
await
|
|
147547
|
+
await execFileAsync22(
|
|
149000
147548
|
"xcrun",
|
|
149001
147549
|
await simctlArgsForUdid(device.id, [
|
|
149002
147550
|
"status_bar",
|
|
@@ -149039,7 +147587,7 @@ async function pinStatusBar(device) {
|
|
|
149039
147587
|
async function restoreStatusBar(device) {
|
|
149040
147588
|
try {
|
|
149041
147589
|
if (device.platform === "ios") {
|
|
149042
|
-
await
|
|
147590
|
+
await execFileAsync22(
|
|
149043
147591
|
"xcrun",
|
|
149044
147592
|
await simctlArgsForUdid(device.id, ["status_bar", device.id, "clear"])
|
|
149045
147593
|
);
|
|
@@ -149370,15 +147918,71 @@ function displayFlowName(params) {
|
|
|
149370
147918
|
const stem = params.flow_path === void 0 ? void 0 : path36.basename(params.flow_path, ".yaml");
|
|
149371
147919
|
return params.name || stem || params.flow_path || "(unspecified)";
|
|
149372
147920
|
}
|
|
149373
|
-
function* walkSteps(steps) {
|
|
149374
|
-
for (const step of steps) {
|
|
149375
|
-
|
|
147921
|
+
function* walkSteps(steps, within = "") {
|
|
147922
|
+
for (const [i, step] of steps.entries()) {
|
|
147923
|
+
const where = `step ${i + 1}${within}`;
|
|
147924
|
+
yield { step, where };
|
|
149376
147925
|
const inner = blockSteps(step);
|
|
149377
|
-
if (inner) yield* walkSteps(inner);
|
|
147926
|
+
if (inner) yield* walkSteps(inner, ` of the ${step.kind}: block at ${where}`);
|
|
147927
|
+
}
|
|
147928
|
+
}
|
|
147929
|
+
function retiredKeyGuidance(prop) {
|
|
147930
|
+
const schema = prop;
|
|
147931
|
+
if (!schema?.not || Object.keys(schema.not).length > 0) return void 0;
|
|
147932
|
+
return (schema.description ?? "").replace(/^Retired:\s*/, "");
|
|
147933
|
+
}
|
|
147934
|
+
function toolArgProps(registry2, tool) {
|
|
147935
|
+
return registry2.getTool(tool)?.inputSchema?.properties;
|
|
147936
|
+
}
|
|
147937
|
+
function retiredArgIn(props, tool, args, where) {
|
|
147938
|
+
for (const key2 of Object.keys(args)) {
|
|
147939
|
+
const guidance = retiredKeyGuidance(props[key2]);
|
|
147940
|
+
if (guidance !== void 0) return { where, tool, key: key2, guidance };
|
|
147941
|
+
}
|
|
147942
|
+
return void 0;
|
|
147943
|
+
}
|
|
147944
|
+
function* nestedInvocations(props, args) {
|
|
147945
|
+
for (const [key2, value] of Object.entries(args)) {
|
|
147946
|
+
if (!Object.hasOwn(props, key2)) continue;
|
|
147947
|
+
const entries = Array.isArray(value) ? value : [value];
|
|
147948
|
+
for (const [i, entry] of entries.entries()) {
|
|
147949
|
+
const call = entry;
|
|
147950
|
+
if (typeof call?.tool !== "string") continue;
|
|
147951
|
+
if (typeof call.args !== "object" || call.args === null || Array.isArray(call.args)) continue;
|
|
147952
|
+
yield {
|
|
147953
|
+
tool: call.tool,
|
|
147954
|
+
args: call.args,
|
|
147955
|
+
at: Array.isArray(value) ? `step ${i + 1}` : `\`${key2}\``
|
|
147956
|
+
};
|
|
147957
|
+
}
|
|
147958
|
+
}
|
|
147959
|
+
}
|
|
147960
|
+
function findRetiredToolArg(registry2, steps) {
|
|
147961
|
+
for (const { step, where } of walkSteps(steps)) {
|
|
147962
|
+
if (step.kind !== "tool") continue;
|
|
147963
|
+
const props = toolArgProps(registry2, step.name);
|
|
147964
|
+
if (!props) continue;
|
|
147965
|
+
const direct = retiredArgIn(props, step.name, step.args, where);
|
|
147966
|
+
if (direct) return direct;
|
|
147967
|
+
for (const call of nestedInvocations(props, step.args)) {
|
|
147968
|
+
const nestedProps = toolArgProps(registry2, call.tool);
|
|
147969
|
+
if (!nestedProps) continue;
|
|
147970
|
+
const hit = retiredArgIn(
|
|
147971
|
+
nestedProps,
|
|
147972
|
+
call.tool,
|
|
147973
|
+
call.args,
|
|
147974
|
+
`${call.at} of the ${step.name} step at ${where}`
|
|
147975
|
+
);
|
|
147976
|
+
if (hit) return hit;
|
|
147977
|
+
}
|
|
149378
147978
|
}
|
|
147979
|
+
return void 0;
|
|
147980
|
+
}
|
|
147981
|
+
function retiredArgReason(use) {
|
|
147982
|
+
return `${use.where} as written (echo included) passes ${use.tool}'s retired \`${use.key}\` key${use.guidance ? `: ${use.guidance}` : ""}`;
|
|
149379
147983
|
}
|
|
149380
147984
|
function assertUploadSelfContained(flow) {
|
|
149381
|
-
for (const step of walkSteps(flow.steps)) {
|
|
147985
|
+
for (const { step } of walkSteps(flow.steps)) {
|
|
149382
147986
|
if (step.kind === "run") {
|
|
149383
147987
|
throw new FailureError(
|
|
149384
147988
|
`This flow uses run: composition ("run: ${step.flow}"), which requires a co-located client and tool server \u2014 an uploaded flow's referenced files are not available on this host.`,
|
|
@@ -149412,6 +148016,9 @@ function createRunFlowTool(registry2) {
|
|
|
149412
148016
|
failedMsg: ({ params, failureSignal: failureSignal2 }) => `Failed to run flow ${displayFlowName(params)}: ${failureSignal2.error_code}`
|
|
149413
148017
|
},
|
|
149414
148018
|
description: `Run a saved flow from the .argent/flows/ directory, or an explicit boundary-managed flow_path.
|
|
148019
|
+
Use when a scenario is already authored as YAML and the whole of it should replay in one call with a
|
|
148020
|
+
per-step verdict; reach for the individual gesture tools when nothing is authored yet, and for
|
|
148021
|
+
run-sequence when the steps are an ad-hoc list rather than a stored flow.
|
|
149415
148022
|
Steps run in order: \`launch\` starts an app from scratch (terminate + relaunch) and waits until it is
|
|
149416
148023
|
ready (on iOS it also pins later element lookups to that app rather than auto-detecting the frontmost
|
|
149417
148024
|
one); \`tool\` calls dispatch through the registry (a raw \`tool\` step ends that iOS pin, so lookups
|
|
@@ -149426,6 +148033,11 @@ order), \`next: <selector>\` (CSS \`+\` \u2014 the nearest such follower, which
|
|
|
149426
148033
|
non-matching neighbour rather than failing), plus \`any: true\` (CSS \`*\` \u2014 legal only WITH a scope and
|
|
149427
148034
|
never beside text/id/role). Scopes nest to disambiguate \u2014 \`within: { id: card, within: { id: list } }\`
|
|
149428
148035
|
reads "inside card inside list", each container's frame inside the next);
|
|
148036
|
+
\`swipe\` performs one finger flick (\`swipe: left\`, or \`swipe: { from?, direction|to|by, momentum?, duration? }\` \u2014
|
|
148037
|
+
direction is the FINGER's travel, the opposite sense of scroll-to's content direction; \`by: { x?, y? }\` \u2014 signed
|
|
148038
|
+
0\u20131 screen fractions, combined length at least 0.03 (a diagonal clears it where neither axis does); duration in ms,
|
|
148039
|
+
default 300, minimum 150, maximum 10000; each bound is a parse error that rejects the file before any step runs;
|
|
148040
|
+
\`momentum: false\` lands exactly where the finger lifts instead of flinging);
|
|
149429
148041
|
\`scroll-to\` scrolls (momentum-free) until a target is visible; \`pinch\` zooms
|
|
149430
148042
|
(\`pinch: { on?, scale }\` \u2014 scale > 1 in, < 1 out; screen center when \`on\` is omitted); \`rotate\` is the
|
|
149431
148043
|
two-finger rotation gesture (\`rotate: { on?, by }\` \u2014 degrees, + clockwise, within \xB13000\xB0; screen center
|
|
@@ -149442,7 +148054,7 @@ baseline (a missing baseline fails the step \u2014 set updateBaselines to adopt
|
|
|
149442
148054
|
cropped element whose size drifted fails on dimensions); \`echo\` annotates; \`run\` executes another flow
|
|
149443
148055
|
inline \u2014 a YAML path resolved against the directory of the flow file that references it (co-located
|
|
149444
148056
|
runs only).
|
|
149445
|
-
A selector-less gesture \u2014 a coordinate \`tap\`/\`long-press\`, or a \`pinch\`/\`rotate\` with no \`on\` \u2014 resolves
|
|
148057
|
+
A selector-less gesture \u2014 a coordinate \`tap\`/\`long-press\`/\`swipe\`, or a \`pinch\`/\`rotate\` with no \`on\` \u2014 resolves
|
|
149446
148058
|
no frame out of the tree, so an unreadable tree source does NOT stop it the way it stops \`idle\`: it
|
|
149447
148059
|
settles best-effort, dispatches anyway, and the step PASSES carrying a \`warning\` that quotes the source's
|
|
149448
148060
|
own error. That green says the gesture was SENT, not that it landed. Restore the tree source (usually
|
|
@@ -149490,6 +148102,15 @@ Pass exactly one flow source: name for a saved flow under project_root, or flow_
|
|
|
149490
148102
|
const flowsDir = path36.dirname(canonicalPath);
|
|
149491
148103
|
const flow = parseFlow(await fs51.readFile(canonicalPath, "utf8"));
|
|
149492
148104
|
if (viaUpload) assertUploadSelfContained(flow);
|
|
148105
|
+
const retiredArg = findRetiredToolArg(registry2, flow.steps);
|
|
148106
|
+
if (retiredArg) {
|
|
148107
|
+
throw new FailureError(`Flow "${flowName}" ${retiredArgReason(retiredArg)}`, {
|
|
148108
|
+
error_code: FAILURE_CODES.FLOW_FILE_INVALID,
|
|
148109
|
+
failure_stage: "flow_run_validate",
|
|
148110
|
+
failure_area: "tool_server",
|
|
148111
|
+
error_kind: "validation"
|
|
148112
|
+
});
|
|
148113
|
+
}
|
|
149493
148114
|
const rootEntry = { canonical: canonicalPath, display: flowName };
|
|
149494
148115
|
if (flow.executionPrerequisite && !pinnedToChromium(params.device)) {
|
|
149495
148116
|
const leading = await leadingLaunch(flow, [rootEntry]);
|
|
@@ -149760,6 +148381,9 @@ function conditionLabel(cond, renderSelector) {
|
|
|
149760
148381
|
}
|
|
149761
148382
|
return `${cond.condition} ${sel}`;
|
|
149762
148383
|
}
|
|
148384
|
+
function gestureTargetLabel(target) {
|
|
148385
|
+
return "selector" in target ? selectorLabel2(target.selector) : `(${target.x}, ${target.y})`;
|
|
148386
|
+
}
|
|
149763
148387
|
function stepTarget(step) {
|
|
149764
148388
|
switch (step.kind) {
|
|
149765
148389
|
case "tap":
|
|
@@ -149767,6 +148391,19 @@ function stepTarget(step) {
|
|
|
149767
148391
|
if (step.selector) return selectorLabel2(step.selector);
|
|
149768
148392
|
if (step.x !== void 0 && step.y !== void 0) return `(${step.x}, ${step.y})`;
|
|
149769
148393
|
return void 0;
|
|
148394
|
+
case "swipe": {
|
|
148395
|
+
let travel;
|
|
148396
|
+
if (step.direction !== void 0) {
|
|
148397
|
+
travel = step.direction;
|
|
148398
|
+
} else if (step.by !== void 0) {
|
|
148399
|
+
travel = `by ${swipeByLabel(step.by)}`;
|
|
148400
|
+
} else if (step.to !== void 0) {
|
|
148401
|
+
travel = `to ${gestureTargetLabel(step.to)}`;
|
|
148402
|
+
} else {
|
|
148403
|
+
return void 0;
|
|
148404
|
+
}
|
|
148405
|
+
return `${travel}${step.from ? ` from ${gestureTargetLabel(step.from)}` : ""}`;
|
|
148406
|
+
}
|
|
149770
148407
|
case "type":
|
|
149771
148408
|
return `into ${selectorLabel2(step.into)}`;
|
|
149772
148409
|
case "await":
|
|
@@ -150029,6 +148666,8 @@ async function execRunStep(state3, step, scope) {
|
|
|
150029
148666
|
} catch (err) {
|
|
150030
148667
|
return fail(`could not load fragment "${target}": ${errMsg3(err)}`);
|
|
150031
148668
|
}
|
|
148669
|
+
const retiredArg = findRetiredToolArg(state3.registry, fragment.steps);
|
|
148670
|
+
if (retiredArg) return fail(`fragment "${target}" ${retiredArgReason(retiredArg)}`);
|
|
150032
148671
|
pushReport(state3, {
|
|
150033
148672
|
index,
|
|
150034
148673
|
kind: "run",
|
|
@@ -150062,6 +148701,7 @@ async function execLeafStep(state3, step, index, scope) {
|
|
|
150062
148701
|
}
|
|
150063
148702
|
case "tap":
|
|
150064
148703
|
case "long-press":
|
|
148704
|
+
case "swipe":
|
|
150065
148705
|
case "type":
|
|
150066
148706
|
case "await":
|
|
150067
148707
|
case "assert":
|
|
@@ -150189,6 +148829,9 @@ async function execLeafStep(state3, step, index, scope) {
|
|
|
150189
148829
|
}
|
|
150190
148830
|
return { ...base, status: "pass", tool: step.name, result, outputHint, args };
|
|
150191
148831
|
} catch (err) {
|
|
148832
|
+
if (signal?.aborted) {
|
|
148833
|
+
return { ...base, status: "skip", tool: step.name, reason: ABORTED_OUTCOME.reason };
|
|
148834
|
+
}
|
|
150192
148835
|
const reframed = describeNestedParamError(registry2, err, step.name, args, step.args ?? {});
|
|
150193
148836
|
return { ...base, status: "error", tool: step.name, reason: reframed ?? errMsg3(err) };
|
|
150194
148837
|
}
|
|
@@ -150368,10 +149011,13 @@ var flowReadPrerequisiteTool = {
|
|
|
150368
149011
|
failedMsg: ({ failureSignal: failureSignal2 }) => `Failed to read flow prerequisite: ${failureSignal2.error_code}`
|
|
150369
149012
|
},
|
|
150370
149013
|
description: `Read the execution prerequisite of a flow without running it \u2014 a saved flow from the .argent/flows/ directory, or an explicit boundary-managed flow_path.
|
|
150371
|
-
Returns
|
|
150372
|
-
|
|
150373
|
-
|
|
150374
|
-
the
|
|
149014
|
+
Returns { flow, executionPrerequisite }: the logical name, plus the precondition its author recorded
|
|
149015
|
+
verbatim. Empty when none was declared, which is always so for a self-contained scenario: one opening
|
|
149016
|
+
on a launch may declare no prerequisite, because it builds its own start state.
|
|
149017
|
+
Use when deciding whether the device already sits where a fragment expects it (correct app foregrounded,
|
|
149018
|
+
correct account, correct screen) before committing to a run, or when relaying that requirement to a human.
|
|
149019
|
+
Touches no device: nothing is launched, tapped, dispatched or torn down, and no simulator or emulator
|
|
149020
|
+
needs booting, so calling this costs nothing but a file read.
|
|
150375
149021
|
Fails if the flow file does not exist.
|
|
150376
149022
|
Address the flow exactly as you will address it in flow-execute: name or flow_path, one and only one; supplying both or neither is rejected. The name goes in \`name\`, which resolves <project_root>/.argent/flows/<name>.yaml.`,
|
|
150377
149023
|
zodSchema: zodSchema66,
|
|
@@ -150397,7 +149043,7 @@ init_zod();
|
|
|
150397
149043
|
// ../tool-server/src/utils/workspace-reader.ts
|
|
150398
149044
|
var import_promises12 = require("node:fs/promises");
|
|
150399
149045
|
var import_node_path21 = require("node:path");
|
|
150400
|
-
var
|
|
149046
|
+
var import_node_child_process29 = require("node:child_process");
|
|
150401
149047
|
var import_dotenv2 = __toESM(require_main());
|
|
150402
149048
|
async function exists(path41) {
|
|
150403
149049
|
try {
|
|
@@ -150441,7 +149087,7 @@ async function listDir(path41) {
|
|
|
150441
149087
|
var COMMAND_TIMEOUT_MS = 3e3;
|
|
150442
149088
|
function runVersionCommand(cmd, args, cwd) {
|
|
150443
149089
|
return new Promise((resolve12) => {
|
|
150444
|
-
const child = (0,
|
|
149090
|
+
const child = (0, import_node_child_process29.execFile)(cmd, args, { cwd, timeout: COMMAND_TIMEOUT_MS }, (err, stdout) => {
|
|
150445
149091
|
if (err) {
|
|
150446
149092
|
resolve12(null);
|
|
150447
149093
|
return;
|
|
@@ -150730,7 +149376,7 @@ Fails if the workspacePath is not an absolute path or the directory cannot be ac
|
|
|
150730
149376
|
};
|
|
150731
149377
|
|
|
150732
149378
|
// ../tool-server/src/tools/system/update-argent.ts
|
|
150733
|
-
var
|
|
149379
|
+
var import_node_child_process30 = require("node:child_process");
|
|
150734
149380
|
var fs53 = __toESM(require("node:fs"));
|
|
150735
149381
|
var path37 = __toESM(require("node:path"));
|
|
150736
149382
|
init_zod();
|
|
@@ -150865,7 +149511,7 @@ var updateArgentTool = {
|
|
|
150865
149511
|
if (spawnRoot) updateArgs.push("--project-root", spawnRoot);
|
|
150866
149512
|
const cmd = cliEntry ? process.execPath : "argent";
|
|
150867
149513
|
const args = cliEntry ? [cliEntry, ...updateArgs] : updateArgs;
|
|
150868
|
-
const child = (0,
|
|
149514
|
+
const child = (0, import_node_child_process30.spawn)(cmd, args, {
|
|
150869
149515
|
detached: true,
|
|
150870
149516
|
stdio: "ignore",
|
|
150871
149517
|
env: { ...process.env, ARGENT_UPDATE_TRIGGER: "mcp_update" }
|
|
@@ -150879,7 +149525,7 @@ var updateArgentTool = {
|
|
|
150879
149525
|
});
|
|
150880
149526
|
child.unref();
|
|
150881
149527
|
}, 2e3);
|
|
150882
|
-
const
|
|
149528
|
+
const targetLabel2 = effectiveTarget === "both" ? "global and project-local installs" : `${effectiveTarget} install`;
|
|
150883
149529
|
const otherHint = requested === "auto" && resolved !== "both" ? resolved === "local" ? ` If you also have a global install, call this tool again with target "global" to update it too.` : ` If you also have a project-local install, run \`argent update --local\` in that project to update it too.` : "";
|
|
150884
149530
|
const bothDegradedNote = resolved === "both" && effectiveTarget === "global" ? ` The project-local install was skipped: no project declaring ${PACKAGE_NAME2} could be located from this server \u2014 run \`argent update --local\` in the project directory for it.` : "";
|
|
150885
149531
|
const versionInfo = targetsOnlyRunningInstall ? `(v${currentVersion} -> v${installableVersion}) ` : "";
|
|
@@ -150887,7 +149533,7 @@ var updateArgentTool = {
|
|
|
150887
149533
|
const coversRunningInstall = targetsOnlyRunningInstall || effectiveTarget === "both";
|
|
150888
149534
|
const restartNote = coversRunningInstall ? ` The tool server will stop and restart automatically once the update is installed. Subsequent tool calls will reconnect to the updated server.` : ` This session's tool server is not affected and keeps running; the update applies only to the targeted install.`;
|
|
150889
149535
|
return {
|
|
150890
|
-
message: `Argent update initiated ${versionInfo}for the ${
|
|
149536
|
+
message: `Argent update initiated ${versionInfo}for the ${targetLabel2}.` + crossTargetNote + restartNote + `${otherHint}${bothDegradedNote}`
|
|
150891
149537
|
};
|
|
150892
149538
|
}
|
|
150893
149539
|
};
|
|
@@ -151834,12 +150480,12 @@ function probeArgentToolServer(host, port, timeoutMs = 500) {
|
|
|
151834
150480
|
|
|
151835
150481
|
// ../tool-server/src/utils/simulator-watcher.ts
|
|
151836
150482
|
var fs55 = __toESM(require("node:fs"));
|
|
151837
|
-
var
|
|
151838
|
-
var
|
|
151839
|
-
var
|
|
150483
|
+
var import_node_child_process31 = require("node:child_process");
|
|
150484
|
+
var import_node_util21 = require("node:util");
|
|
150485
|
+
var execFileAsync23 = (0, import_node_util21.promisify)(import_node_child_process31.execFile);
|
|
151840
150486
|
var POLL_INTERVAL_MS2 = 1e4;
|
|
151841
150487
|
async function getBootedUdidsInSet(deviceSet) {
|
|
151842
|
-
const { stdout } = await
|
|
150488
|
+
const { stdout } = await execFileAsync23("xcrun", [
|
|
151843
150489
|
...simctlPrefix(deviceSet),
|
|
151844
150490
|
"list",
|
|
151845
150491
|
"devices",
|
|
@@ -151912,7 +150558,7 @@ function startSimulatorWatcher(registry2) {
|
|
|
151912
150558
|
}
|
|
151913
150559
|
|
|
151914
150560
|
// ../tool-server/src/utils/preview-window.ts
|
|
151915
|
-
var
|
|
150561
|
+
var import_node_child_process32 = require("node:child_process");
|
|
151916
150562
|
var fs56 = __toESM(require("node:fs"));
|
|
151917
150563
|
var os14 = __toESM(require("node:os"));
|
|
151918
150564
|
var path39 = __toESM(require("node:path"));
|
|
@@ -151944,10 +150590,10 @@ function ensureLensAppBundle(electronBin) {
|
|
|
151944
150590
|
fs56.copyFileSync(path39.join(realContents, "Info.plist"), plist);
|
|
151945
150591
|
const setPlist = (entry, value) => {
|
|
151946
150592
|
try {
|
|
151947
|
-
(0,
|
|
150593
|
+
(0, import_node_child_process32.execFileSync)("/usr/libexec/PlistBuddy", ["-c", `Set :${entry} ${value}`, plist]);
|
|
151948
150594
|
} catch {
|
|
151949
150595
|
try {
|
|
151950
|
-
(0,
|
|
150596
|
+
(0, import_node_child_process32.execFileSync)("/usr/libexec/PlistBuddy", ["-c", `Add :${entry} string ${value}`, plist]);
|
|
151951
150597
|
} catch {
|
|
151952
150598
|
}
|
|
151953
150599
|
}
|
|
@@ -152006,7 +150652,7 @@ function createPreviewWindowManager(opts = {}) {
|
|
|
152006
150652
|
const wrapperBin = ensureLensAppBundle(electronBin);
|
|
152007
150653
|
const launchBin = wrapperBin ?? electronBin;
|
|
152008
150654
|
const launchArgs = wrapperBin ? ["--no-sandbox", mainScript] : [mainScript];
|
|
152009
|
-
const next = (0,
|
|
150655
|
+
const next = (0, import_node_child_process32.spawn)(launchBin, launchArgs, {
|
|
152010
150656
|
// Strips ELECTRON_RUN_AS_NODE, which an Electron-based MCP host leaves in
|
|
152011
150657
|
// our env, so the child boots as a GUI app instead of bare Node.
|
|
152012
150658
|
env: electronGuiChildEnv({ ARGENT_PREVIEW_URL: url2 }),
|