@sqaitech/shared 0.30.10

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 (169) hide show
  1. package/README.md +9 -0
  2. package/dist/es/baseDB.mjs +109 -0
  3. package/dist/es/build/copy-static.mjs +29 -0
  4. package/dist/es/common.mjs +37 -0
  5. package/dist/es/constants/example-code.mjs +202 -0
  6. package/dist/es/constants/index.mjs +24 -0
  7. package/dist/es/env/basic.mjs +6 -0
  8. package/dist/es/env/constants.mjs +97 -0
  9. package/dist/es/env/decide-model-config.mjs +172 -0
  10. package/dist/es/env/global-config-manager.mjs +91 -0
  11. package/dist/es/env/helper.mjs +48 -0
  12. package/dist/es/env/index.mjs +5 -0
  13. package/dist/es/env/init-debug.mjs +18 -0
  14. package/dist/es/env/model-config-manager.mjs +99 -0
  15. package/dist/es/env/parse.mjs +69 -0
  16. package/dist/es/env/types.mjs +253 -0
  17. package/dist/es/env/utils.mjs +18 -0
  18. package/dist/es/extractor/constants.mjs +2 -0
  19. package/dist/es/extractor/debug.mjs +6 -0
  20. package/dist/es/extractor/dom-util.mjs +92 -0
  21. package/dist/es/extractor/index.mjs +6 -0
  22. package/dist/es/extractor/locator.mjs +95 -0
  23. package/dist/es/extractor/tree.mjs +81 -0
  24. package/dist/es/extractor/util.mjs +244 -0
  25. package/dist/es/extractor/web-extractor.mjs +310 -0
  26. package/dist/es/img/box-select.mjs +184 -0
  27. package/dist/es/img/draw-box.mjs +42 -0
  28. package/dist/es/img/get-jimp.mjs +10 -0
  29. package/dist/es/img/get-photon.mjs +19 -0
  30. package/dist/es/img/get-sharp.mjs +11 -0
  31. package/dist/es/img/index.mjs +5 -0
  32. package/dist/es/img/info.mjs +32 -0
  33. package/dist/es/img/transform.mjs +192 -0
  34. package/dist/es/index.mjs +3 -0
  35. package/dist/es/logger.mjs +61 -0
  36. package/dist/es/node/fs.mjs +44 -0
  37. package/dist/es/node/index.mjs +1 -0
  38. package/dist/es/polyfills/async-hooks.mjs +2 -0
  39. package/dist/es/polyfills/index.mjs +1 -0
  40. package/dist/es/types/index.mjs +3 -0
  41. package/dist/es/us-keyboard-layout.mjs +1414 -0
  42. package/dist/es/us-keyboard-layout.mjs.LICENSE.txt +5 -0
  43. package/dist/es/utils.mjs +66 -0
  44. package/dist/lib/baseDB.js +149 -0
  45. package/dist/lib/build/copy-static.js +77 -0
  46. package/dist/lib/common.js +93 -0
  47. package/dist/lib/constants/example-code.js +239 -0
  48. package/dist/lib/constants/index.js +100 -0
  49. package/dist/lib/env/basic.js +40 -0
  50. package/dist/lib/env/constants.js +143 -0
  51. package/dist/lib/env/decide-model-config.js +212 -0
  52. package/dist/lib/env/global-config-manager.js +125 -0
  53. package/dist/lib/env/helper.js +89 -0
  54. package/dist/lib/env/index.js +94 -0
  55. package/dist/lib/env/init-debug.js +52 -0
  56. package/dist/lib/env/model-config-manager.js +133 -0
  57. package/dist/lib/env/parse.js +106 -0
  58. package/dist/lib/env/types.js +635 -0
  59. package/dist/lib/env/utils.js +61 -0
  60. package/dist/lib/extractor/constants.js +42 -0
  61. package/dist/lib/extractor/debug.js +12 -0
  62. package/dist/lib/extractor/dom-util.js +150 -0
  63. package/dist/lib/extractor/index.js +88 -0
  64. package/dist/lib/extractor/locator.js +141 -0
  65. package/dist/lib/extractor/tree.js +127 -0
  66. package/dist/lib/extractor/util.js +335 -0
  67. package/dist/lib/extractor/web-extractor.js +356 -0
  68. package/dist/lib/img/box-select.js +232 -0
  69. package/dist/lib/img/draw-box.js +89 -0
  70. package/dist/lib/img/get-jimp.js +72 -0
  71. package/dist/lib/img/get-photon.js +76 -0
  72. package/dist/lib/img/get-sharp.js +63 -0
  73. package/dist/lib/img/index.js +102 -0
  74. package/dist/lib/img/info.js +86 -0
  75. package/dist/lib/img/transform.js +279 -0
  76. package/dist/lib/index.js +43 -0
  77. package/dist/lib/logger.js +114 -0
  78. package/dist/lib/node/fs.js +97 -0
  79. package/dist/lib/node/index.js +60 -0
  80. package/dist/lib/polyfills/async-hooks.js +36 -0
  81. package/dist/lib/polyfills/index.js +60 -0
  82. package/dist/lib/types/index.js +37 -0
  83. package/dist/lib/us-keyboard-layout.js +1457 -0
  84. package/dist/lib/us-keyboard-layout.js.LICENSE.txt +5 -0
  85. package/dist/lib/utils.js +136 -0
  86. package/dist/types/baseDB.d.ts +25 -0
  87. package/dist/types/build/copy-static.d.ts +31 -0
  88. package/dist/types/common.d.ts +12 -0
  89. package/dist/types/constants/example-code.d.ts +2 -0
  90. package/dist/types/constants/index.d.ts +22 -0
  91. package/dist/types/env/basic.d.ts +6 -0
  92. package/dist/types/env/constants.d.ts +40 -0
  93. package/dist/types/env/decide-model-config.d.ts +14 -0
  94. package/dist/types/env/global-config-manager.d.ts +32 -0
  95. package/dist/types/env/helper.d.ts +6 -0
  96. package/dist/types/env/index.d.ts +4 -0
  97. package/dist/types/env/init-debug.d.ts +1 -0
  98. package/dist/types/env/model-config-manager.d.ts +24 -0
  99. package/dist/types/env/parse.d.ts +12 -0
  100. package/dist/types/env/types.d.ts +294 -0
  101. package/dist/types/env/utils.d.ts +7 -0
  102. package/dist/types/extractor/constants.d.ts +1 -0
  103. package/dist/types/extractor/debug.d.ts +1 -0
  104. package/dist/types/extractor/dom-util.d.ts +26 -0
  105. package/dist/types/extractor/index.d.ts +33 -0
  106. package/dist/types/extractor/locator.d.ts +7 -0
  107. package/dist/types/extractor/tree.d.ts +9 -0
  108. package/dist/types/extractor/util.d.ts +43 -0
  109. package/dist/types/extractor/web-extractor.d.ts +19 -0
  110. package/dist/types/img/box-select.d.ts +25 -0
  111. package/dist/types/img/draw-box.d.ts +15 -0
  112. package/dist/types/img/get-jimp.d.ts +2 -0
  113. package/dist/types/img/get-photon.d.ts +8 -0
  114. package/dist/types/img/get-sharp.d.ts +3 -0
  115. package/dist/types/img/index.d.ts +4 -0
  116. package/dist/types/img/info.d.ts +29 -0
  117. package/dist/types/img/transform.d.ts +88 -0
  118. package/dist/types/index.d.ts +3 -0
  119. package/dist/types/logger.d.ts +4 -0
  120. package/dist/types/node/fs.d.ts +15 -0
  121. package/dist/types/node/index.d.ts +1 -0
  122. package/dist/types/polyfills/async-hooks.d.ts +6 -0
  123. package/dist/types/polyfills/index.d.ts +4 -0
  124. package/dist/types/types/index.d.ts +34 -0
  125. package/dist/types/us-keyboard-layout.d.ts +32 -0
  126. package/dist/types/utils.d.ts +22 -0
  127. package/package.json +106 -0
  128. package/src/baseDB.ts +158 -0
  129. package/src/build/copy-static.ts +62 -0
  130. package/src/common.ts +67 -0
  131. package/src/constants/example-code.ts +202 -0
  132. package/src/constants/index.ts +30 -0
  133. package/src/env/basic.ts +12 -0
  134. package/src/env/constants.ts +291 -0
  135. package/src/env/decide-model-config.ts +319 -0
  136. package/src/env/global-config-manager.ts +174 -0
  137. package/src/env/helper.ts +79 -0
  138. package/src/env/index.ts +4 -0
  139. package/src/env/init-debug.ts +29 -0
  140. package/src/env/model-config-manager.ts +145 -0
  141. package/src/env/parse.ts +131 -0
  142. package/src/env/types.ts +560 -0
  143. package/src/env/utils.ts +39 -0
  144. package/src/extractor/constants.ts +5 -0
  145. package/src/extractor/debug.ts +10 -0
  146. package/src/extractor/dom-util.ts +152 -0
  147. package/src/extractor/index.ts +50 -0
  148. package/src/extractor/locator.ts +179 -0
  149. package/src/extractor/tree.ts +179 -0
  150. package/src/extractor/util.ts +468 -0
  151. package/src/extractor/web-extractor.ts +481 -0
  152. package/src/img/box-select.ts +346 -0
  153. package/src/img/draw-box.ts +60 -0
  154. package/src/img/get-jimp.ts +12 -0
  155. package/src/img/get-photon.ts +48 -0
  156. package/src/img/get-sharp.ts +18 -0
  157. package/src/img/index.ts +24 -0
  158. package/src/img/info.ts +79 -0
  159. package/src/img/jimp.d.ts +4 -0
  160. package/src/img/transform.ts +396 -0
  161. package/src/index.ts +6 -0
  162. package/src/logger.ts +93 -0
  163. package/src/node/fs.ts +84 -0
  164. package/src/node/index.ts +1 -0
  165. package/src/polyfills/async-hooks.ts +6 -0
  166. package/src/polyfills/index.ts +4 -0
  167. package/src/types/index.ts +47 -0
  168. package/src/us-keyboard-layout.ts +723 -0
  169. package/src/utils.ts +127 -0
