assistsx-js 0.1.42 → 0.2.0

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 (43) hide show
  1. package/dist/index.cjs +358 -20
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.d.mts +118 -1
  4. package/dist/index.d.ts +118 -1
  5. package/dist/index.global.js +1 -1
  6. package/dist/index.global.js.map +1 -1
  7. package/dist/index.js +353 -20
  8. package/dist/index.js.map +1 -1
  9. package/package.json +1 -1
  10. package/src/{AssistsXAsync.ts → assistsx-async.ts} +8 -8
  11. package/src/{AssistsX.ts → assistsx.ts} +8 -8
  12. package/src/barutils/bar-utils.ts +3 -3
  13. package/src/filesystem/fileio/file-io.ts +2 -2
  14. package/src/filesystem/fileutils/file-utils.ts +2 -2
  15. package/src/filesystem/path.ts +2 -2
  16. package/src/floatingwindow/float.ts +4 -4
  17. package/src/gallery/gallery.ts +2 -2
  18. package/src/global.d.ts +6 -1
  19. package/src/imageutils/image-utils.ts +2 -2
  20. package/src/ime/ime.ts +2 -2
  21. package/src/index.ts +21 -20
  22. package/src/log/log-call-method.ts +28 -0
  23. package/src/log/log.ts +445 -0
  24. package/src/mlkit/mlkit.ts +3 -3
  25. package/src/network/http.ts +2 -2
  26. package/src/{NodeAsync.ts → node-async.ts} +5 -5
  27. package/src/{Node.ts → node.ts} +5 -5
  28. package/src/{StepAsync.ts → step-async.ts} +8 -8
  29. package/src/{Step.ts → step.ts} +7 -7
  30. /package/src/{AccessibilityEventFilter.ts → accessibility-event-filter.ts} +0 -0
  31. /package/src/{AppInfo.ts → app-info.ts} +0 -0
  32. /package/src/barutils/{BarUtilsCallMethod.ts → bar-utils-call-method.ts} +0 -0
  33. /package/src/{Bounds.ts → bounds.ts} +0 -0
  34. /package/src/{CallMethod.ts → call-method.ts} +0 -0
  35. /package/src/{CallResponse.ts → call-response.ts} +0 -0
  36. /package/src/{DeviceInfo.ts → device-info.ts} +0 -0
  37. /package/src/floatingwindow/{FloatCallMethod.ts → float-call-method.ts} +0 -0
  38. /package/src/mlkit/{MlkitCallMethod.ts → mlkit-call-method.ts} +0 -0
  39. /package/src/{NodeClassValue.ts → node-class-value.ts} +0 -0
  40. /package/src/{StepError.ts → step-error.ts} +0 -0
  41. /package/src/{StepStateStore.ts → step-state-store.ts} +0 -0
  42. /package/src/{Utils.ts → utils.ts} +0 -0
  43. /package/src/{WindowFlags.ts → window-flags.ts} +0 -0
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- // src/Bounds.ts
1
+ // src/bounds.ts
2
2
  var Bounds = class _Bounds {
3
3
  // 构造函数
4
4
  constructor(left, top, right, bottom, width, height, centerX, centerY, exactCenterX, exactCenterY, isEmpty) {
@@ -99,7 +99,7 @@ var Bounds = class _Bounds {
99
99
  }
100
100
  };
101
101
 
102
- // src/CallMethod.ts
102
+ // src/call-method.ts
103
103
  var CallMethod = {
104
104
  takeScreenshot: "takeScreenshot",
105
105
  takeScreenshotSave: "takeScreenshotSave",
@@ -171,7 +171,7 @@ var CallMethod = {
171
171
  saveRootNodeTreeJson: "saveRootNodeTreeJson"
172
172
  };
173
173
 
174
- // src/CallResponse.ts
174
+ // src/call-response.ts
175
175
  var CallResponse = class {
176
176
  constructor(code, data, callbackId) {
177
177
  this.code = code;
@@ -200,7 +200,7 @@ var CallResponse = class {
200
200
  }
201
201
  };
202
202
 
203
- // src/Utils.ts
203
+ // src/utils.ts
204
204
  function sleep(ms) {
205
205
  return new Promise((resolve) => setTimeout(resolve, ms));
206
206
  }
@@ -220,7 +220,7 @@ function decodeBase64UTF8(base64) {
220
220
  return new TextDecoder("utf-8").decode(bytes);
221
221
  }
222
222
 
223
- // src/AppInfo.ts
223
+ // src/app-info.ts
224
224
  var AppInfo = class _AppInfo {
225
225
  constructor(isSystem = false, minSdkVersion = 0, name = "", packageName = "", targetSdkVersion = 0, versionCode = 0, versionName = "") {
226
226
  this.isSystem = isSystem;
@@ -265,7 +265,7 @@ var AppInfo = class _AppInfo {
265
265
  }
266
266
  };
267
267
 
268
- // src/DeviceInfo.ts
268
+ // src/device-info.ts
269
269
  var DeviceInfo = class _DeviceInfo {
270
270
  constructor(uniqueDeviceId = "", androidID = "", macAddress = "", isDeviceRooted = false, manufacturer = "", model = "", sdkVersionCode = 0, sdkVersionName = "", abiList = [], isAdbEnabled = false, isDevelopmentSettingsEnabled = false, isEmulator = false, isTablet = false) {
271
271
  this.uniqueDeviceId = uniqueDeviceId;
@@ -328,7 +328,7 @@ var DeviceInfo = class _DeviceInfo {
328
328
  }
329
329
  };
330
330
 
331
- // src/AssistsXAsync.ts
331
+ // src/assistsx-async.ts
332
332
  var AssistsXAsync = class {
333
333
  /**
334
334
  * 执行异步调用
@@ -1336,7 +1336,7 @@ var AssistsXAsync = class {
1336
1336
  // }
1337
1337
  };
1338
1338
 
1339
- // src/StepStateStore.ts
1339
+ // src/step-state-store.ts
1340
1340
  import { defineStore } from "pinia";
1341
1341
  var useStepStore = defineStore("step", {
1342
1342
  state: () => ({
@@ -1375,7 +1375,7 @@ var useStepStore = defineStore("step", {
1375
1375
  }
1376
1376
  });
1377
1377
 
1378
- // src/StepError.ts
1378
+ // src/step-error.ts
1379
1379
  var StepError = class extends Error {
1380
1380
  constructor(message, data, impl, tag, originalError, currentStep) {
1381
1381
  super(message);
@@ -1394,7 +1394,7 @@ var StepStopError = class extends StepError {
1394
1394
  }
1395
1395
  };
1396
1396
 
1397
- // src/StepAsync.ts
1397
+ // src/step-async.ts
1398
1398
  var StepAsync = class {
1399
1399
  /**
1400
1400
  * 构造函数
@@ -1690,7 +1690,7 @@ var StepAsync = class {
1690
1690
  }
1691
1691
  };
1692
1692
 
1693
- // src/Step.ts
1693
+ // src/step.ts
1694
1694
  var _Step = class _Step {
1695
1695
  /**
1696
1696
  * 构造函数
@@ -2415,7 +2415,7 @@ _Step._interceptors = [];
2415
2415
  _Step.exception = void 0;
2416
2416
  var Step = _Step;
2417
2417
 
2418
- // src/NodeAsync.ts
2418
+ // src/node-async.ts
2419
2419
  var NodeAsync = class {
2420
2420
  /**
2421
2421
  * 构造函数
@@ -2768,7 +2768,7 @@ var NodeAsync = class {
2768
2768
  }
2769
2769
  };
2770
2770
 
2771
- // src/Node.ts
2771
+ // src/node.ts
2772
2772
  var Node = class _Node {
2773
2773
  /**
2774
2774
  * 节点在屏幕中的边界
@@ -3162,7 +3162,7 @@ var Node = class _Node {
3162
3162
  }
3163
3163
  };
3164
3164
 
3165
- // src/AssistsX.ts
3165
+ // src/assistsx.ts
3166
3166
  var callbacks = /* @__PURE__ */ new Map();
3167
3167
  var accessibilityEventListeners = [];
3168
3168
  var screen = null;
@@ -4050,7 +4050,7 @@ if (typeof window !== "undefined") {
4050
4050
  }
4051
4051
  }
4052
4052
 
4053
- // src/NodeClassValue.ts
4053
+ // src/node-class-value.ts
4054
4054
  var NodeClassValue = {
4055
4055
  ImageView: "android.widget.ImageView",
4056
4056
  TextView: "android.widget.TextView",
@@ -4064,7 +4064,7 @@ var NodeClassValue = {
4064
4064
  FrameLayout: "android.widget.FrameLayout"
4065
4065
  };
4066
4066
 
4067
- // src/WindowFlags.ts
4067
+ // src/window-flags.ts
4068
4068
  var WindowFlags = class {
4069
4069
  // 0x1000000
4070
4070
  /**
@@ -4175,7 +4175,7 @@ WindowFlags.FLAG_SHOW_WALLPAPER = 1048576;
4175
4175
  /** 强制硬件加速 */
4176
4176
  WindowFlags.FLAG_HARDWARE_ACCELERATED = 16777216;
4177
4177
 
4178
- // src/AccessibilityEventFilter.ts
4178
+ // src/accessibility-event-filter.ts
4179
4179
  var AccessibilityEventFilter = class _AccessibilityEventFilter {
4180
4180
  constructor(config = {}) {
4181
4181
  var _a, _b, _c, _d, _e;
@@ -6748,7 +6748,7 @@ var Gallery = class {
6748
6748
  };
6749
6749
  var gallery = new Gallery();
6750
6750
 
6751
- // src/mlkit/MlkitCallMethod.ts
6751
+ // src/mlkit/mlkit-call-method.ts
6752
6752
  var MlkitCallMethod = {
6753
6753
  /**
6754
6754
  * 识别屏幕中指定词组的位置(基于当前截图)
@@ -6967,7 +6967,7 @@ var Mlkit = class {
6967
6967
  };
6968
6968
  var mlkit = new Mlkit();
6969
6969
 
6970
- // src/barutils/BarUtilsCallMethod.ts
6970
+ // src/barutils/bar-utils-call-method.ts
6971
6971
  var BarUtilsCallMethod = {
6972
6972
  // Status bar
6973
6973
  getStatusBarHeight: "getStatusBarHeight",
@@ -7292,7 +7292,7 @@ var BarUtils = class {
7292
7292
  };
7293
7293
  var barUtils = new BarUtils();
7294
7294
 
7295
- // src/floatingwindow/FloatCallMethod.ts
7295
+ // src/floatingwindow/float-call-method.ts
7296
7296
  var FloatCallMethod = {
7297
7297
  /** Load floating window */
7298
7298
  open: "open",
@@ -7494,6 +7494,334 @@ var Float = class {
7494
7494
  }
7495
7495
  };
7496
7496
  var float = new Float();
7497
+
7498
+ // src/log/log-call-method.ts
7499
+ var LogCallMethod = {
7500
+ readAllText: "readAllText",
7501
+ clear: "clear",
7502
+ refreshFromFile: "refreshFromFile",
7503
+ appendLine: "appendLine",
7504
+ appendTimestampedEntry: "appendTimestampedEntry",
7505
+ replaceAll: "replaceAll",
7506
+ subscribe: "subscribe",
7507
+ unsubscribe: "unsubscribe",
7508
+ uploadLogs: "uploadLogs",
7509
+ /** 获取日志服务当前域名(origin,无路径;与上传、管理后台同源),对应 AssistsLogDiagnostics.adminWebBaseUrl() */
7510
+ getLogServiceBaseUrl: "getLogServiceBaseUrl"
7511
+ };
7512
+ var LogStream = {
7513
+ latestLine: "latestLine",
7514
+ entireLogText: "entireLogText"
7515
+ };
7516
+
7517
+ // src/log/log.ts
7518
+ var pendingCallbacks = /* @__PURE__ */ new Map();
7519
+ var streamHandlers = /* @__PURE__ */ new Map();
7520
+ var subscriptionIdToCallbackId = /* @__PURE__ */ new Map();
7521
+ if (typeof window !== "undefined" && !window.assistsxLogCallback) {
7522
+ window.assistsxLogCallback = (data) => {
7523
+ try {
7524
+ const json = decodeBase64UTF8(data);
7525
+ const response = JSON.parse(json);
7526
+ const callbackId = response.callbackId;
7527
+ if (!callbackId) {
7528
+ return;
7529
+ }
7530
+ if (streamHandlers.has(callbackId)) {
7531
+ streamHandlers.get(callbackId)(json);
7532
+ return;
7533
+ }
7534
+ const pending = pendingCallbacks.get(callbackId);
7535
+ if (pending) {
7536
+ pending(json);
7537
+ pendingCallbacks.delete(callbackId);
7538
+ }
7539
+ } catch (e) {
7540
+ console.error("Log bridge callback error:", e);
7541
+ }
7542
+ };
7543
+ }
7544
+ var logUpdateListeners = [];
7545
+ if (typeof window !== "undefined" && !window.onAssistsLogUpdate) {
7546
+ window.onAssistsLogUpdate = (encoded) => {
7547
+ logUpdateListeners.forEach((listener) => {
7548
+ try {
7549
+ const decoded = decodeBase64UTF8(encoded);
7550
+ const parsed = JSON.parse(decoded);
7551
+ listener(parsed);
7552
+ } catch (error) {
7553
+ console.error("Log update listener error:", error);
7554
+ }
7555
+ });
7556
+ };
7557
+ }
7558
+ var Log = class {
7559
+ getBridge() {
7560
+ if (typeof window === "undefined" || !window.assistsxLog) {
7561
+ throw new Error("assistsxLog bridge is not available");
7562
+ }
7563
+ return window.assistsxLog;
7564
+ }
7565
+ async asyncCall(method, args, timeout = 30) {
7566
+ const uuid = generateUUID();
7567
+ const params = {
7568
+ method,
7569
+ arguments: args != null ? args : void 0,
7570
+ callbackId: uuid
7571
+ };
7572
+ const promise = new Promise((resolve) => {
7573
+ pendingCallbacks.set(uuid, (data) => {
7574
+ resolve(data);
7575
+ });
7576
+ setTimeout(() => {
7577
+ pendingCallbacks.delete(uuid);
7578
+ resolve(
7579
+ JSON.stringify(new CallResponse(-1, null, uuid))
7580
+ );
7581
+ }, timeout * 1e3);
7582
+ });
7583
+ this.getBridge().call(JSON.stringify(params));
7584
+ const promiseResult = await promise;
7585
+ if (typeof promiseResult === "string") {
7586
+ const responseData = JSON.parse(promiseResult);
7587
+ return new CallResponse(
7588
+ responseData.code,
7589
+ responseData.data,
7590
+ responseData.callbackId
7591
+ );
7592
+ }
7593
+ throw new Error("Log bridge call failed");
7594
+ }
7595
+ /** 读取当前日志全文 */
7596
+ async readAllText(timeout) {
7597
+ var _a;
7598
+ const res = await this.asyncCall(
7599
+ LogCallMethod.readAllText,
7600
+ void 0,
7601
+ timeout
7602
+ );
7603
+ const d = res.getDataOrNull();
7604
+ return (_a = d == null ? void 0 : d.text) != null ? _a : "";
7605
+ }
7606
+ /**
7607
+ * 获取日志服务当前域名(origin,无路径;与上传、管理后台同源)。
7608
+ * 与 Kotlin getLogServiceBaseUrl / adminWebBaseUrl 对齐。
7609
+ */
7610
+ async getLogServiceBaseUrl(timeout) {
7611
+ var _a;
7612
+ const res = await this.asyncCall(
7613
+ LogCallMethod.getLogServiceBaseUrl,
7614
+ void 0,
7615
+ timeout
7616
+ );
7617
+ const d = res.getDataOrNull();
7618
+ return (_a = d == null ? void 0 : d.baseUrl) != null ? _a : "";
7619
+ }
7620
+ /** 清空日志 */
7621
+ async clear(timeout) {
7622
+ const res = await this.asyncCall(
7623
+ LogCallMethod.clear,
7624
+ void 0,
7625
+ timeout
7626
+ );
7627
+ return res.isSuccess();
7628
+ }
7629
+ /** 从文件重新加载到内存 Flow */
7630
+ async refreshFromFile(timeout) {
7631
+ const res = await this.asyncCall(
7632
+ LogCallMethod.refreshFromFile,
7633
+ void 0,
7634
+ timeout
7635
+ );
7636
+ return res.isSuccess();
7637
+ }
7638
+ /** 追加一行 */
7639
+ async appendLine(line, maxLength, timeout) {
7640
+ const args = { line };
7641
+ if (maxLength !== void 0) {
7642
+ args.maxLength = maxLength;
7643
+ }
7644
+ const res = await this.asyncCall(
7645
+ LogCallMethod.appendLine,
7646
+ args,
7647
+ timeout
7648
+ );
7649
+ return res.isSuccess();
7650
+ }
7651
+ /** 追加带时间戳的条目 */
7652
+ async appendTimestampedEntry(message, timeout) {
7653
+ const res = await this.asyncCall(
7654
+ LogCallMethod.appendTimestampedEntry,
7655
+ { message },
7656
+ timeout
7657
+ );
7658
+ return res.isSuccess();
7659
+ }
7660
+ /** 替换全部内容 */
7661
+ async replaceAll(content, timeout) {
7662
+ const res = await this.asyncCall(
7663
+ LogCallMethod.replaceAll,
7664
+ { content },
7665
+ timeout
7666
+ );
7667
+ return res.isSuccess();
7668
+ }
7669
+ /**
7670
+ * 订阅 Flow:先收到 subscribed,再多次 update。
7671
+ * resolve 后请保留 dispose 或调用 unsubscribe(subscriptionId) 以释放原生协程与 JS 回调。
7672
+ */
7673
+ async subscribe(stream, onUpdate, options) {
7674
+ var _a;
7675
+ const self = this;
7676
+ const callbackId = generateUUID();
7677
+ const timeoutSec = (_a = options == null ? void 0 : options.timeout) != null ? _a : 30;
7678
+ return new Promise((resolve, reject) => {
7679
+ let settled = false;
7680
+ const timer = setTimeout(() => {
7681
+ if (!settled) {
7682
+ settled = true;
7683
+ streamHandlers.delete(callbackId);
7684
+ reject(new Error("Log subscribe timeout"));
7685
+ }
7686
+ }, timeoutSec * 1e3);
7687
+ streamHandlers.set(callbackId, (raw) => {
7688
+ var _a2, _b, _c;
7689
+ let response;
7690
+ try {
7691
+ response = JSON.parse(raw);
7692
+ } catch (e) {
7693
+ return;
7694
+ }
7695
+ const data = response.data;
7696
+ const code = response.code;
7697
+ if (typeof code === "number" && code !== 0) {
7698
+ if (!settled) {
7699
+ settled = true;
7700
+ clearTimeout(timer);
7701
+ streamHandlers.delete(callbackId);
7702
+ reject(
7703
+ new Error(
7704
+ (_a2 = response.message) != null ? _a2 : "Log subscribe failed"
7705
+ )
7706
+ );
7707
+ }
7708
+ return;
7709
+ }
7710
+ if ((data == null ? void 0 : data.event) === "subscribed" && data.subscriptionId) {
7711
+ if (!settled) {
7712
+ settled = true;
7713
+ clearTimeout(timer);
7714
+ const sid = data.subscriptionId;
7715
+ subscriptionIdToCallbackId.set(sid, callbackId);
7716
+ resolve({
7717
+ subscriptionId: sid,
7718
+ dispose: async () => {
7719
+ await self.unsubscribe(sid);
7720
+ }
7721
+ });
7722
+ }
7723
+ return;
7724
+ }
7725
+ if ((data == null ? void 0 : data.event) === "update" && data.subscriptionId) {
7726
+ onUpdate({
7727
+ text: (_b = data.text) != null ? _b : "",
7728
+ stream: (_c = data.stream) != null ? _c : stream,
7729
+ subscriptionId: data.subscriptionId
7730
+ });
7731
+ }
7732
+ });
7733
+ try {
7734
+ this.getBridge().call(
7735
+ JSON.stringify({
7736
+ method: LogCallMethod.subscribe,
7737
+ arguments: { stream },
7738
+ callbackId
7739
+ })
7740
+ );
7741
+ } catch (e) {
7742
+ clearTimeout(timer);
7743
+ streamHandlers.delete(callbackId);
7744
+ reject(e);
7745
+ }
7746
+ });
7747
+ }
7748
+ /** 取消订阅(与 Kotlin handleUnsubscribe 对齐) */
7749
+ async unsubscribe(subscriptionId, timeout) {
7750
+ const cbId = subscriptionIdToCallbackId.get(subscriptionId);
7751
+ const res = await this.asyncCall(
7752
+ LogCallMethod.unsubscribe,
7753
+ { subscriptionId },
7754
+ timeout
7755
+ );
7756
+ if (res.isSuccess() && cbId) {
7757
+ streamHandlers.delete(cbId);
7758
+ subscriptionIdToCallbackId.delete(subscriptionId);
7759
+ }
7760
+ return res.isSuccess();
7761
+ }
7762
+ /** 截图 + 节点树 + 日志上传(需 Android API 30+) */
7763
+ async uploadLogs(options) {
7764
+ const { timeout = 60, ...args } = options != null ? options : {};
7765
+ const payload = {};
7766
+ if (args.baseUrl !== void 0) {
7767
+ payload.baseUrl = args.baseUrl;
7768
+ }
7769
+ if (args.format !== void 0) {
7770
+ payload.format = args.format;
7771
+ }
7772
+ if (args.prettyPrint !== void 0) {
7773
+ payload.prettyPrint = args.prettyPrint;
7774
+ }
7775
+ if (args.overlayHiddenDelayMillis !== void 0) {
7776
+ payload.overlayHiddenDelayMillis = args.overlayHiddenDelayMillis;
7777
+ }
7778
+ if (args.uploadKey !== void 0) {
7779
+ payload.uploadKey = args.uploadKey;
7780
+ }
7781
+ const uuid = generateUUID();
7782
+ const params = {
7783
+ method: LogCallMethod.uploadLogs,
7784
+ arguments: Object.keys(payload).length > 0 ? payload : void 0,
7785
+ callbackId: uuid
7786
+ };
7787
+ const promise = new Promise((resolve) => {
7788
+ pendingCallbacks.set(uuid, (data) => {
7789
+ resolve(data);
7790
+ });
7791
+ setTimeout(() => {
7792
+ pendingCallbacks.delete(uuid);
7793
+ resolve(JSON.stringify({ code: -1, data: null, callbackId: uuid }));
7794
+ }, timeout * 1e3);
7795
+ });
7796
+ this.getBridge().call(JSON.stringify(params));
7797
+ const rawStr = await promise;
7798
+ const raw = JSON.parse(rawStr);
7799
+ const d = raw.data;
7800
+ if (d && typeof d === "object" && "success" in d) {
7801
+ return d;
7802
+ }
7803
+ return {
7804
+ success: raw.code === 0,
7805
+ message: typeof raw.message === "string" ? raw.message : raw.code !== 0 ? "uploadLogs failed" : ""
7806
+ };
7807
+ }
7808
+ /**
7809
+ * 注册 onAssistsLogUpdate 推送监听(ASWebView 注入的 Base64 CallResponse,解码后见 LogUpdateEvent)
7810
+ */
7811
+ addLogUpdateListener(listener) {
7812
+ logUpdateListeners.push(listener);
7813
+ }
7814
+ /**
7815
+ * 移除先前通过 addLogUpdateListener 注册的同一函数引用
7816
+ */
7817
+ removeLogUpdateListener(listener) {
7818
+ const i = logUpdateListeners.indexOf(listener);
7819
+ if (i !== -1) {
7820
+ logUpdateListeners.splice(i, 1);
7821
+ }
7822
+ }
7823
+ };
7824
+ var log = new Log();
7497
7825
  export {
7498
7826
  AccessibilityEventFilter,
7499
7827
  AppInfo,
@@ -7514,6 +7842,9 @@ export {
7514
7842
  ImageUtils,
7515
7843
  Ime,
7516
7844
  ImeAction,
7845
+ Log,
7846
+ LogCallMethod,
7847
+ LogStream,
7517
7848
  Mlkit,
7518
7849
  MlkitCallMethod,
7519
7850
  Node,
@@ -7537,6 +7868,8 @@ export {
7537
7868
  http,
7538
7869
  imageUtils,
7539
7870
  ime,
7871
+ log,
7872
+ logUpdateListeners,
7540
7873
  mlkit,
7541
7874
  pathUtils,
7542
7875
  screen,