assistsx-js 0.1.42 → 0.2.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.
Files changed (44) hide show
  1. package/README.md +4 -4
  2. package/dist/index.cjs +361 -23
  3. package/dist/index.cjs.map +1 -1
  4. package/dist/index.d.mts +119 -2
  5. package/dist/index.d.ts +119 -2
  6. package/dist/index.global.js +9 -13
  7. package/dist/index.global.js.map +1 -1
  8. package/dist/index.js +356 -23
  9. package/dist/index.js.map +1 -1
  10. package/package.json +1 -1
  11. package/src/{AssistsXAsync.ts → assistsx-async.ts} +8 -8
  12. package/src/{AssistsX.ts → assistsx.ts} +8 -8
  13. package/src/barutils/bar-utils.ts +3 -3
  14. package/src/filesystem/fileio/file-io.ts +2 -2
  15. package/src/filesystem/fileutils/file-utils.ts +2 -2
  16. package/src/filesystem/path.ts +2 -2
  17. package/src/floatingwindow/float.ts +4 -4
  18. package/src/gallery/gallery.ts +2 -2
  19. package/src/global.d.ts +6 -1
  20. package/src/imageutils/image-utils.ts +2 -2
  21. package/src/ime/ime.ts +2 -2
  22. package/src/index.ts +21 -20
  23. package/src/log/log-call-method.ts +28 -0
  24. package/src/log/log.ts +445 -0
  25. package/src/mlkit/mlkit.ts +3 -3
  26. package/src/network/http.ts +2 -2
  27. package/src/{NodeAsync.ts → node-async.ts} +5 -5
  28. package/src/{Node.ts → node.ts} +5 -5
  29. package/src/{StepAsync.ts → step-async.ts} +8 -8
  30. package/src/{Step.ts → step.ts} +10 -10
  31. /package/src/{AccessibilityEventFilter.ts → accessibility-event-filter.ts} +0 -0
  32. /package/src/{AppInfo.ts → app-info.ts} +0 -0
  33. /package/src/barutils/{BarUtilsCallMethod.ts → bar-utils-call-method.ts} +0 -0
  34. /package/src/{Bounds.ts → bounds.ts} +0 -0
  35. /package/src/{CallMethod.ts → call-method.ts} +0 -0
  36. /package/src/{CallResponse.ts → call-response.ts} +0 -0
  37. /package/src/{DeviceInfo.ts → device-info.ts} +0 -0
  38. /package/src/floatingwindow/{FloatCallMethod.ts → float-call-method.ts} +0 -0
  39. /package/src/mlkit/{MlkitCallMethod.ts → mlkit-call-method.ts} +0 -0
  40. /package/src/{NodeClassValue.ts → node-class-value.ts} +0 -0
  41. /package/src/{StepError.ts → step-error.ts} +0 -0
  42. /package/src/{StepStateStore.ts → step-state-store.ts} +0 -0
  43. /package/src/{Utils.ts → utils.ts} +0 -0
  44. /package/src/{WindowFlags.ts → window-flags.ts} +0 -0
package/README.md CHANGED
@@ -3,13 +3,13 @@
3
3
  一个支持通过Web端实现Android平台自动化脚本的JS库,支持元素节点查找、获取节点文本、节点截图、执行手势动作、提供步骤器实现复杂自动化业务等一系列自动化脚本开发能力支持
4
4
 
5
5
  # AssistsX JS运行平台