@@ -0,0 +1,253 @@
1
+ const SQAI_OPENAI_INIT_CONFIG_JSON = 'SQAI_OPENAI_INIT_CONFIG_JSON';
2
+ const SQAI_MODEL_NAME = 'SQAI_MODEL_NAME';
3
+ const SQAI_LANGSMITH_DEBUG = 'SQAI_LANGSMITH_DEBUG';
4
+ const SQAI_DEBUG_AI_PROFILE = 'SQAI_DEBUG_AI_PROFILE';
5
+ const SQAI_DEBUG_AI_RESPONSE = 'SQAI_DEBUG_AI_RESPONSE';
6
+ const SQAI_DANGEROUSLY_PRINT_ALL_CONFIG = 'SQAI_DANGEROUSLY_PRINT_ALL_CONFIG';
7
+ const SQAI_DEBUG_MODE = 'SQAI_DEBUG_MODE';
8
+ const SQAI_MCP_USE_PUPPETEER_MODE = 'SQAI_MCP_USE_PUPPETEER_MODE';
9
+ const SQAI_MCP_CHROME_PATH = 'SQAI_MCP_CHROME_PATH';
10
+ const SQAI_MCP_ANDROID_MODE = 'SQAI_MCP_ANDROID_MODE';
11
+ const DOCKER_CONTAINER = 'DOCKER_CONTAINER';
12
+ const SQAI_FORCE_DEEP_THINK = 'SQAI_FORCE_DEEP_THINK';
13
+ const SQAI_OPENAI_SOCKS_PROXY = 'SQAI_OPENAI_SOCKS_PROXY';
14
+ const SQAI_OPENAI_HTTP_PROXY = 'SQAI_OPENAI_HTTP_PROXY';
15
+ const OPENAI_API_KEY = 'OPENAI_API_KEY';
16
+ const OPENAI_BASE_URL = 'OPENAI_BASE_URL';
17
+ const OPENAI_MAX_TOKENS = 'OPENAI_MAX_TOKENS';
18
+ const SQAI_ADB_PATH = 'SQAI_ADB_PATH';
19
+ const SQAI_ADB_REMOTE_HOST = 'SQAI_ADB_REMOTE_HOST';
20
+ const SQAI_ADB_REMOTE_PORT = 'SQAI_ADB_REMOTE_PORT';
21
+ const SQAI_ANDROID_IME_STRATEGY = 'SQAI_ANDROID_IME_STRATEGY';
22
+ const SQAI_IOS_DEVICE_UDID = 'SQAI_IOS_DEVICE_UDID';
23
+ const SQAI_IOS_SIMULATOR_UDID = 'SQAI_IOS_SIMULATOR_UDID';
24
+ const SQAI_CACHE = 'SQAI_CACHE';
25
+ const SQAI_USE_VLM_UI_TARS = 'SQAI_USE_VLM_UI_TARS';
26
+ const SQAI_USE_QWEN_VL = 'SQAI_USE_QWEN_VL';
27
+ const SQAI_USE_QWEN3_VL = 'SQAI_USE_QWEN3_VL';
28
+ const SQAI_USE_DOUBAO_VISION = 'SQAI_USE_DOUBAO_VISION';
29
+ const SQAI_USE_GEMINI = 'SQAI_USE_GEMINI';
30
+ const SQAI_USE_VL_MODEL = 'SQAI_USE_VL_MODEL';
31
+ const MATCH_BY_POSITION = 'MATCH_BY_POSITION';
32
+ const SQAI_API_TYPE = 'SQAI-API-TYPE';
33
+ const SQAI_REPORT_TAG_NAME = 'SQAI_REPORT_TAG_NAME';
34
+ const SQAI_REPLANNING_CYCLE_LIMIT = 'SQAI_REPLANNING_CYCLE_LIMIT';
35
+ const SQAI_PREFERRED_LANGUAGE = 'SQAI_PREFERRED_LANGUAGE';
36
+ const SQAI_USE_AZURE_OPENAI = 'SQAI_USE_AZURE_OPENAI';
37
+ const SQAI_AZURE_OPENAI_SCOPE = 'SQAI_AZURE_OPENAI_SCOPE';
38
+ const SQAI_AZURE_OPENAI_INIT_CONFIG_JSON = 'SQAI_AZURE_OPENAI_INIT_CONFIG_JSON';
39
+ const SQAI_CACHE_MAX_FILENAME_LENGTH = 'SQAI_CACHE_MAX_FILENAME_LENGTH';
40
+ const AZURE_OPENAI_ENDPOINT = 'AZURE_OPENAI_ENDPOINT';
41
+ const AZURE_OPENAI_KEY = 'AZURE_OPENAI_KEY';
42
+ const AZURE_OPENAI_API_VERSION = 'AZURE_OPENAI_API_VERSION';
43
+ const AZURE_OPENAI_DEPLOYMENT = 'AZURE_OPENAI_DEPLOYMENT';
44
+ const SQAI_USE_ANTHROPIC_SDK = 'SQAI_USE_ANTHROPIC_SDK';
45
+ const ANTHROPIC_API_KEY = 'ANTHROPIC_API_KEY';
46
+ const SQAI_RUN_DIR = 'SQAI_RUN_DIR';
47
+ const SQAI_OPENAI_BASE_URL = 'SQAI_OPENAI_BASE_URL';
48
+ const SQAI_OPENAI_API_KEY = 'SQAI_OPENAI_API_KEY';
49
+ const SQAI_OPENAI_USE_AZURE = 'SQAI_OPENAI_USE_AZURE';
50
+ const SQAI_AZURE_OPENAI_KEY = 'SQAI_AZURE_OPENAI_KEY';
51
+ const SQAI_AZURE_OPENAI_ENDPOINT = 'SQAI_AZURE_OPENAI_ENDPOINT';
52
+ const SQAI_AZURE_OPENAI_API_VERSION = 'SQAI_AZURE_OPENAI_API_VERSION';
53
+ const SQAI_AZURE_OPENAI_DEPLOYMENT = 'SQAI_AZURE_OPENAI_DEPLOYMENT';
54
+ const SQAI_ANTHROPIC_API_KEY = 'SQAI_ANTHROPIC_API_KEY';
55
+ const SQAI_VL_MODE = 'SQAI_VL_MODE';
56
+ const SQAI_VQA_MODEL_NAME = 'SQAI_VQA_MODEL_NAME';
57
+ const SQAI_VQA_OPENAI_SOCKS_PROXY = 'SQAI_VQA_OPENAI_SOCKS_PROXY';
58
+ const SQAI_VQA_OPENAI_HTTP_PROXY = 'SQAI_VQA_OPENAI_HTTP_PROXY';
59
+ const SQAI_VQA_OPENAI_BASE_URL = 'SQAI_VQA_OPENAI_BASE_URL';
60
+ const SQAI_VQA_OPENAI_API_KEY = 'SQAI_VQA_OPENAI_API_KEY';
61
+ const SQAI_VQA_OPENAI_INIT_CONFIG_JSON = 'SQAI_VQA_OPENAI_INIT_CONFIG_JSON';
62
+ const SQAI_VQA_OPENAI_USE_AZURE = 'SQAI_VQA_OPENAI_USE_AZURE';
63
+ const SQAI_VQA_USE_AZURE_OPENAI = 'SQAI_VQA_USE_AZURE_OPENAI';
64
+ const SQAI_VQA_AZURE_OPENAI_SCOPE = 'SQAI_VQA_AZURE_OPENAI_SCOPE';
65
+ const SQAI_VQA_AZURE_OPENAI_KEY = 'SQAI_VQA_AZURE_OPENAI_KEY';
66
+ const SQAI_VQA_AZURE_OPENAI_ENDPOINT = 'SQAI_VQA_AZURE_OPENAI_ENDPOINT';
67
+ const SQAI_VQA_AZURE_OPENAI_API_VERSION = 'SQAI_VQA_AZURE_OPENAI_API_VERSION';
68
+ const SQAI_VQA_AZURE_OPENAI_DEPLOYMENT = 'SQAI_VQA_AZURE_OPENAI_DEPLOYMENT';
69
+ const SQAI_VQA_AZURE_OPENAI_INIT_CONFIG_JSON = 'SQAI_VQA_AZURE_OPENAI_INIT_CONFIG_JSON';
70
+ const SQAI_VQA_USE_ANTHROPIC_SDK = 'SQAI_VQA_USE_ANTHROPIC_SDK';
71
+ const SQAI_VQA_ANTHROPIC_API_KEY = 'SQAI_VQA_ANTHROPIC_API_KEY';
72
+ const SQAI_VQA_VL_MODE = 'SQAI_VQA_VL_MODE';
73
+ const SQAI_PLANNING_MODEL_NAME = 'SQAI_PLANNING_MODEL_NAME';
74
+ const SQAI_PLANNING_OPENAI_SOCKS_PROXY = 'SQAI_PLANNING_OPENAI_SOCKS_PROXY';
75
+ const SQAI_PLANNING_OPENAI_HTTP_PROXY = 'SQAI_PLANNING_OPENAI_HTTP_PROXY';
76
+ const SQAI_PLANNING_OPENAI_BASE_URL = 'SQAI_PLANNING_OPENAI_BASE_URL';
77
+ const SQAI_PLANNING_OPENAI_API_KEY = 'SQAI_PLANNING_OPENAI_API_KEY';
78
+ const SQAI_PLANNING_OPENAI_INIT_CONFIG_JSON = 'SQAI_PLANNING_OPENAI_INIT_CONFIG_JSON';
79
+ const SQAI_PLANNING_OPENAI_USE_AZURE = 'SQAI_PLANNING_OPENAI_USE_AZURE';
80
+ const SQAI_PLANNING_USE_AZURE_OPENAI = 'SQAI_PLANNING_USE_AZURE_OPENAI';
81
+ const SQAI_PLANNING_AZURE_OPENAI_SCOPE = 'SQAI_PLANNING_AZURE_OPENAI_SCOPE';
82
+ const SQAI_PLANNING_AZURE_OPENAI_KEY = 'SQAI_PLANNING_AZURE_OPENAI_KEY';
83
+ const SQAI_PLANNING_AZURE_OPENAI_ENDPOINT = 'SQAI_PLANNING_AZURE_OPENAI_ENDPOINT';
84
+ const SQAI_PLANNING_AZURE_OPENAI_API_VERSION = 'SQAI_PLANNING_AZURE_OPENAI_API_VERSION';
85
+ const SQAI_PLANNING_AZURE_OPENAI_DEPLOYMENT = 'SQAI_PLANNING_AZURE_OPENAI_DEPLOYMENT';
86
+ const SQAI_PLANNING_AZURE_OPENAI_INIT_CONFIG_JSON = 'SQAI_PLANNING_AZURE_OPENAI_INIT_CONFIG_JSON';
87
+ const SQAI_PLANNING_USE_ANTHROPIC_SDK = 'SQAI_PLANNING_USE_ANTHROPIC_SDK';
88
+ const SQAI_PLANNING_ANTHROPIC_API_KEY = 'SQAI_PLANNING_ANTHROPIC_API_KEY';
89
+ const SQAI_PLANNING_VL_MODE = 'SQAI_PLANNING_VL_MODE';
90
+ const SQAI_GROUNDING_MODEL_NAME = 'SQAI_GROUNDING_MODEL_NAME';
91
+ const SQAI_GROUNDING_OPENAI_SOCKS_PROXY = 'SQAI_GROUNDING_OPENAI_SOCKS_PROXY';
92
+ const SQAI_GROUNDING_OPENAI_HTTP_PROXY = 'SQAI_GROUNDING_OPENAI_HTTP_PROXY';
93
+ const SQAI_GROUNDING_OPENAI_BASE_URL = 'SQAI_GROUNDING_OPENAI_BASE_URL';
94
+ const SQAI_GROUNDING_OPENAI_API_KEY = 'SQAI_GROUNDING_OPENAI_API_KEY';
95
+ const SQAI_GROUNDING_OPENAI_INIT_CONFIG_JSON = 'SQAI_GROUNDING_OPENAI_INIT_CONFIG_JSON';
96
+ const SQAI_GROUNDING_OPENAI_USE_AZURE = 'SQAI_GROUNDING_OPENAI_USE_AZURE';
97
+ const SQAI_GROUNDING_USE_AZURE_OPENAI = 'SQAI_GROUNDING_USE_AZURE_OPENAI';
98
+ const SQAI_GROUNDING_AZURE_OPENAI_SCOPE = 'SQAI_GROUNDING_AZURE_OPENAI_SCOPE';
99
+ const SQAI_GROUNDING_AZURE_OPENAI_KEY = 'SQAI_GROUNDING_AZURE_OPENAI_KEY';
100
+ const SQAI_GROUNDING_AZURE_OPENAI_ENDPOINT = 'SQAI_GROUNDING_AZURE_OPENAI_ENDPOINT';
101
+ const SQAI_GROUNDING_AZURE_OPENAI_API_VERSION = 'SQAI_GROUNDING_AZURE_OPENAI_API_VERSION';
102
+ const SQAI_GROUNDING_AZURE_OPENAI_DEPLOYMENT = 'SQAI_GROUNDING_AZURE_OPENAI_DEPLOYMENT';
103
+ const SQAI_GROUNDING_AZURE_OPENAI_INIT_CONFIG_JSON = 'SQAI_GROUNDING_AZURE_OPENAI_INIT_CONFIG_JSON';
104
+ const SQAI_GROUNDING_USE_ANTHROPIC_SDK = 'SQAI_GROUNDING_USE_ANTHROPIC_SDK';
105
+ const SQAI_GROUNDING_ANTHROPIC_API_KEY = 'SQAI_GROUNDING_ANTHROPIC_API_KEY';
106
+ const SQAI_GROUNDING_VL_MODE = 'SQAI_GROUNDING_VL_MODE';
107
+ const OPENAI_USE_AZURE = 'OPENAI_USE_AZURE';
108
+ const UNUSED_ENV_KEYS = [
109
+ SQAI_DANGEROUSLY_PRINT_ALL_CONFIG
110
+ ];
111
+ const BASIC_ENV_KEYS = [
112
+ SQAI_DEBUG_MODE,
113
+ SQAI_DEBUG_AI_PROFILE,
114
+ SQAI_DEBUG_AI_RESPONSE,
115
+ SQAI_RUN_DIR
116
+ ];
117
+ const BOOLEAN_ENV_KEYS = [
118
+ SQAI_CACHE,
119
+ SQAI_LANGSMITH_DEBUG,
120
+ SQAI_FORCE_DEEP_THINK,
121
+ SQAI_MCP_USE_PUPPETEER_MODE,
122
+ SQAI_MCP_ANDROID_MODE
123
+ ];
124
+ const NUMBER_ENV_KEYS = [
125
+ SQAI_CACHE_MAX_FILENAME_LENGTH,
126
+ SQAI_REPLANNING_CYCLE_LIMIT
127
+ ];
128
+ const STRING_ENV_KEYS = [
129
+ OPENAI_MAX_TOKENS,
130
+ SQAI_ADB_PATH,
131
+ SQAI_ADB_REMOTE_HOST,
132
+ SQAI_ADB_REMOTE_PORT,
133
+ SQAI_ANDROID_IME_STRATEGY,
134
+ SQAI_IOS_DEVICE_UDID,
135
+ SQAI_IOS_SIMULATOR_UDID,
136
+ SQAI_REPORT_TAG_NAME,
137
+ SQAI_PREFERRED_LANGUAGE,
138
+ MATCH_BY_POSITION,
139
+ SQAI_MCP_CHROME_PATH,
140
+ DOCKER_CONTAINER
141
+ ];
142
+ const GLOBAL_ENV_KEYS = [
143
+ ...BOOLEAN_ENV_KEYS,
144
+ ...NUMBER_ENV_KEYS,
145
+ ...STRING_ENV_KEYS
146
+ ];
147
+ const MODEL_ENV_KEYS = [
148
+ SQAI_MODEL_NAME,
149
+ SQAI_OPENAI_INIT_CONFIG_JSON,
150
+ SQAI_OPENAI_API_KEY,
151
+ SQAI_OPENAI_BASE_URL,
152
+ SQAI_OPENAI_USE_AZURE,
153
+ SQAI_OPENAI_SOCKS_PROXY,
154
+ SQAI_OPENAI_HTTP_PROXY,
155
+ SQAI_USE_AZURE_OPENAI,
156
+ SQAI_AZURE_OPENAI_SCOPE,
157
+ SQAI_AZURE_OPENAI_INIT_CONFIG_JSON,
158
+ SQAI_USE_ANTHROPIC_SDK,
159
+ SQAI_USE_VLM_UI_TARS,
160
+ SQAI_USE_QWEN_VL,
161
+ SQAI_USE_QWEN3_VL,
162
+ SQAI_USE_DOUBAO_VISION,
163
+ SQAI_USE_GEMINI,
164
+ SQAI_USE_VL_MODEL,
165
+ ANTHROPIC_API_KEY,
166
+ SQAI_AZURE_OPENAI_ENDPOINT,
167
+ SQAI_AZURE_OPENAI_KEY,
168
+ SQAI_AZURE_OPENAI_API_VERSION,
169
+ SQAI_AZURE_OPENAI_DEPLOYMENT,
170
+ SQAI_VL_MODE,
171
+ OPENAI_API_KEY,
172
+ OPENAI_BASE_URL,
173
+ OPENAI_USE_AZURE,
174
+ ANTHROPIC_API_KEY,
175
+ AZURE_OPENAI_ENDPOINT,
176
+ AZURE_OPENAI_KEY,
177
+ AZURE_OPENAI_API_VERSION,
178
+ AZURE_OPENAI_DEPLOYMENT,
179
+ SQAI_VQA_MODEL_NAME,
180
+ SQAI_VQA_OPENAI_SOCKS_PROXY,
181
+ SQAI_VQA_OPENAI_HTTP_PROXY,
182
+ SQAI_VQA_OPENAI_BASE_URL,
183
+ SQAI_VQA_OPENAI_API_KEY,
184
+ SQAI_VQA_OPENAI_INIT_CONFIG_JSON,
185
+ SQAI_VQA_OPENAI_USE_AZURE,
186
+ SQAI_VQA_USE_AZURE_OPENAI,
187
+ SQAI_VQA_AZURE_OPENAI_SCOPE,
188
+ SQAI_VQA_AZURE_OPENAI_KEY,
189
+ SQAI_VQA_AZURE_OPENAI_ENDPOINT,
190
+ SQAI_VQA_AZURE_OPENAI_API_VERSION,
191
+ SQAI_VQA_AZURE_OPENAI_DEPLOYMENT,
192
+ SQAI_VQA_AZURE_OPENAI_INIT_CONFIG_JSON,
193
+ SQAI_VQA_USE_ANTHROPIC_SDK,
194
+ SQAI_VQA_ANTHROPIC_API_KEY,
195
+ SQAI_VQA_VL_MODE,
196
+ SQAI_PLANNING_MODEL_NAME,
197
+ SQAI_PLANNING_OPENAI_SOCKS_PROXY,
198
+ SQAI_PLANNING_OPENAI_HTTP_PROXY,
199
+ SQAI_PLANNING_OPENAI_BASE_URL,
200
+ SQAI_PLANNING_OPENAI_API_KEY,
201
+ SQAI_PLANNING_OPENAI_INIT_CONFIG_JSON,
202
+ SQAI_PLANNING_OPENAI_USE_AZURE,
203
+ SQAI_PLANNING_USE_AZURE_OPENAI,
204
+ SQAI_PLANNING_AZURE_OPENAI_SCOPE,
205
+ SQAI_PLANNING_AZURE_OPENAI_KEY,
206
+ SQAI_PLANNING_AZURE_OPENAI_ENDPOINT,
207
+ SQAI_PLANNING_AZURE_OPENAI_API_VERSION,
208
+ SQAI_PLANNING_AZURE_OPENAI_DEPLOYMENT,
209
+ SQAI_PLANNING_AZURE_OPENAI_INIT_CONFIG_JSON,
210
+ SQAI_PLANNING_USE_ANTHROPIC_SDK,
211
+ SQAI_PLANNING_ANTHROPIC_API_KEY,
212
+ SQAI_PLANNING_VL_MODE,
213
+ SQAI_GROUNDING_MODEL_NAME,
214
+ SQAI_GROUNDING_OPENAI_SOCKS_PROXY,
215
+ SQAI_GROUNDING_OPENAI_HTTP_PROXY,
216
+ SQAI_GROUNDING_OPENAI_BASE_URL,
217
+ SQAI_GROUNDING_OPENAI_API_KEY,
218
+ SQAI_GROUNDING_OPENAI_INIT_CONFIG_JSON,
219
+ SQAI_GROUNDING_OPENAI_USE_AZURE,
220
+ SQAI_GROUNDING_USE_AZURE_OPENAI,
221
+ SQAI_GROUNDING_AZURE_OPENAI_SCOPE,
222
+ SQAI_GROUNDING_AZURE_OPENAI_KEY,
223
+ SQAI_GROUNDING_AZURE_OPENAI_ENDPOINT,
224
+ SQAI_GROUNDING_AZURE_OPENAI_API_VERSION,
225
+ SQAI_GROUNDING_AZURE_OPENAI_DEPLOYMENT,
226
+ SQAI_GROUNDING_AZURE_OPENAI_INIT_CONFIG_JSON,
227
+ SQAI_GROUNDING_USE_ANTHROPIC_SDK,
228
+ SQAI_GROUNDING_ANTHROPIC_API_KEY,
229
+ SQAI_GROUNDING_VL_MODE
230
+ ];
231
+ const ALL_ENV_KEYS = [
232
+ ...UNUSED_ENV_KEYS,
233
+ ...BASIC_ENV_KEYS,
234
+ ...GLOBAL_ENV_KEYS,
235
+ ...MODEL_ENV_KEYS
236
+ ];
237
+ var types_UITarsModelVersion = /*#__PURE__*/ function(UITarsModelVersion) {
238
+ UITarsModelVersion["V1_0"] = "1.0";
239
+ UITarsModelVersion["V1_5"] = "1.5";
240
+ UITarsModelVersion["DOUBAO_1_5_15B"] = "doubao-1.5-15B";
241
+ UITarsModelVersion["DOUBAO_1_5_20B"] = "doubao-1.5-20B";
242
+ return UITarsModelVersion;
243
+ }({});
244
+ const VL_MODE_RAW_VALID_VALUES = [
245
+ 'doubao-vision',
246
+ 'gemini',
247
+ 'qwen-vl',
248
+ 'qwen3-vl',
249
+ 'vlm-ui-tars',
250
+ 'vlm-ui-tars-doubao',
251
+ 'vlm-ui-tars-doubao-1.5'
252
+ ];
253
+ export { ALL_ENV_KEYS, ANTHROPIC_API_KEY, AZURE_OPENAI_API_VERSION, AZURE_OPENAI_DEPLOYMENT, AZURE_OPENAI_ENDPOINT, AZURE_OPENAI_KEY, BASIC_ENV_KEYS, BOOLEAN_ENV_KEYS, DOCKER_CONTAINER, GLOBAL_ENV_KEYS, MATCH_BY_POSITION, MODEL_ENV_KEYS, NUMBER_ENV_KEYS, OPENAI_API_KEY, OPENAI_BASE_URL, OPENAI_MAX_TOKENS, OPENAI_USE_AZURE, SQAI_ADB_PATH, SQAI_ADB_REMOTE_HOST, SQAI_ADB_REMOTE_PORT, SQAI_ANDROID_IME_STRATEGY, SQAI_ANTHROPIC_API_KEY, SQAI_API_TYPE, SQAI_AZURE_OPENAI_API_VERSION, SQAI_AZURE_OPENAI_DEPLOYMENT, SQAI_AZURE_OPENAI_ENDPOINT, SQAI_AZURE_OPENAI_INIT_CONFIG_JSON, SQAI_AZURE_OPENAI_KEY, SQAI_AZURE_OPENAI_SCOPE, SQAI_CACHE, SQAI_CACHE_MAX_FILENAME_LENGTH, SQAI_DANGEROUSLY_PRINT_ALL_CONFIG, SQAI_DEBUG_AI_PROFILE, SQAI_DEBUG_AI_RESPONSE, SQAI_DEBUG_MODE, SQAI_FORCE_DEEP_THINK, SQAI_GROUNDING_ANTHROPIC_API_KEY, SQAI_GROUNDING_AZURE_OPENAI_API_VERSION, SQAI_GROUNDING_AZURE_OPENAI_DEPLOYMENT, SQAI_GROUNDING_AZURE_OPENAI_ENDPOINT, SQAI_GROUNDING_AZURE_OPENAI_INIT_CONFIG_JSON, SQAI_GROUNDING_AZURE_OPENAI_KEY, SQAI_GROUNDING_AZURE_OPENAI_SCOPE, SQAI_GROUNDING_MODEL_NAME, SQAI_GROUNDING_OPENAI_API_KEY, SQAI_GROUNDING_OPENAI_BASE_URL, SQAI_GROUNDING_OPENAI_HTTP_PROXY, SQAI_GROUNDING_OPENAI_INIT_CONFIG_JSON, SQAI_GROUNDING_OPENAI_SOCKS_PROXY, SQAI_GROUNDING_OPENAI_USE_AZURE, SQAI_GROUNDING_USE_ANTHROPIC_SDK, SQAI_GROUNDING_USE_AZURE_OPENAI, SQAI_GROUNDING_VL_MODE, SQAI_IOS_DEVICE_UDID, SQAI_IOS_SIMULATOR_UDID, SQAI_LANGSMITH_DEBUG, SQAI_MCP_ANDROID_MODE, SQAI_MCP_CHROME_PATH, SQAI_MCP_USE_PUPPETEER_MODE, SQAI_MODEL_NAME, SQAI_OPENAI_API_KEY, SQAI_OPENAI_BASE_URL, SQAI_OPENAI_HTTP_PROXY, SQAI_OPENAI_INIT_CONFIG_JSON, SQAI_OPENAI_SOCKS_PROXY, SQAI_OPENAI_USE_AZURE, SQAI_PLANNING_ANTHROPIC_API_KEY, SQAI_PLANNING_AZURE_OPENAI_API_VERSION, SQAI_PLANNING_AZURE_OPENAI_DEPLOYMENT, SQAI_PLANNING_AZURE_OPENAI_ENDPOINT, SQAI_PLANNING_AZURE_OPENAI_INIT_CONFIG_JSON, SQAI_PLANNING_AZURE_OPENAI_KEY, SQAI_PLANNING_AZURE_OPENAI_SCOPE, SQAI_PLANNING_MODEL_NAME, SQAI_PLANNING_OPENAI_API_KEY, SQAI_PLANNING_OPENAI_BASE_URL, SQAI_PLANNING_OPENAI_HTTP_PROXY, SQAI_PLANNING_OPENAI_INIT_CONFIG_JSON, SQAI_PLANNING_OPENAI_SOCKS_PROXY, SQAI_PLANNING_OPENAI_USE_AZURE, SQAI_PLANNING_USE_ANTHROPIC_SDK, SQAI_PLANNING_USE_AZURE_OPENAI, SQAI_PLANNING_VL_MODE, SQAI_PREFERRED_LANGUAGE, SQAI_REPLANNING_CYCLE_LIMIT, SQAI_REPORT_TAG_NAME, SQAI_RUN_DIR, SQAI_USE_ANTHROPIC_SDK, SQAI_USE_AZURE_OPENAI, SQAI_USE_DOUBAO_VISION, SQAI_USE_GEMINI, SQAI_USE_QWEN3_VL, SQAI_USE_QWEN_VL, SQAI_USE_VLM_UI_TARS, SQAI_USE_VL_MODEL, SQAI_VL_MODE, SQAI_VQA_ANTHROPIC_API_KEY, SQAI_VQA_AZURE_OPENAI_API_VERSION, SQAI_VQA_AZURE_OPENAI_DEPLOYMENT, SQAI_VQA_AZURE_OPENAI_ENDPOINT, SQAI_VQA_AZURE_OPENAI_INIT_CONFIG_JSON, SQAI_VQA_AZURE_OPENAI_KEY, SQAI_VQA_AZURE_OPENAI_SCOPE, SQAI_VQA_MODEL_NAME, SQAI_VQA_OPENAI_API_KEY, SQAI_VQA_OPENAI_BASE_URL, SQAI_VQA_OPENAI_HTTP_PROXY, SQAI_VQA_OPENAI_INIT_CONFIG_JSON, SQAI_VQA_OPENAI_SOCKS_PROXY, SQAI_VQA_OPENAI_USE_AZURE, SQAI_VQA_USE_ANTHROPIC_SDK, SQAI_VQA_USE_AZURE_OPENAI, SQAI_VQA_VL_MODE, STRING_ENV_KEYS, types_UITarsModelVersion as UITarsModelVersion, UNUSED_ENV_KEYS, VL_MODE_RAW_VALID_VALUES };
@@ -0,0 +1,18 @@
1
+ import { GlobalConfigManager } from "./global-config-manager.mjs";
2
+ import { ModelConfigManager } from "./model-config-manager.mjs";
3
+ import { SQAI_PREFERRED_LANGUAGE } from "./types.mjs";
4
+ const globalModelConfigManager = new ModelConfigManager();
5
+ const globalConfigManager = new GlobalConfigManager();
6
+ globalConfigManager.registerModelConfigManager(globalModelConfigManager);
7
+ globalModelConfigManager.registerGlobalConfigManager(globalConfigManager);
8
+ const getPreferredLanguage = ()=>{
9
+ const prefer = globalConfigManager.getEnvConfigValue(SQAI_PREFERRED_LANGUAGE);
10
+ if (prefer) return prefer;
11
+ const timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;
12
+ const isChina = 'Asia/Shanghai' === timeZone;
13
+ return isChina ? 'Chinese' : 'English';
14
+ };
15
+ const overrideAIConfig = (newConfig, extendMode = false)=>{
16
+ globalConfigManager.overrideAIConfig(newConfig, extendMode);
17
+ };
18
+ export { getPreferredLanguage, globalConfigManager, globalModelConfigManager, overrideAIConfig };
@@ -0,0 +1,2 @@
1
+ import { NodeType, TEXT_MAX_SIZE, TEXT_SIZE_THRESHOLD } from "../constants/index.mjs";
2
+ export { NodeType, TEXT_MAX_SIZE, TEXT_SIZE_THRESHOLD };
@@ -0,0 +1,6 @@
1
+ import { webExtractTextWithPosition } from "./index.mjs";
2
+ import { setExtractTextWithPositionOnWindow, setMidsceneVisibleRectOnWindow } from "./util.mjs";
3
+ console.log(webExtractTextWithPosition(document.body, true));
4
+ console.log(JSON.stringify(webExtractTextWithPosition(document.body, true)));
5
+ setExtractTextWithPositionOnWindow();
6
+ setMidsceneVisibleRectOnWindow();
@@ -0,0 +1,92 @@
1
+ import { NodeType } from "../constants/index.mjs";
2
+ import { generateHashId } from "../utils.mjs";
3
+ function isFormElement(node) {
4
+ return node instanceof HTMLElement && ('input' === node.tagName.toLowerCase() || 'textarea' === node.tagName.toLowerCase() || 'select' === node.tagName.toLowerCase() || 'option' === node.tagName.toLowerCase());
5
+ }
6
+ function isButtonElement(node) {
7
+ return node instanceof HTMLElement && 'button' === node.tagName.toLowerCase();
8
+ }
9
+ function isAElement(node) {
10
+ return node instanceof HTMLElement && 'a' === node.tagName.toLowerCase();
11
+ }
12
+ function isSvgElement(node) {
13
+ return node instanceof SVGElement;
14
+ }
15
+ function isImgElement(node) {
16
+ if (!includeBaseElement(node) && node instanceof Element) {
17
+ const computedStyle = window.getComputedStyle(node);
18
+ const backgroundImage = computedStyle.getPropertyValue('background-image');
19
+ if ('none' !== backgroundImage) return true;
20
+ }
21
+ if (isIconfont(node)) return true;
22
+ return node instanceof HTMLElement && 'img' === node.tagName.toLowerCase() || node instanceof SVGElement && 'svg' === node.tagName.toLowerCase();
23
+ }
24
+ function isIconfont(node) {
25
+ if (node instanceof Element) {
26
+ const computedStyle = window.getComputedStyle(node);
27
+ const fontFamilyValue = computedStyle.fontFamily || '';
28
+ return fontFamilyValue.toLowerCase().indexOf('iconfont') >= 0;
29
+ }
30
+ return false;
31
+ }
32
+ function isNotContainerElement(node) {
33
+ return isTextElement(node) || isIconfont(node) || isImgElement(node) || isButtonElement(node) || isAElement(node) || isFormElement(node);
34
+ }
35
+ function isTextElement(node) {
36
+ var _node_nodeName_toLowerCase, _node_nodeName;
37
+ if (node instanceof Element) {
38
+ var _node_childNodes;
39
+ if ((null == node ? void 0 : null == (_node_childNodes = node.childNodes) ? void 0 : _node_childNodes.length) === 1 && (null == node ? void 0 : node.childNodes[0]) instanceof Text) return true;
40
+ }
41
+ return (null == (_node_nodeName = node.nodeName) ? void 0 : null == (_node_nodeName_toLowerCase = _node_nodeName.toLowerCase) ? void 0 : _node_nodeName_toLowerCase.call(_node_nodeName)) === '#text' && !isIconfont(node);
42
+ }
43
+ function isContainerElement(node) {
44
+ if (!(node instanceof HTMLElement)) return false;
45
+ if (includeBaseElement(node)) return false;
46
+ const computedStyle = window.getComputedStyle(node);
47
+ const backgroundColor = computedStyle.getPropertyValue('background-color');
48
+ if (backgroundColor) return true;
49
+ return false;
50
+ }
51
+ function includeBaseElement(node) {
52
+ if (!(node instanceof HTMLElement)) return false;
53
+ if (node.innerText) return true;
54
+ const includeList = [
55
+ 'svg',
56
+ 'button',
57
+ 'input',
58
+ 'textarea',
59
+ 'select',
60
+ 'option',
61
+ 'img',
62
+ 'a'
63
+ ];
64
+ for (const tagName of includeList){
65
+ const element = node.querySelectorAll(tagName);
66
+ if (element.length > 0) return true;
67
+ }
68
+ return false;
69
+ }
70
+ function generateElementByPosition(position) {
71
+ const rect = {
72
+ left: Math.max(position.x - 4, 0),
73
+ top: Math.max(position.y - 4, 0),
74
+ width: 8,
75
+ height: 8
76
+ };
77
+ const id = generateHashId(rect);
78
+ const element = {
79
+ id,
80
+ attributes: {
81
+ nodeType: NodeType.POSITION
82
+ },
83
+ rect,
84
+ content: '',
85
+ center: [
86
+ position.x,
87
+ position.y
88
+ ]
89
+ };
90
+ return element;
91
+ }
92
+ export { generateElementByPosition, isAElement, isButtonElement, isContainerElement, isFormElement, isImgElement, isNotContainerElement, isSvgElement, isTextElement };
@@ -0,0 +1,6 @@
1
+ import { descriptionOfTree, traverseTree, treeToList, trimAttributes, truncateText } from "./tree.mjs";
2
+ import { extractTextWithPosition, extractTreeNode, extractTreeNodeAsString } from "./web-extractor.mjs";
3
+ import { getNodeFromCacheList, setNodeHashCacheListOnWindow } from "./util.mjs";
4
+ import { getElementInfoByXpath, getElementXpath, getNodeInfoByXpath, getXpathsById, getXpathsByPoint } from "./locator.mjs";
5
+ import { generateElementByPosition, isNotContainerElement } from "./dom-util.mjs";
6
+ export { descriptionOfTree, generateElementByPosition, getElementInfoByXpath, getElementXpath, getNodeFromCacheList, getNodeInfoByXpath, getXpathsById, getXpathsByPoint, isNotContainerElement, setNodeHashCacheListOnWindow, traverseTree, treeToList, trimAttributes, truncateText, extractTreeNode as webExtractNodeTree, extractTreeNodeAsString as webExtractNodeTreeAsString, extractTextWithPosition as webExtractTextWithPosition };
@@ -0,0 +1,95 @@
1
+ import { isSvgElement } from "./dom-util.mjs";
2
+ import { getNodeFromCacheList, getRect, isElementPartiallyInViewport } from "./util.mjs";
3
+ import { collectElementInfo } from "./web-extractor.mjs";
4
+ const getElementXpathIndex = (element)=>{
5
+ let index = 1;
6
+ let prev = element.previousElementSibling;
7
+ while(prev){
8
+ if (prev.nodeName.toLowerCase() === element.nodeName.toLowerCase()) index++;
9
+ prev = prev.previousElementSibling;
10
+ }
11
+ return index;
12
+ };
13
+ const normalizeXpathText = (text)=>{
14
+ if ('string' != typeof text) return '';
15
+ return text.replace(/\s+/g, ' ').trim();
16
+ };
17
+ const buildCurrentElementXpath = (element, isOrderSensitive, isLeafElement)=>{
18
+ var _element_textContent;
19
+ const parentPath = element.parentNode ? getElementXpath(element.parentNode, isOrderSensitive) : '';
20
+ const prefix = parentPath ? `${parentPath}/` : '/';
21
+ const tagName = element.nodeName.toLowerCase();
22
+ const textContent = null == (_element_textContent = element.textContent) ? void 0 : _element_textContent.trim();
23
+ if (isOrderSensitive) {
24
+ const index = getElementXpathIndex(element);
25
+ return `${prefix}${tagName}[${index}]`;
26
+ }
27
+ if (isLeafElement && textContent) return `${prefix}${tagName}[normalize-space()="${normalizeXpathText(textContent)}"]`;
28
+ const index = getElementXpathIndex(element);
29
+ return `${prefix}${tagName}[${index}]`;
30
+ };
31
+ const getElementXpath = (element, isOrderSensitive = false, isLeafElement = false)=>{
32
+ if (element.nodeType === Node.TEXT_NODE) {
33
+ const parentNode = element.parentNode;
34
+ if (parentNode && parentNode.nodeType === Node.ELEMENT_NODE) {
35
+ var _element_textContent;
36
+ const parentXPath = getElementXpath(parentNode, isOrderSensitive, true);
37
+ const textContent = null == (_element_textContent = element.textContent) ? void 0 : _element_textContent.trim();
38
+ if (textContent) return `${parentXPath}/text()[normalize-space()="${normalizeXpathText(textContent)}"]`;
39
+ return `${parentXPath}/text()`;
40
+ }
41
+ return '';
42
+ }
43
+ if (element.nodeType !== Node.ELEMENT_NODE) return '';
44
+ const el = element;
45
+ if (el === document.documentElement) return '/html';
46
+ if (el === document.body) return '/html/body';
47
+ if (isSvgElement(el)) {
48
+ let parent = el.parentNode;
49
+ while(parent && parent.nodeType === Node.ELEMENT_NODE){
50
+ if (!isSvgElement(parent)) return getElementXpath(parent, isOrderSensitive, isLeafElement);
51
+ parent = parent.parentNode;
52
+ }
53
+ return getElementXpath(el.parentNode, isOrderSensitive, isLeafElement);
54
+ }
55
+ return buildCurrentElementXpath(el, isOrderSensitive, isLeafElement);
56
+ };
57
+ function getXpathsById(id) {
58
+ const node = getNodeFromCacheList(id);
59
+ if (!node) return null;
60
+ const fullXPath = getElementXpath(node, false, true);
61
+ return [
62
+ fullXPath
63
+ ];
64
+ }
65
+ function getXpathsByPoint(point, isOrderSensitive) {
66
+ const element = document.elementFromPoint(point.left, point.top);
67
+ if (!element) return null;
68
+ const fullXPath = getElementXpath(element, isOrderSensitive, true);
69
+ return [
70
+ fullXPath
71
+ ];
72
+ }
73
+ function getNodeInfoByXpath(xpath) {
74
+ const xpathResult = document.evaluate(xpath, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
75
+ if (1 !== xpathResult.snapshotLength) return null;
76
+ const node = xpathResult.snapshotItem(0);
77
+ return node;
78
+ }
79
+ function getElementInfoByXpath(xpath) {
80
+ const node = getNodeInfoByXpath(xpath);
81
+ if (!node) return null;
82
+ if (node instanceof HTMLElement) {
83
+ const rect = getRect(node, 1, window);
84
+ const isVisible = isElementPartiallyInViewport(rect, window, document, 1);
85
+ if (!isVisible) node.scrollIntoView({
86
+ behavior: 'instant',
87
+ block: 'center'
88
+ });
89
+ }
90
+ return collectElementInfo(node, window, document, 1, {
91
+ left: 0,
92
+ top: 0
93
+ }, true);
94
+ }
95
+ export { getElementInfoByXpath, getElementXpath, getNodeInfoByXpath, getXpathsById, getXpathsByPoint };
@@ -0,0 +1,81 @@
1
+ function truncateText(text, maxLength = 150) {
2
+ if (void 0 === text) return '';
3
+ if ('object' == typeof text) text = JSON.stringify(text);
4
+ if ('number' == typeof text) return text.toString();
5
+ if ('string' == typeof text && text.length > maxLength) return `${text.slice(0, maxLength)}...`;
6
+ if ('string' == typeof text) return text.trim();
7
+ return '';
8
+ }
9
+ function trimAttributes(attributes, truncateTextLength) {
10
+ const tailorAttributes = Object.keys(attributes).reduce((res, currentKey)=>{
11
+ const attributeVal = attributes[currentKey];
12
+ if ('style' === currentKey || 'htmlTagName' === currentKey || 'nodeType' === currentKey) return res;
13
+ res[currentKey] = truncateText(attributeVal, truncateTextLength);
14
+ return res;
15
+ }, {});
16
+ return tailorAttributes;
17
+ }
18
+ const nodeSizeThreshold = 4;
19
+ function descriptionOfTree(tree, truncateTextLength, filterNonTextContent = false, visibleOnly = true) {
20
+ const attributesString = (kv)=>Object.entries(kv).map(([key, value])=>`${key}="${truncateText(value, truncateTextLength)}"`).join(' ');
21
+ function buildContentTree(node, indent = 0, visibleOnly = true) {
22
+ let before = '';
23
+ let contentWithIndent = '';
24
+ let after = '';
25
+ let emptyNode = true;
26
+ const indentStr = ' '.repeat(indent);
27
+ let children = '';
28
+ for(let i = 0; i < (node.children || []).length; i++){
29
+ const childContent = buildContentTree(node.children[i], indent + 1, visibleOnly);
30
+ if (childContent) children += `\n${childContent}`;
31
+ }
32
+ if (node.node && node.node.rect.width > nodeSizeThreshold && node.node.rect.height > nodeSizeThreshold && (!filterNonTextContent || filterNonTextContent && node.node.content) && (!visibleOnly || visibleOnly && node.node.isVisible)) {
33
+ var _node_node_attributes;
34
+ emptyNode = false;
35
+ let nodeTypeString;
36
+ nodeTypeString = (null == (_node_node_attributes = node.node.attributes) ? void 0 : _node_node_attributes.htmlTagName) ? node.node.attributes.htmlTagName.replace(/[<>]/g, '') : node.node.attributes.nodeType.replace(/\sNode$/, '').toLowerCase();
37
+ const markerId = node.node.indexId;
38
+ const markerIdString = markerId ? `markerId="${markerId}"` : '';
39
+ const rectAttribute = node.node.rect ? {
40
+ left: node.node.rect.left,
41
+ top: node.node.rect.top,
42
+ width: node.node.rect.width,
43
+ height: node.node.rect.height
44
+ } : {};
45
+ before = `<${nodeTypeString} id="${node.node.id}" ${markerIdString} ${attributesString(trimAttributes(node.node.attributes || {}, truncateTextLength))} ${attributesString(rectAttribute)}>`;
46
+ const content = truncateText(node.node.content, truncateTextLength);
47
+ contentWithIndent = content ? `\n${indentStr} ${content}` : '';
48
+ after = `</${nodeTypeString}>`;
49
+ } else if (!filterNonTextContent) {
50
+ if (!children.trim().startsWith('<>')) {
51
+ before = '<>';
52
+ contentWithIndent = '';
53
+ after = '</>';
54
+ }
55
+ }
56
+ if (emptyNode && !children.trim()) return '';
57
+ const result = `${indentStr}${before}${contentWithIndent}${children}\n${indentStr}${after}`;
58
+ if (result.trim()) return result;
59
+ return '';
60
+ }
61
+ const result = buildContentTree(tree, 0, visibleOnly);
62
+ return result.replace(/^\s*\n/gm, '');
63
+ }
64
+ function treeToList(tree) {
65
+ const result = [];
66
+ function dfs(node) {
67
+ if (node.node) result.push(node.node);
68
+ for (const child of node.children)dfs(child);
69
+ }
70
+ dfs(tree);
71
+ return result;
72
+ }
73
+ function traverseTree(tree, onNode) {
74
+ function dfs(node) {
75
+ if (node.node) node.node = onNode(node.node);
76
+ for (const child of node.children)dfs(child);
77
+ }
78
+ dfs(tree);
79
+ return tree;
80
+ }
81
+ export { descriptionOfTree, traverseTree, treeToList, trimAttributes, truncateText };