@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.
@@ -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
- enabled = false;
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 readCappedJson(res, maxBytes = MAX_SOURCE_MAP_BYTES) {
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 and registering a source map from a Debugger.scriptParsed event.
115086
- * Returns immediately; `waitForPending()` blocks until all maps are loaded.
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(scriptUrl, scriptId, sourceMapURL);
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
- let rawData;
115162
- if (sourceMapURL.startsWith("data:")) {
115163
- const base64Part = sourceMapURL.split(",")[1];
115164
- if (!base64Part) return;
115165
- const decoded = Buffer.from(base64Part, "base64").toString("utf-8");
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 StubSourceMapsRegistry();
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(metro.projectRoot);
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 import_node_child_process21 = require("node:child_process");
119913
- var import_node_util15 = require("node:util");
117944
+ var import_node_child_process20 = require("node:child_process");
117945
+ var import_node_util14 = require("node:util");
119914
117946
  init_src();
119915
- var execFileAsync15 = (0, import_node_util15.promisify)(import_node_child_process21.execFile);
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 execFileAsync15("xcrun", await simctlArgsForUdid(udid, ["terminate", udid, bundleId]));
117961
+ await execFileAsync14("xcrun", await simctlArgsForUdid(udid, ["terminate", udid, bundleId]));
119930
117962
  } catch {
119931
117963
  }
119932
117964
  try {
119933
- await execFileAsync15("xcrun", await simctlArgsForUdid(udid, ["launch", udid, bundleId]));
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 import_node_child_process22 = require("node:child_process");
120093
- var import_node_util16 = require("node:util");
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 execFileAsync16 = (0, import_node_util16.promisify)(import_node_child_process22.execFile);
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 execFileAsync16("xcrun", [...prefix, "uninstall", udid, bundleId]);
118136
+ await execFileAsync15("xcrun", [...prefix, "uninstall", udid, bundleId]);
120105
118137
  } catch {
120106
118138
  }
120107
118139
  try {
120108
- await execFileAsync16("xcrun", [...prefix, "install", udid, absolute]);
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 import_node_child_process23 = require("node:child_process");
120265
- var import_node_util17 = require("node:util");
118296
+ var import_node_child_process22 = require("node:child_process");
118297
+ var import_node_util16 = require("node:util");
120266
118298
  init_src();
120267
- var execFileAsync17 = (0, import_node_util17.promisify)(import_node_child_process23.execFile);
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 execFileAsync17(
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 execFileAsync17(
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 import_node_child_process24 = require("node:child_process");
120584
- var import_node_util18 = require("node:util");
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 execFileAsync18 = (0, import_node_util18.promisify)(import_node_child_process24.execFile);
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 execFileAsync18(
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 import_node_child_process25 = require("node:child_process");
120716
- var import_node_util19 = require("node:util");
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 execFileAsync19 = (0, import_node_util19.promisify)(import_node_child_process25.execFile);
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 execFileAsync19("xcrun", await simctlArgsForUdid(udid, ["io", udid, "screenshot", file2]), {
119192
+ await execFileAsync18("xcrun", await simctlArgsForUdid(udid, ["io", udid, "screenshot", file2]), {
121161
119193
  signal
121162
119194
  });
121163
119195
  if (scale < 1) {
121164
- await execFileAsync19("sips", ["-Z", String(await tvTargetLongSide(file2, scale)), file2], {
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 execFileAsync19("sips", ["-g", "pixelWidth", "-g", "pixelHeight", file2]);
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 SETTLE_EASE_EXPONENT = 3;
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().optional().describe("Total gesture duration in milliseconds (default 300)"),
121396
- settle: external_exports.boolean().optional().describe(
121397
- "Momentum-free swipe: decelerate into the end point (ease-out) so the OS reads ~0 release velocity and applies little to no fling. Use for scroll-to-element loops; default false (a natural flinging swipe)."
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 settle:true for a momentum-free swipe that lands exactly where the finger lifts (no fling), when you need a deterministic scroll distance. Returns { swiped: true, timestampMs }. Fails if the simulator-server / emulator backend is not reachable for the given device.`,
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 ?? 300;
121426
- const settle = params.settle ?? false;
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 = settle ? 1 - Math.pow(1 - t, SETTLE_EASE_EXPONENT) : t;
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().optional().describe("Total drag duration in milliseconds (default 300), interpolated at ~60fps.")
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 startPx = { x: params.fromX * vp.width, y: params.fromY * vp.height };
121553
- const endPx = { x: params.toX * vp.width, y: params.toY * vp.height };
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 steps = Math.max(2, Math.round(durationMs / 16));
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
- await chromium.dispatchMouseEvent({
121565
- type: "mouseMoved",
121566
- x: startPx.x + (endPx.x - startPx.x) * t,
121567
- y: startPx.y + (endPx.y - startPx.y) * t,
121568
- button: "left"
121569
- });
121570
- await sleep5(16);
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 import_node_child_process27 = require("node:child_process");
122775
- var import_node_util20 = require("node:util");
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 import_node_child_process26 = require("node:child_process");
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, import_node_child_process26.execFile)(
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 execFileAsync20 = (0, import_node_util20.promisify)(import_node_child_process27.execFile);
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 execFileAsync20("xcrun", args, { timeout: 15e3 });
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 } [ios/android]
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 } [chromium only]
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 execFileAsync25 = (0, import_util8.promisify)(import_child_process2.execFile);
135737
- const { stdout, stderr } = await execFileAsync25(file2, args, {
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 execFileAsync21 = (0, import_util9.promisify)(import_child_process6.execFile);
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 execFileAsync21("/bin/sh", ["-c", `command -v ${name}`], { timeout: 2e3 });
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 import_node_child_process28 = require("node:child_process");
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, import_node_child_process28.execFileSync)("netstat", ["-ano"], {
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, import_node_child_process28.execFileSync)("lsof", ["-ti", `tcp:${port}`, "-sTCP:LISTEN"], {
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 = parseAwaitTimeout({ [kind]: b }, b.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
- if (typeof obj.duration !== "number" || !Number.isFinite(obj.duration) || obj.duration <= 0) {
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
- "long-press.duration needs a positive number of milliseconds (e.g. `duration: 1200`)"
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 = obj.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 waitForFrame(env, selector) {
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 frame = flowSelectorToFrame(tree, selector);
145265
- if (frame) return frame;
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 void 0;
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
- await invokeOnDevice(env, "gesture-swipe", {
145338
- fromX: cx,
145339
- fromY: cy,
145340
- toX: to.x,
145341
- toY: to.y,
145342
- settle: true,
145343
- durationMs: 600
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
- const settle = await settleForGesture(env);
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
- await invokeOnDevice(env, "gesture-drag", {
145466
- fromX: point.x,
145467
- fromY: point.y,
145468
- toX: point.x,
145469
- toY: point.y,
145470
- durationMs: duration3
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 = step.selector ? selectorLabel(step.selector) : `(${step.x}, ${step.y})`;
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 execFileAsync22 = (0, import_util10.promisify)(import_child_process8.execFile);
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 execFileAsync22(
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 import_node_child_process29 = require("node:child_process");
148992
- var import_node_util21 = require("node:util");
147539
+ var import_node_child_process28 = require("node:child_process");
147540
+ var import_node_util20 = require("node:util");
148993
147541
  init_adb();
148994
- var execFileAsync23 = (0, import_node_util21.promisify)(import_node_child_process29.execFile);
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 execFileAsync23(
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 execFileAsync23(
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
- yield step;
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 the prerequisite description so you can verify the required state is met before calling flow-execute.
150372
- Use when you need to check what app/simulator state is required before executing a flow; pass the same flow
150373
- source (name or flow_path) you will pass to flow-execute, so the prerequisite you read is the contract of
150374
- the flow that will actually run.
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 import_node_child_process30 = require("node:child_process");
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, import_node_child_process30.execFile)(cmd, args, { cwd, timeout: COMMAND_TIMEOUT_MS }, (err, stdout) => {
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 import_node_child_process31 = require("node:child_process");
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, import_node_child_process31.spawn)(cmd, args, {
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 targetLabel = effectiveTarget === "both" ? "global and project-local installs" : `${effectiveTarget} install`;
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 ${targetLabel}.` + crossTargetNote + restartNote + `${otherHint}${bothDegradedNote}`
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 import_node_child_process32 = require("node:child_process");
151838
- var import_node_util22 = require("node:util");
151839
- var execFileAsync24 = (0, import_node_util22.promisify)(import_node_child_process32.execFile);
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 execFileAsync24("xcrun", [
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 import_node_child_process33 = require("node:child_process");
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, import_node_child_process33.execFileSync)("/usr/libexec/PlistBuddy", ["-c", `Set :${entry} ${value}`, plist]);
150593
+ (0, import_node_child_process32.execFileSync)("/usr/libexec/PlistBuddy", ["-c", `Set :${entry} ${value}`, plist]);
151948
150594
  } catch {
151949
150595
  try {
151950
- (0, import_node_child_process33.execFileSync)("/usr/libexec/PlistBuddy", ["-c", `Add :${entry} string ${value}`, plist]);
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, import_node_child_process33.spawn)(launchBin, launchArgs, {
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 }),