6
- 开发的自动化脚本需要运行在Android端[AssistsX](https://www.pgyer.com/SqGaCx8C)中,所以开发前需要先在手机安装[AssistsX](https://www.pgyer.com/SqGaCx8C)
6
+ 开发的自动化脚本需要运行在Android端[AssistsX](https://www.pgyer.com/assistsx)中,所以开发前需要先在手机安装[AssistsX](https://www.pgyer.com/assistsx)
7
7
 
8
8
  **扫码下载**
9
9
 
10
- <img width="112" alt="image" src="https://github.com/user-attachments/assets/c28ecc41-01f8-4e52-9ddc-80dc5c6d0ed5" />
10
+ <img width="112" alt="image" src="https://github.com/user-attachments/assets/6c371313-4ca1-4598-91b3-f716ec369e7b" />
11
11
 
12
- **下载链接:[https://www.pgyer.com/SqGaCx8C](https://www.pgyer.com/SqGaCx8C)**
12
+ **下载链接:[https://www.pgyer.com/assistsx](https://www.pgyer.com/assistsx)**
13
13
 
14
14
  > 下载安装后会默认安装一个示例插件,可长按删除
15
15
 
@@ -80,7 +80,7 @@ const handleClick = () => {
80
80
  ```
81
81
 
82
82
  ## 4. 加载插件
83
- 1. 通过[AssistsX](https://www.pgyer.com/SqGaCx8C)局域网加载插件
83
+ 1. 通过[AssistsX](https://www.pgyer.com/assistsx)局域网加载插件
84
84
  > 加载插件前需要配置项目允许局域网访问,在文件`vite.config.js`添加以下配置
85
85
  ```
86
86
  export default defineConfig({
package/dist/index.cjs CHANGED
@@ -39,6 +39,9 @@ __export(index_exports, {
39
39
  ImageUtils: () => ImageUtils,
40
40
  Ime: () => Ime,
41
41
  ImeAction: () => ImeAction,
42
+ Log: () => Log,
43
+ LogCallMethod: () => LogCallMethod,
44
+ LogStream: () => LogStream,
42
45
  Mlkit: () => Mlkit,
43
46
  MlkitCallMethod: () => MlkitCallMethod,
44
47
  Node: () => Node,
@@ -62,6 +65,8 @@ __export(index_exports, {
62
65
  http: () => http,
63
66
  imageUtils: () => imageUtils,
64
67
  ime: () => ime,
68
+ log: () => log,
69
+ logUpdateListeners: () => logUpdateListeners,
65
70
  mlkit: () => mlkit,
66
71
  pathUtils: () => pathUtils,
67
72
  screen: () => screen,
@@ -70,7 +75,7 @@ __export(index_exports, {
70
75
  });
71
76
  module.exports = __toCommonJS(index_exports);
72
77
 
73
- // src/Bounds.ts
78
+ // src/bounds.ts
74
79
  var Bounds = class _Bounds {
75
80
  // 构造函数
76
81
  constructor(left, top, right, bottom, width, height, centerX, centerY, exactCenterX, exactCenterY, isEmpty) {
@@ -171,7 +176,7 @@ var Bounds = class _Bounds {
171
176
  }
172
177
  };
173
178
 
174
- // src/CallMethod.ts
179
+ // src/call-method.ts
175
180
  var CallMethod = {
176
181
  takeScreenshot: "takeScreenshot",
177
182
  takeScreenshotSave: "takeScreenshotSave",
@@ -243,7 +248,7 @@ var CallMethod = {
243
248
  saveRootNodeTreeJson: "saveRootNodeTreeJson"
244
249
  };
245
250
 
246
- // src/CallResponse.ts
251
+ // src/call-response.ts
247
252
  var CallResponse = class {
248
253
  constructor(code, data, callbackId) {
249
254
  this.code = code;
@@ -272,7 +277,7 @@ var CallResponse = class {
272
277
  }
273
278
  };
274
279
 
275
- // src/Utils.ts
280
+ // src/utils.ts
276
281
  function sleep(ms) {
277
282
  return new Promise((resolve) => setTimeout(resolve, ms));
278
283
  }
@@ -292,7 +297,7 @@ function decodeBase64UTF8(base64) {
292
297
  return new TextDecoder("utf-8").decode(bytes);
293
298
  }
294
299
 
295
- // src/AppInfo.ts
300
+ // src/app-info.ts
296
301
  var AppInfo = class _AppInfo {
297
302
  constructor(isSystem = false, minSdkVersion = 0, name = "", packageName = "", targetSdkVersion = 0, versionCode = 0, versionName = "") {
298
303
  this.isSystem = isSystem;
@@ -337,7 +342,7 @@ var AppInfo = class _AppInfo {
337
342
  }
338
343
  };
339
344
 
340
- // src/DeviceInfo.ts
345
+ // src/device-info.ts
341
346
  var DeviceInfo = class _DeviceInfo {
342
347
  constructor(uniqueDeviceId = "", androidID = "", macAddress = "", isDeviceRooted = false, manufacturer = "", model = "", sdkVersionCode = 0, sdkVersionName = "", abiList = [], isAdbEnabled = false, isDevelopmentSettingsEnabled = false, isEmulator = false, isTablet = false) {
343
348
  this.uniqueDeviceId = uniqueDeviceId;
@@ -400,7 +405,7 @@ var DeviceInfo = class _DeviceInfo {
400
405
  }
401
406
  };
402
407
 
403
- // src/AssistsXAsync.ts
408
+ // src/assistsx-async.ts
404
409
  var AssistsXAsync = class {
405
410
  /**
406
411
  * 执行异步调用
@@ -1408,7 +1413,7 @@ var AssistsXAsync = class {
1408
1413
  // }
1409
1414
  };
1410
1415
 
1411
- // src/StepStateStore.ts
1416
+ // src/step-state-store.ts
1412
1417
  var import_pinia = require("pinia");
1413
1418
  var useStepStore = (0, import_pinia.defineStore)("step", {
1414
1419
  state: () => ({
@@ -1447,7 +1452,7 @@ var useStepStore = (0, import_pinia.defineStore)("step", {
1447
1452
  }
1448
1453
  });
1449
1454
 
1450
- // src/StepError.ts
1455
+ // src/step-error.ts
1451
1456
  var StepError = class extends Error {
1452
1457
  constructor(message, data, impl, tag, originalError, currentStep) {
1453
1458
  super(message);
@@ -1466,7 +1471,7 @@ var StepStopError = class extends StepError {
1466
1471
  }
1467
1472
  };
1468
1473
 
1469
- // src/StepAsync.ts
1474
+ // src/step-async.ts
1470
1475
  var StepAsync = class {
1471
1476
  /**
1472
1477
  * 构造函数
@@ -1762,7 +1767,7 @@ var StepAsync = class {
1762
1767
  }
1763
1768
  };
1764
1769
 
1765
- // src/Step.ts
1770
+ // src/step.ts
1766
1771
  var _Step = class _Step {
1767
1772
  /**
1768
1773
  * 构造函数
@@ -1791,7 +1796,7 @@ var _Step = class _Step {
1791
1796
  */
1792
1797
  this.repeatCount = 0;
1793
1798
  /**
1794
- * 步骤重复执行最大次数,默认不限制
1799
+ * 步骤重复执行最大次数,默认15次
1795
1800
  */
1796
1801
  this.repeatCountMax = _Step.repeatCountMaxDefault;
1797
1802
  /**
@@ -1911,7 +1916,7 @@ var _Step = class _Step {
1911
1916
  } else {
1912
1917
  nextStep = await ((_e = currentStep.impl) == null ? void 0 : _e.call(currentStep, currentStep));
1913
1918
  }
1914
- if (currentStep.repeatCountMax >= _Step.repeatCountInfinite && currentStep.repeatCount >= currentStep.repeatCountMax) {
1919
+ if (currentStep.repeatCountMax > _Step.repeatCountInfinite && currentStep.repeatCount >= currentStep.repeatCountMax) {
1915
1920
  if (_Step.showLog) {
1916
1921
  console.log(
1917
1922
  `\u91CD\u590D\u6B21\u6570${currentStep.repeatCount}\u8D85\u8FC7\u6700\u5927\u6B21\u6570${currentStep.repeatCountMax}\uFF0C\u505C\u6B62\u6267\u884C`
@@ -2470,7 +2475,7 @@ var _Step = class _Step {
2470
2475
  };
2471
2476
  _Step.delayMsDefault = 1e3;
2472
2477
  _Step.repeatCountInfinite = -1;
2473
- _Step.repeatCountMaxDefault = _Step.repeatCountInfinite;
2478
+ _Step.repeatCountMaxDefault = 15;
2474
2479
  _Step.showLog = false;
2475
2480
  _Step.exceptionRetryCountMaxDefault = 3;
2476
2481
  /**
@@ -2487,7 +2492,7 @@ _Step._interceptors = [];
2487
2492
  _Step.exception = void 0;
2488
2493
  var Step = _Step;
2489
2494
 
2490
- // src/NodeAsync.ts
2495
+ // src/node-async.ts
2491
2496
  var NodeAsync = class {
2492
2497
  /**
2493
2498
  * 构造函数
@@ -2840,7 +2845,7 @@ var NodeAsync = class {
2840
2845
  }
2841
2846
  };
2842
2847
 
2843
- // src/Node.ts
2848
+ // src/node.ts
2844
2849
  var Node = class _Node {
2845
2850
  /**
2846
2851
  * 节点在屏幕中的边界
@@ -3234,7 +3239,7 @@ var Node = class _Node {
3234
3239
  }
3235
3240
  };
3236
3241
 
3237
- // src/AssistsX.ts
3242
+ // src/assistsx.ts
3238
3243
  var callbacks = /* @__PURE__ */ new Map();
3239
3244
  var accessibilityEventListeners = [];
3240
3245
  var screen = null;
@@ -4122,7 +4127,7 @@ if (typeof window !== "undefined") {
4122
4127
  }
4123
4128
  }
4124
4129
 
4125
- // src/NodeClassValue.ts
4130
+ // src/node-class-value.ts
4126
4131
  var NodeClassValue = {
4127
4132
  ImageView: "android.widget.ImageView",
4128
4133
  TextView: "android.widget.TextView",
@@ -4136,7 +4141,7 @@ var NodeClassValue = {
4136
4141
  FrameLayout: "android.widget.FrameLayout"
4137
4142
  };
4138
4143
 
4139
- // src/WindowFlags.ts
4144
+ // src/window-flags.ts
4140
4145
  var WindowFlags = class {
4141
4146
  // 0x1000000
4142
4147
  /**
@@ -4247,7 +4252,7 @@ WindowFlags.FLAG_SHOW_WALLPAPER = 1048576;
4247
4252
  /** 强制硬件加速 */
4248
4253
  WindowFlags.FLAG_HARDWARE_ACCELERATED = 16777216;
4249
4254
 
4250
- // src/AccessibilityEventFilter.ts
4255
+ // src/accessibility-event-filter.ts
4251
4256
  var AccessibilityEventFilter = class _AccessibilityEventFilter {
4252
4257
  constructor(config = {}) {
4253
4258
  var _a, _b, _c, _d, _e;
@@ -6820,7 +6825,7 @@ var Gallery = class {
6820
6825
  };
6821
6826
  var gallery = new Gallery();
6822
6827
 
6823
- // src/mlkit/MlkitCallMethod.ts
6828
+ // src/mlkit/mlkit-call-method.ts
6824
6829
  var MlkitCallMethod = {
6825
6830
  /**
6826
6831
  * 识别屏幕中指定词组的位置(基于当前截图)
@@ -7039,7 +7044,7 @@ var Mlkit = class {
7039
7044
  };
7040
7045
  var mlkit = new Mlkit();
7041
7046
 
7042
- // src/barutils/BarUtilsCallMethod.ts
7047
+ // src/barutils/bar-utils-call-method.ts
7043
7048
  var BarUtilsCallMethod = {
7044
7049
  // Status bar
7045
7050
  getStatusBarHeight: "getStatusBarHeight",
@@ -7364,7 +7369,7 @@ var BarUtils = class {
7364
7369
  };
7365
7370
  var barUtils = new BarUtils();
7366
7371
 
7367
- // src/floatingwindow/FloatCallMethod.ts
7372
+ // src/floatingwindow/float-call-method.ts
7368
7373
  var FloatCallMethod = {
7369
7374
  /** Load floating window */
7370
7375
  open: "open",
@@ -7566,6 +7571,334 @@ var Float = class {
7566
7571
  }
7567
7572
  };
7568
7573
  var float = new Float();
7574
+
7575
+ // src/log/log-call-method.ts
7576
+ var LogCallMethod = {
7577
+ readAllText: "readAllText",
7578
+ clear: "clear",
7579
+ refreshFromFile: "refreshFromFile",
7580
+ appendLine: "appendLine",
7581
+ appendTimestampedEntry: "appendTimestampedEntry",
7582
+ replaceAll: "replaceAll",
7583
+ subscribe: "subscribe",
7584
+ unsubscribe: "unsubscribe",
7585
+ uploadLogs: "uploadLogs",
7586
+ /** 获取日志服务当前域名(origin,无路径;与上传、管理后台同源),对应 AssistsLogDiagnostics.adminWebBaseUrl() */
7587
+ getLogServiceBaseUrl: "getLogServiceBaseUrl"
7588
+ };
7589
+ var LogStream = {
7590
+ latestLine: "latestLine",
7591
+ entireLogText: "entireLogText"
7592
+ };
7593
+
7594
+ // src/log/log.ts
7595
+ var pendingCallbacks = /* @__PURE__ */ new Map();
7596
+ var streamHandlers = /* @__PURE__ */ new Map();
7597
+ var subscriptionIdToCallbackId = /* @__PURE__ */ new Map();
7598
+ if (typeof window !== "undefined" && !window.assistsxLogCallback) {
7599
+ window.assistsxLogCallback = (data) => {
7600
+ try {
7601
+ const json = decodeBase64UTF8(data);
7602
+ const response = JSON.parse(json);
7603
+ const callbackId = response.callbackId;
7604
+ if (!callbackId) {
7605
+ return;
7606
+ }
7607
+ if (streamHandlers.has(callbackId)) {
7608
+ streamHandlers.get(callbackId)(json);
7609
+ return;
7610
+ }
7611
+ const pending = pendingCallbacks.get(callbackId);
7612
+ if (pending) {
7613
+ pending(json);
7614
+ pendingCallbacks.delete(callbackId);
7615
+ }
7616
+ } catch (e) {
7617
+ console.error("Log bridge callback error:", e);
7618
+ }
7619
+ };
7620
+ }
7621
+ var logUpdateListeners = [];
7622
+ if (typeof window !== "undefined" && !window.onAssistsLogUpdate) {
7623
+ window.onAssistsLogUpdate = (encoded) => {
7624
+ logUpdateListeners.forEach((listener) => {
7625
+ try {
7626
+ const decoded = decodeBase64UTF8(encoded);
7627
+ const parsed = JSON.parse(decoded);
7628
+ listener(parsed);
7629
+ } catch (error) {
7630
+ console.error("Log update listener error:", error);
7631
+ }
7632
+ });
7633
+ };
7634
+ }
7635
+ var Log = class {
7636
+ getBridge() {
7637
+ if (typeof window === "undefined" || !window.assistsxLog) {
7638
+ throw new Error("assistsxLog bridge is not available");
7639
+ }
7640
+ return window.assistsxLog;
7641
+ }
7642
+ async asyncCall(method, args, timeout = 30) {
7643
+ const uuid = generateUUID();
7644
+ const params = {
7645
+ method,
7646
+ arguments: args != null ? args : void 0,
7647
+ callbackId: uuid
7648
+ };
7649
+ const promise = new Promise((resolve) => {
7650
+ pendingCallbacks.set(uuid, (data) => {
7651
+ resolve(data);
7652
+ });
7653
+ setTimeout(() => {
7654
+ pendingCallbacks.delete(uuid);
7655
+ resolve(
7656
+ JSON.stringify(new CallResponse(-1, null, uuid))
7657
+ );
7658
+ }, timeout * 1e3);
7659
+ });
7660
+ this.getBridge().call(JSON.stringify(params));
7661
+ const promiseResult = await promise;
7662
+ if (typeof promiseResult === "string") {
7663
+ const responseData = JSON.parse(promiseResult);
7664
+ return new CallResponse(
7665
+ responseData.code,
7666
+ responseData.data,
7667
+ responseData.callbackId
7668
+ );
7669
+ }
7670
+ throw new Error("Log bridge call failed");
7671
+ }
7672
+ /** 读取当前日志全文 */
7673
+ async readAllText(timeout) {
7674
+ var _a;
7675
+ const res = await this.asyncCall(
7676
+ LogCallMethod.readAllText,
7677
+ void 0,
7678
+ timeout
7679
+ );
7680
+ const d = res.getDataOrNull();
7681
+ return (_a = d == null ? void 0 : d.text) != null ? _a : "";
7682
+ }
7683
+ /**
7684
+ * 获取日志服务当前域名(origin,无路径;与上传、管理后台同源)。
7685
+ * 与 Kotlin getLogServiceBaseUrl / adminWebBaseUrl 对齐。
7686
+ */
7687
+ async getLogServiceBaseUrl(timeout) {
7688
+ var _a;
7689
+ const res = await this.asyncCall(
7690
+ LogCallMethod.getLogServiceBaseUrl,
7691
+ void 0,
7692
+ timeout
7693
+ );
7694
+ const d = res.getDataOrNull();
7695
+ return (_a = d == null ? void 0 : d.baseUrl) != null ? _a : "";
7696
+ }
7697
+ /** 清空日志 */
7698
+ async clear(timeout) {
7699
+ const res = await this.asyncCall(
7700
+ LogCallMethod.clear,
7701
+ void 0,
7702
+ timeout
7703
+ );
7704
+ return res.isSuccess();
7705
+ }
7706
+ /** 从文件重新加载到内存 Flow */
7707
+ async refreshFromFile(timeout) {
7708
+ const res = await this.asyncCall(
7709
+ LogCallMethod.refreshFromFile,
7710
+ void 0,
7711
+ timeout
7712
+ );
7713
+ return res.isSuccess();
7714
+ }
7715
+ /** 追加一行 */
7716
+ async appendLine(line, maxLength, timeout) {
7717
+ const args = { line };
7718
+ if (maxLength !== void 0) {
7719
+ args.maxLength = maxLength;
7720
+ }
7721
+ const res = await this.asyncCall(
7722
+ LogCallMethod.appendLine,
7723
+ args,
7724
+ timeout
7725
+ );
7726
+ return res.isSuccess();
7727
+ }
7728
+ /** 追加带时间戳的条目 */
7729
+ async appendTimestampedEntry(message, timeout) {
7730
+ const res = await this.asyncCall(
7731
+ LogCallMethod.appendTimestampedEntry,
7732
+ { message },
7733
+ timeout
7734
+ );
7735
+ return res.isSuccess();
7736
+ }
7737
+ /** 替换全部内容 */
7738
+ async replaceAll(content, timeout) {
7739
+ const res = await this.asyncCall(
7740
+ LogCallMethod.replaceAll,
7741
+ { content },
7742
+ timeout
7743
+ );
7744
+ return res.isSuccess();
7745
+ }
7746
+ /**
7747
+ * 订阅 Flow:先收到 subscribed,再多次 update。
7748
+ * resolve 后请保留 dispose 或调用 unsubscribe(subscriptionId) 以释放原生协程与 JS 回调。
7749
+ */
7750
+ async subscribe(stream, onUpdate, options) {
7751
+ var _a;
7752
+ const self = this;
7753
+ const callbackId = generateUUID();
7754
+ const timeoutSec = (_a = options == null ? void 0 : options.timeout) != null ? _a : 30;
7755
+ return new Promise((resolve, reject) => {
7756
+ let settled = false;
7757
+ const timer = setTimeout(() => {
7758
+ if (!settled) {
7759
+ settled = true;
7760
+ streamHandlers.delete(callbackId);
7761
+ reject(new Error("Log subscribe timeout"));
7762
+ }
7763
+ }, timeoutSec * 1e3);
7764
+ streamHandlers.set(callbackId, (raw) => {
7765
+ var _a2, _b, _c;
7766
+ let response;
7767
+ try {
7768
+ response = JSON.parse(raw);
7769
+ } catch (e) {
7770
+ return;
7771
+ }
7772
+ const data = response.data;
7773
+ const code = response.code;
7774
+ if (typeof code === "number" && code !== 0) {
7775
+ if (!settled) {
7776
+ settled = true;
7777
+ clearTimeout(timer);
7778
+ streamHandlers.delete(callbackId);
7779
+ reject(
7780
+ new Error(
7781
+ (_a2 = response.message) != null ? _a2 : "Log subscribe failed"
7782
+ )
7783
+ );
7784
+ }
7785
+ return;
7786
+ }
7787
+ if ((data == null ? void 0 : data.event) === "subscribed" && data.subscriptionId) {
7788
+ if (!settled) {
7789
+ settled = true;
7790
+ clearTimeout(timer);
7791
+ const sid = data.subscriptionId;
7792
+ subscriptionIdToCallbackId.set(sid, callbackId);
7793
+ resolve({
7794
+ subscriptionId: sid,
7795
+ dispose: async () => {
7796
+ await self.unsubscribe(sid);
7797
+ }
7798
+ });
7799
+ }
7800
+ return;
7801
+ }
7802
+ if ((data == null ? void 0 : data.event) === "update" && data.subscriptionId) {
7803
+ onUpdate({
7804
+ text: (_b = data.text) != null ? _b : "",
7805
+ stream: (_c = data.stream) != null ? _c : stream,
7806
+ subscriptionId: data.subscriptionId
7807
+ });
7808
+ }
7809
+ });
7810
+ try {
7811
+ this.getBridge().call(
7812
+ JSON.stringify({
7813
+ method: LogCallMethod.subscribe,
7814
+ arguments: { stream },
7815
+ callbackId
7816
+ })
7817
+ );
7818
+ } catch (e) {
7819
+ clearTimeout(timer);
7820
+ streamHandlers.delete(callbackId);
7821
+ reject(e);
7822
+ }
7823
+ });
7824
+ }
7825
+ /** 取消订阅(与 Kotlin handleUnsubscribe 对齐) */
7826
+ async unsubscribe(subscriptionId, timeout) {
7827
+ const cbId = subscriptionIdToCallbackId.get(subscriptionId);
7828
+ const res = await this.asyncCall(
7829
+ LogCallMethod.unsubscribe,
7830
+ { subscriptionId },
7831
+ timeout
7832
+ );
7833
+ if (res.isSuccess() && cbId) {
7834
+ streamHandlers.delete(cbId);
7835
+ subscriptionIdToCallbackId.delete(subscriptionId);
7836
+ }
7837
+ return res.isSuccess();
7838
+ }
7839
+ /** 截图 + 节点树 + 日志上传(需 Android API 30+) */
7840
+ async uploadLogs(options) {
7841
+ const { timeout = 60, ...args } = options != null ? options : {};
7842
+ const payload = {};
7843
+ if (args.baseUrl !== void 0) {
7844
+ payload.baseUrl = args.baseUrl;
7845
+ }
7846
+ if (args.format !== void 0) {
7847
+ payload.format = args.format;
7848
+ }
7849
+ if (args.prettyPrint !== void 0) {
7850
+ payload.prettyPrint = args.prettyPrint;
7851
+ }
7852
+ if (args.overlayHiddenDelayMillis !== void 0) {
7853
+ payload.overlayHiddenDelayMillis = args.overlayHiddenDelayMillis;
7854
+ }
7855
+ if (args.uploadKey !== void 0) {
7856
+ payload.uploadKey = args.uploadKey;
7857
+ }
7858
+ const uuid = generateUUID();
7859
+ const params = {
7860
+ method: LogCallMethod.uploadLogs,
7861
+ arguments: Object.keys(payload).length > 0 ? payload : void 0,
7862
+ callbackId: uuid
7863
+ };
7864
+ const promise = new Promise((resolve) => {
7865
+ pendingCallbacks.set(uuid, (data) => {
7866
+ resolve(data);
7867
+ });
7868
+ setTimeout(() => {
7869
+ pendingCallbacks.delete(uuid);
7870
+ resolve(JSON.stringify({ code: -1, data: null, callbackId: uuid }));
7871
+ }, timeout * 1e3);
7872
+ });
7873
+ this.getBridge().call(JSON.stringify(params));
7874
+ const rawStr = await promise;
7875
+ const raw = JSON.parse(rawStr);
7876
+ const d = raw.data;
7877
+ if (d && typeof d === "object" && "success" in d) {
7878
+ return d;
7879
+ }
7880
+ return {
7881
+ success: raw.code === 0,
7882
+ message: typeof raw.message === "string" ? raw.message : raw.code !== 0 ? "uploadLogs failed" : ""
7883
+ };
7884
+ }
7885
+ /**
7886
+ * 注册 onAssistsLogUpdate 推送监听(ASWebView 注入的 Base64 CallResponse,解码后见 LogUpdateEvent)
7887
+ */
7888
+ addLogUpdateListener(listener) {
7889
+ logUpdateListeners.push(listener);
7890
+ }
7891
+ /**
7892
+ * 移除先前通过 addLogUpdateListener 注册的同一函数引用
7893
+ */
7894
+ removeLogUpdateListener(listener) {
7895
+ const i = logUpdateListeners.indexOf(listener);
7896
+ if (i !== -1) {
7897
+ logUpdateListeners.splice(i, 1);
7898
+ }
7899
+ }
7900
+ };
7901
+ var log = new Log();
7569
7902
  // Annotate the CommonJS export names for ESM import in node:
7570
7903
  0 && (module.exports = {
7571
7904
  AccessibilityEventFilter,
@@ -7587,6 +7920,9 @@ var float = new Float();
7587
7920
  ImageUtils,
7588
7921
  Ime,
7589
7922
  ImeAction,
7923
+ Log,
7924
+ LogCallMethod,
7925
+ LogStream,
7590
7926
  Mlkit,
7591
7927
  MlkitCallMethod,
7592
7928
  Node,
@@ -7610,6 +7946,8 @@ var float = new Float();
7610
7946
  http,
7611
7947
  imageUtils,
7612
7948
  ime,
7949
+ log,
7950
+ logUpdateListeners,
7613
7951
  mlkit,
7614
7952
  pathUtils,
7615
7953
  screen,