@sqaitech/core 0.5.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 (200) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +9 -0
  3. package/dist/es/agent/agent.mjs +635 -0
  4. package/dist/es/agent/agent.mjs.map +1 -0
  5. package/dist/es/agent/common.mjs +0 -0
  6. package/dist/es/agent/index.mjs +6 -0
  7. package/dist/es/agent/task-cache.mjs +184 -0
  8. package/dist/es/agent/task-cache.mjs.map +1 -0
  9. package/dist/es/agent/tasks.mjs +663 -0
  10. package/dist/es/agent/tasks.mjs.map +1 -0
  11. package/dist/es/agent/ui-utils.mjs +72 -0
  12. package/dist/es/agent/ui-utils.mjs.map +1 -0
  13. package/dist/es/agent/utils.mjs +162 -0
  14. package/dist/es/agent/utils.mjs.map +1 -0
  15. package/dist/es/ai-model/action-executor.mjs +129 -0
  16. package/dist/es/ai-model/action-executor.mjs.map +1 -0
  17. package/dist/es/ai-model/common.mjs +355 -0
  18. package/dist/es/ai-model/common.mjs.map +1 -0
  19. package/dist/es/ai-model/conversation-history.mjs +58 -0
  20. package/dist/es/ai-model/conversation-history.mjs.map +1 -0
  21. package/dist/es/ai-model/index.mjs +11 -0
  22. package/dist/es/ai-model/inspect.mjs +286 -0
  23. package/dist/es/ai-model/inspect.mjs.map +1 -0
  24. package/dist/es/ai-model/llm-planning.mjs +140 -0
  25. package/dist/es/ai-model/llm-planning.mjs.map +1 -0
  26. package/dist/es/ai-model/prompt/assertion.mjs +31 -0
  27. package/dist/es/ai-model/prompt/assertion.mjs.map +1 -0
  28. package/dist/es/ai-model/prompt/common.mjs +7 -0
  29. package/dist/es/ai-model/prompt/common.mjs.map +1 -0
  30. package/dist/es/ai-model/prompt/describe.mjs +44 -0
  31. package/dist/es/ai-model/prompt/describe.mjs.map +1 -0
  32. package/dist/es/ai-model/prompt/extraction.mjs +129 -0
  33. package/dist/es/ai-model/prompt/extraction.mjs.map +1 -0
  34. package/dist/es/ai-model/prompt/llm-locator.mjs +268 -0
  35. package/dist/es/ai-model/prompt/llm-locator.mjs.map +1 -0
  36. package/dist/es/ai-model/prompt/llm-planning.mjs +367 -0
  37. package/dist/es/ai-model/prompt/llm-planning.mjs.map +1 -0
  38. package/dist/es/ai-model/prompt/llm-section-locator.mjs +41 -0
  39. package/dist/es/ai-model/prompt/llm-section-locator.mjs.map +1 -0
  40. package/dist/es/ai-model/prompt/playwright-generator.mjs +117 -0
  41. package/dist/es/ai-model/prompt/playwright-generator.mjs.map +1 -0
  42. package/dist/es/ai-model/prompt/ui-tars-locator.mjs +34 -0
  43. package/dist/es/ai-model/prompt/ui-tars-locator.mjs.map +1 -0
  44. package/dist/es/ai-model/prompt/ui-tars-planning.mjs +36 -0
  45. package/dist/es/ai-model/prompt/ui-tars-planning.mjs.map +1 -0
  46. package/dist/es/ai-model/prompt/util.mjs +124 -0
  47. package/dist/es/ai-model/prompt/util.mjs.map +1 -0
  48. package/dist/es/ai-model/prompt/yaml-generator.mjs +219 -0
  49. package/dist/es/ai-model/prompt/yaml-generator.mjs.map +1 -0
  50. package/dist/es/ai-model/service-caller/index.mjs +388 -0
  51. package/dist/es/ai-model/service-caller/index.mjs.map +1 -0
  52. package/dist/es/ai-model/ui-tars-planning.mjs +201 -0
  53. package/dist/es/ai-model/ui-tars-planning.mjs.map +1 -0
  54. package/dist/es/device/index.mjs +152 -0
  55. package/dist/es/device/index.mjs.map +1 -0
  56. package/dist/es/image/index.mjs +2 -0
  57. package/dist/es/index.mjs +11 -0
  58. package/dist/es/index.mjs.map +1 -0
  59. package/dist/es/insight/index.mjs +231 -0
  60. package/dist/es/insight/index.mjs.map +1 -0
  61. package/dist/es/insight/utils.mjs +15 -0
  62. package/dist/es/insight/utils.mjs.map +1 -0
  63. package/dist/es/report.mjs +88 -0
  64. package/dist/es/report.mjs.map +1 -0
  65. package/dist/es/tree.mjs +2 -0
  66. package/dist/es/types.mjs +11 -0
  67. package/dist/es/types.mjs.map +1 -0
  68. package/dist/es/utils.mjs +202 -0
  69. package/dist/es/utils.mjs.map +1 -0
  70. package/dist/es/yaml/builder.mjs +13 -0
  71. package/dist/es/yaml/builder.mjs.map +1 -0
  72. package/dist/es/yaml/index.mjs +3 -0
  73. package/dist/es/yaml/player.mjs +372 -0
  74. package/dist/es/yaml/player.mjs.map +1 -0
  75. package/dist/es/yaml/utils.mjs +73 -0
  76. package/dist/es/yaml/utils.mjs.map +1 -0
  77. package/dist/es/yaml.mjs +0 -0
  78. package/dist/lib/agent/agent.js +682 -0
  79. package/dist/lib/agent/agent.js.map +1 -0
  80. package/dist/lib/agent/common.js +5 -0
  81. package/dist/lib/agent/index.js +81 -0
  82. package/dist/lib/agent/index.js.map +1 -0
  83. package/dist/lib/agent/task-cache.js +236 -0
  84. package/dist/lib/agent/task-cache.js.map +1 -0
  85. package/dist/lib/agent/tasks.js +700 -0
  86. package/dist/lib/agent/tasks.js.map +1 -0
  87. package/dist/lib/agent/ui-utils.js +121 -0
  88. package/dist/lib/agent/ui-utils.js.map +1 -0
  89. package/dist/lib/agent/utils.js +233 -0
  90. package/dist/lib/agent/utils.js.map +1 -0
  91. package/dist/lib/ai-model/action-executor.js +163 -0
  92. package/dist/lib/ai-model/action-executor.js.map +1 -0
  93. package/dist/lib/ai-model/common.js +461 -0
  94. package/dist/lib/ai-model/common.js.map +1 -0
  95. package/dist/lib/ai-model/conversation-history.js +92 -0
  96. package/dist/lib/ai-model/conversation-history.js.map +1 -0
  97. package/dist/lib/ai-model/index.js +131 -0
  98. package/dist/lib/ai-model/index.js.map +1 -0
  99. package/dist/lib/ai-model/inspect.js +326 -0
  100. package/dist/lib/ai-model/inspect.js.map +1 -0
  101. package/dist/lib/ai-model/llm-planning.js +174 -0
  102. package/dist/lib/ai-model/llm-planning.js.map +1 -0
  103. package/dist/lib/ai-model/prompt/assertion.js +65 -0
  104. package/dist/lib/ai-model/prompt/assertion.js.map +1 -0
  105. package/dist/lib/ai-model/prompt/common.js +41 -0
  106. package/dist/lib/ai-model/prompt/common.js.map +1 -0
  107. package/dist/lib/ai-model/prompt/describe.js +78 -0
  108. package/dist/lib/ai-model/prompt/describe.js.map +1 -0
  109. package/dist/lib/ai-model/prompt/extraction.js +169 -0
  110. package/dist/lib/ai-model/prompt/extraction.js.map +1 -0
  111. package/dist/lib/ai-model/prompt/llm-locator.js +308 -0
  112. package/dist/lib/ai-model/prompt/llm-locator.js.map +1 -0
  113. package/dist/lib/ai-model/prompt/llm-planning.js +407 -0
  114. package/dist/lib/ai-model/prompt/llm-planning.js.map +1 -0
  115. package/dist/lib/ai-model/prompt/llm-section-locator.js +78 -0
  116. package/dist/lib/ai-model/prompt/llm-section-locator.js.map +1 -0
  117. package/dist/lib/ai-model/prompt/playwright-generator.js +178 -0
  118. package/dist/lib/ai-model/prompt/playwright-generator.js.map +1 -0
  119. package/dist/lib/ai-model/prompt/ui-tars-locator.js +68 -0
  120. package/dist/lib/ai-model/prompt/ui-tars-locator.js.map +1 -0
  121. package/dist/lib/ai-model/prompt/ui-tars-planning.js +73 -0
  122. package/dist/lib/ai-model/prompt/ui-tars-planning.js.map +1 -0
  123. package/dist/lib/ai-model/prompt/util.js +176 -0
  124. package/dist/lib/ai-model/prompt/util.js.map +1 -0
  125. package/dist/lib/ai-model/prompt/yaml-generator.js +280 -0
  126. package/dist/lib/ai-model/prompt/yaml-generator.js.map +1 -0
  127. package/dist/lib/ai-model/service-caller/index.js +468 -0
  128. package/dist/lib/ai-model/service-caller/index.js.map +1 -0
  129. package/dist/lib/ai-model/ui-tars-planning.js +238 -0
  130. package/dist/lib/ai-model/ui-tars-planning.js.map +1 -0
  131. package/dist/lib/device/index.js +255 -0
  132. package/dist/lib/device/index.js.map +1 -0
  133. package/dist/lib/image/index.js +56 -0
  134. package/dist/lib/image/index.js.map +1 -0
  135. package/dist/lib/index.js +103 -0
  136. package/dist/lib/index.js.map +1 -0
  137. package/dist/lib/insight/index.js +265 -0
  138. package/dist/lib/insight/index.js.map +1 -0
  139. package/dist/lib/insight/utils.js +49 -0
  140. package/dist/lib/insight/utils.js.map +1 -0
  141. package/dist/lib/report.js +122 -0
  142. package/dist/lib/report.js.map +1 -0
  143. package/dist/lib/tree.js +44 -0
  144. package/dist/lib/tree.js.map +1 -0
  145. package/dist/lib/types.js +82 -0
  146. package/dist/lib/types.js.map +1 -0
  147. package/dist/lib/utils.js +281 -0
  148. package/dist/lib/utils.js.map +1 -0
  149. package/dist/lib/yaml/builder.js +57 -0
  150. package/dist/lib/yaml/builder.js.map +1 -0
  151. package/dist/lib/yaml/index.js +80 -0
  152. package/dist/lib/yaml/index.js.map +1 -0
  153. package/dist/lib/yaml/player.js +406 -0
  154. package/dist/lib/yaml/player.js.map +1 -0
  155. package/dist/lib/yaml/utils.js +126 -0
  156. package/dist/lib/yaml/utils.js.map +1 -0
  157. package/dist/lib/yaml.js +20 -0
  158. package/dist/lib/yaml.js.map +1 -0
  159. package/dist/types/agent/agent.d.ts +156 -0
  160. package/dist/types/agent/common.d.ts +0 -0
  161. package/dist/types/agent/index.d.ts +9 -0
  162. package/dist/types/agent/task-cache.d.ts +48 -0
  163. package/dist/types/agent/tasks.d.ts +48 -0
  164. package/dist/types/agent/ui-utils.d.ts +7 -0
  165. package/dist/types/agent/utils.d.ts +52 -0
  166. package/dist/types/ai-model/action-executor.d.ts +19 -0
  167. package/dist/types/ai-model/common.d.ts +569 -0
  168. package/dist/types/ai-model/conversation-history.d.ts +18 -0
  169. package/dist/types/ai-model/index.d.ts +13 -0
  170. package/dist/types/ai-model/inspect.d.ts +46 -0
  171. package/dist/types/ai-model/llm-planning.d.ts +11 -0
  172. package/dist/types/ai-model/prompt/assertion.d.ts +2 -0
  173. package/dist/types/ai-model/prompt/common.d.ts +2 -0
  174. package/dist/types/ai-model/prompt/describe.d.ts +1 -0
  175. package/dist/types/ai-model/prompt/extraction.d.ts +4 -0
  176. package/dist/types/ai-model/prompt/llm-locator.d.ts +8 -0
  177. package/dist/types/ai-model/prompt/llm-planning.d.ts +9 -0
  178. package/dist/types/ai-model/prompt/llm-section-locator.d.ts +5 -0
  179. package/dist/types/ai-model/prompt/playwright-generator.d.ts +26 -0
  180. package/dist/types/ai-model/prompt/ui-tars-locator.d.ts +1 -0
  181. package/dist/types/ai-model/prompt/ui-tars-planning.d.ts +2 -0
  182. package/dist/types/ai-model/prompt/util.d.ts +47 -0
  183. package/dist/types/ai-model/prompt/yaml-generator.d.ts +100 -0
  184. package/dist/types/ai-model/service-caller/index.d.ts +26 -0
  185. package/dist/types/ai-model/ui-tars-planning.d.ts +59 -0
  186. package/dist/types/device/index.d.ts +2158 -0
  187. package/dist/types/image/index.d.ts +1 -0
  188. package/dist/types/index.d.ts +12 -0
  189. package/dist/types/insight/index.d.ts +31 -0
  190. package/dist/types/insight/utils.d.ts +2 -0
  191. package/dist/types/report.d.ts +12 -0
  192. package/dist/types/tree.d.ts +1 -0
  193. package/dist/types/types.d.ts +412 -0
  194. package/dist/types/utils.d.ts +40 -0
  195. package/dist/types/yaml/builder.d.ts +2 -0
  196. package/dist/types/yaml/index.d.ts +3 -0
  197. package/dist/types/yaml/player.d.ts +34 -0
  198. package/dist/types/yaml/utils.d.ts +9 -0
  199. package/dist/types/yaml.d.ts +178 -0
  200. package/package.json +124 -0
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.n = (module)=>{
5
+ var getter = module && module.__esModule ? ()=>module['default'] : ()=>module;
6
+ __webpack_require__.d(getter, {
7
+ a: getter
8
+ });
9
+ return getter;
10
+ };
11
+ })();
12
+ (()=>{
13
+ __webpack_require__.d = (exports1, definition)=>{
14
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
15
+ enumerable: true,
16
+ get: definition[key]
17
+ });
18
+ };
19
+ })();
20
+ (()=>{
21
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
22
+ })();
23
+ (()=>{
24
+ __webpack_require__.r = (exports1)=>{
25
+ if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
26
+ value: 'Module'
27
+ });
28
+ Object.defineProperty(exports1, '__esModule', {
29
+ value: true
30
+ });
31
+ };
32
+ })();
33
+ var __webpack_exports__ = {};
34
+ __webpack_require__.r(__webpack_exports__);
35
+ __webpack_require__.d(__webpack_exports__, {
36
+ getVersion: ()=>external_utils_js_namespaceObject.getVersion,
37
+ SizeSchema: ()=>external_ai_model_index_js_namespaceObject.SizeSchema,
38
+ plan: ()=>external_ai_model_index_js_namespaceObject.plan,
39
+ TMultimodalPromptSchema: ()=>external_ai_model_index_js_namespaceObject.TMultimodalPromptSchema,
40
+ TUserPromptSchema: ()=>external_ai_model_index_js_namespaceObject.TUserPromptSchema,
41
+ SQAI_MODEL_NAME: ()=>env_namespaceObject.SQAI_MODEL_NAME,
42
+ z: ()=>external_zod_namespaceObject.z,
43
+ createAgent: ()=>external_agent_index_js_namespaceObject.createAgent,
44
+ RectSchema: ()=>external_ai_model_index_js_namespaceObject.RectSchema,
45
+ PointSchema: ()=>external_ai_model_index_js_namespaceObject.PointSchema,
46
+ default: ()=>src,
47
+ AiLocateElement: ()=>external_ai_model_index_js_namespaceObject.AiLocateElement,
48
+ Insight: ()=>index_js_default(),
49
+ describeUserPage: ()=>external_ai_model_index_js_namespaceObject.describeUserPage,
50
+ Executor: ()=>action_executor_js_namespaceObject.Executor,
51
+ getMidsceneLocationSchema: ()=>external_ai_model_index_js_namespaceObject.getMidsceneLocationSchema,
52
+ Agent: ()=>external_agent_index_js_namespaceObject.Agent
53
+ });
54
+ const external_zod_namespaceObject = require("zod");
55
+ const action_executor_js_namespaceObject = require("./ai-model/action-executor.js");
56
+ const index_js_namespaceObject = require("./insight/index.js");
57
+ var index_js_default = /*#__PURE__*/ __webpack_require__.n(index_js_namespaceObject);
58
+ const external_utils_js_namespaceObject = require("./utils.js");
59
+ const external_ai_model_index_js_namespaceObject = require("./ai-model/index.js");
60
+ const env_namespaceObject = require("@sqaitech/shared/env");
61
+ const external_agent_index_js_namespaceObject = require("./agent/index.js");
62
+ const src = index_js_default();
63
+ exports.Agent = __webpack_exports__.Agent;
64
+ exports.AiLocateElement = __webpack_exports__.AiLocateElement;
65
+ exports.Executor = __webpack_exports__.Executor;
66
+ exports.Insight = __webpack_exports__.Insight;
67
+ exports.PointSchema = __webpack_exports__.PointSchema;
68
+ exports.RectSchema = __webpack_exports__.RectSchema;
69
+ exports.SQAI_MODEL_NAME = __webpack_exports__.SQAI_MODEL_NAME;
70
+ exports.SizeSchema = __webpack_exports__.SizeSchema;
71
+ exports.TMultimodalPromptSchema = __webpack_exports__.TMultimodalPromptSchema;
72
+ exports.TUserPromptSchema = __webpack_exports__.TUserPromptSchema;
73
+ exports.createAgent = __webpack_exports__.createAgent;
74
+ exports["default"] = __webpack_exports__["default"];
75
+ exports.describeUserPage = __webpack_exports__.describeUserPage;
76
+ exports.getMidsceneLocationSchema = __webpack_exports__.getMidsceneLocationSchema;
77
+ exports.getVersion = __webpack_exports__.getVersion;
78
+ exports.plan = __webpack_exports__.plan;
79
+ exports.z = __webpack_exports__.z;
80
+ for(var __webpack_i__ in __webpack_exports__)if (-1 === [
81
+ "Agent",
82
+ "AiLocateElement",
83
+ "Executor",
84
+ "Insight",
85
+ "PointSchema",
86
+ "RectSchema",
87
+ "SQAI_MODEL_NAME",
88
+ "SizeSchema",
89
+ "TMultimodalPromptSchema",
90
+ "TUserPromptSchema",
91
+ "createAgent",
92
+ "default",
93
+ "describeUserPage",
94
+ "getMidsceneLocationSchema",
95
+ "getVersion",
96
+ "plan",
97
+ "z"
98
+ ].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
99
+ Object.defineProperty(exports, '__esModule', {
100
+ value: true
101
+ });
102
+
103
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["webpack://@sqaitech/core/webpack/runtime/compat_get_default_export","webpack://@sqaitech/core/webpack/runtime/define_property_getters","webpack://@sqaitech/core/webpack/runtime/has_own_property","webpack://@sqaitech/core/webpack/runtime/make_namespace_object","webpack://@sqaitech/core/./src/index.ts"],"sourcesContent":["// getDefaultExport function for compatibility with non-ESM modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};\n","__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import { z } from 'zod';\r\nimport { Executor } from './ai-model/action-executor';\r\nimport Insight from './insight/index';\r\nimport { getVersion } from './utils';\r\n\r\nexport {\r\n plan,\r\n describeUserPage,\r\n AiLocateElement,\r\n getMidsceneLocationSchema,\r\n type MidsceneLocationResultType,\r\n PointSchema,\r\n SizeSchema,\r\n RectSchema,\r\n TMultimodalPromptSchema,\r\n TUserPromptSchema,\r\n type TMultimodalPrompt,\r\n type TUserPrompt,\r\n} from './ai-model/index';\r\n\r\nexport { SQAI_MODEL_NAME } from '@sqaitech/shared/env';\r\n\r\nexport type * from './types';\r\n\r\nexport { z };\r\n\r\nexport default Insight;\r\nexport { Executor, Insight, getVersion };\r\n\r\nexport type {\r\n MidsceneYamlScript,\r\n MidsceneYamlTask,\r\n MidsceneYamlFlowItem,\r\n MidsceneYamlConfigResult,\r\n MidsceneYamlConfig,\r\n MidsceneYamlScriptWebEnv,\r\n MidsceneYamlScriptAndroidEnv,\r\n MidsceneYamlScriptIOSEnv,\r\n MidsceneYamlScriptEnv,\r\n LocateOption,\r\n DetailedLocateParam,\r\n} from './yaml';\r\n\r\nexport { Agent, type AgentOpt, createAgent } from './agent';\r\n"],"names":["__webpack_require__","module","getter","definition","key","Object","obj","prop","Symbol","Insight"],"mappings":";;;IACAA,oBAAoB,CAAC,GAAG,CAACC;QACxB,IAAIC,SAASD,UAAUA,OAAO,UAAU,GACvC,IAAOA,MAAM,CAAC,UAAU,GACxB,IAAOA;QACRD,oBAAoB,CAAC,CAACE,QAAQ;YAAE,GAAGA;QAAO;QAC1C,OAAOA;IACR;;;ICPAF,oBAAoB,CAAC,GAAG,CAAC,UAASG;QACjC,IAAI,IAAIC,OAAOD,WACR,IAAGH,oBAAoB,CAAC,CAACG,YAAYC,QAAQ,CAACJ,oBAAoB,CAAC,CAAC,UAASI,MACzEC,OAAO,cAAc,CAAC,UAASD,KAAK;YAAE,YAAY;YAAM,KAAKD,UAAU,CAACC,IAAI;QAAC;IAGzF;;;ICNAJ,oBAAoB,CAAC,GAAG,CAACM,KAAKC,OAAUF,OAAO,SAAS,CAAC,cAAc,CAAC,IAAI,CAACC,KAAKC;;;ICClFP,oBAAoB,CAAC,GAAG,CAAC;QACxB,IAAG,AAAkB,eAAlB,OAAOQ,UAA0BA,OAAO,WAAW,EACrDH,OAAO,cAAc,CAAC,UAASG,OAAO,WAAW,EAAE;YAAE,OAAO;QAAS;QAEtEH,OAAO,cAAc,CAAC,UAAS,cAAc;YAAE,OAAO;QAAK;IAC5D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACoBA,YAAeI"}
@@ -0,0 +1,265 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, definition)=>{
5
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
6
+ enumerable: true,
7
+ get: definition[key]
8
+ });
9
+ };
10
+ })();
11
+ (()=>{
12
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
13
+ })();
14
+ (()=>{
15
+ __webpack_require__.r = (exports1)=>{
16
+ if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
17
+ value: 'Module'
18
+ });
19
+ Object.defineProperty(exports1, '__esModule', {
20
+ value: true
21
+ });
22
+ };
23
+ })();
24
+ var __webpack_exports__ = {};
25
+ __webpack_require__.r(__webpack_exports__);
26
+ __webpack_require__.d(__webpack_exports__, {
27
+ default: ()=>Insight
28
+ });
29
+ const common_js_namespaceObject = require("../ai-model/common.js");
30
+ const index_js_namespaceObject = require("../ai-model/index.js");
31
+ const inspect_js_namespaceObject = require("../ai-model/inspect.js");
32
+ const describe_js_namespaceObject = require("../ai-model/prompt/describe.js");
33
+ const env_namespaceObject = require("@sqaitech/shared/env");
34
+ const img_namespaceObject = require("@sqaitech/shared/img");
35
+ const logger_namespaceObject = require("@sqaitech/shared/logger");
36
+ const utils_namespaceObject = require("@sqaitech/shared/utils");
37
+ const external_utils_js_namespaceObject = require("./utils.js");
38
+ function _define_property(obj, key, value) {
39
+ if (key in obj) Object.defineProperty(obj, key, {
40
+ value: value,
41
+ enumerable: true,
42
+ configurable: true,
43
+ writable: true
44
+ });
45
+ else obj[key] = value;
46
+ return obj;
47
+ }
48
+ const debug = (0, logger_namespaceObject.getDebug)('ai:insight');
49
+ class Insight {
50
+ async locate(query, opt, modelConfig) {
51
+ var _parseResult_errors;
52
+ const queryPrompt = 'string' == typeof query ? query : query.prompt;
53
+ (0, utils_namespaceObject.assert)(queryPrompt, 'query is required for locate');
54
+ const dumpSubscriber = this.onceDumpUpdatedFn;
55
+ this.onceDumpUpdatedFn = void 0;
56
+ (0, utils_namespaceObject.assert)('object' == typeof query, 'query should be an object for locate');
57
+ const globalDeepThinkSwitch = env_namespaceObject.globalConfigManager.getEnvConfigInBoolean(env_namespaceObject.SQAI_FORCE_DEEP_THINK);
58
+ if (globalDeepThinkSwitch) debug('globalDeepThinkSwitch', globalDeepThinkSwitch);
59
+ let searchAreaPrompt;
60
+ if (query.deepThink || globalDeepThinkSwitch) searchAreaPrompt = query.prompt;
61
+ const { vlMode } = modelConfig;
62
+ if (searchAreaPrompt && !vlMode) {
63
+ console.warn('The "deepThink" feature is not supported with multimodal LLM. Please config VL model for SQAI. https://sqai.tech/choose-a-model');
64
+ searchAreaPrompt = void 0;
65
+ }
66
+ const context = (null == opt ? void 0 : opt.context) || await this.contextRetrieverFn('locate');
67
+ let searchArea;
68
+ let searchAreaRawResponse;
69
+ let searchAreaUsage;
70
+ let searchAreaResponse;
71
+ if (searchAreaPrompt) {
72
+ searchAreaResponse = await (0, inspect_js_namespaceObject.AiLocateSection)({
73
+ context,
74
+ sectionDescription: searchAreaPrompt,
75
+ modelConfig
76
+ });
77
+ (0, utils_namespaceObject.assert)(searchAreaResponse.rect, `cannot find search area for "${searchAreaPrompt}"${searchAreaResponse.error ? `: ${searchAreaResponse.error}` : ''}`);
78
+ searchAreaRawResponse = searchAreaResponse.rawResponse;
79
+ searchAreaUsage = searchAreaResponse.usage;
80
+ searchArea = searchAreaResponse.rect;
81
+ }
82
+ const startTime = Date.now();
83
+ const { parseResult, rect, elementById, rawResponse, usage, isOrderSensitive } = await (0, index_js_namespaceObject.AiLocateElement)({
84
+ callAIFn: this.aiVendorFn,
85
+ context,
86
+ targetElementDescription: queryPrompt,
87
+ searchConfig: searchAreaResponse,
88
+ modelConfig
89
+ });
90
+ const timeCost = Date.now() - startTime;
91
+ const taskInfo = {
92
+ ...this.taskInfo ? this.taskInfo : {},
93
+ durationMs: timeCost,
94
+ rawResponse: JSON.stringify(rawResponse),
95
+ formatResponse: JSON.stringify(parseResult),
96
+ usage,
97
+ searchArea,
98
+ searchAreaRawResponse,
99
+ searchAreaUsage
100
+ };
101
+ let errorLog;
102
+ if (null == (_parseResult_errors = parseResult.errors) ? void 0 : _parseResult_errors.length) errorLog = `AI model failed to locate: \n${parseResult.errors.join('\n')}`;
103
+ const dumpData = {
104
+ type: 'locate',
105
+ userQuery: {
106
+ element: queryPrompt
107
+ },
108
+ matchedElement: [],
109
+ matchedRect: rect,
110
+ data: null,
111
+ taskInfo,
112
+ deepThink: !!searchArea,
113
+ error: errorLog
114
+ };
115
+ const elements = [];
116
+ (parseResult.elements || []).forEach((item)=>{
117
+ if ('id' in item) {
118
+ const element = elementById(null == item ? void 0 : item.id);
119
+ if (!element) return void console.warn(`locate: cannot find element id=${item.id}. Maybe an unstable response from AI model`);
120
+ elements.push(element);
121
+ }
122
+ });
123
+ (0, external_utils_js_namespaceObject.emitInsightDump)({
124
+ ...dumpData,
125
+ matchedElement: elements
126
+ }, dumpSubscriber);
127
+ if (errorLog) throw new Error(errorLog);
128
+ (0, utils_namespaceObject.assert)(elements.length <= 1, `locate: multiple elements found, length = ${elements.length}`);
129
+ if (1 === elements.length) return {
130
+ element: {
131
+ id: elements[0].id,
132
+ indexId: elements[0].indexId,
133
+ center: elements[0].center,
134
+ rect: elements[0].rect,
135
+ xpaths: elements[0].xpaths || [],
136
+ attributes: elements[0].attributes,
137
+ isOrderSensitive
138
+ },
139
+ rect
140
+ };
141
+ return {
142
+ element: null,
143
+ rect
144
+ };
145
+ }
146
+ async extract(dataDemand, modelConfig, opt, multimodalPrompt) {
147
+ var _parseResult_errors;
148
+ (0, utils_namespaceObject.assert)('object' == typeof dataDemand || 'string' == typeof dataDemand, `dataDemand should be object or string, but get ${typeof dataDemand}`);
149
+ const dumpSubscriber = this.onceDumpUpdatedFn;
150
+ this.onceDumpUpdatedFn = void 0;
151
+ const context = await this.contextRetrieverFn('extract');
152
+ const startTime = Date.now();
153
+ const { parseResult, usage } = await (0, index_js_namespaceObject.AiExtractElementInfo)({
154
+ context,
155
+ dataQuery: dataDemand,
156
+ multimodalPrompt,
157
+ extractOption: opt,
158
+ modelConfig
159
+ });
160
+ const timeCost = Date.now() - startTime;
161
+ const taskInfo = {
162
+ ...this.taskInfo ? this.taskInfo : {},
163
+ durationMs: timeCost,
164
+ rawResponse: JSON.stringify(parseResult)
165
+ };
166
+ let errorLog;
167
+ if (null == (_parseResult_errors = parseResult.errors) ? void 0 : _parseResult_errors.length) errorLog = `AI response error: \n${parseResult.errors.join('\n')}`;
168
+ const dumpData = {
169
+ type: 'extract',
170
+ userQuery: {
171
+ dataDemand
172
+ },
173
+ matchedElement: [],
174
+ data: null,
175
+ taskInfo,
176
+ error: errorLog
177
+ };
178
+ const { data, thought } = parseResult || {};
179
+ (0, external_utils_js_namespaceObject.emitInsightDump)({
180
+ ...dumpData,
181
+ data
182
+ }, dumpSubscriber);
183
+ if (errorLog && !data && !(null == opt ? void 0 : opt.doNotThrowError)) throw new Error(errorLog);
184
+ return {
185
+ data,
186
+ thought,
187
+ usage
188
+ };
189
+ }
190
+ async describe(target, modelConfig, opt) {
191
+ (0, utils_namespaceObject.assert)(target, 'target is required for insight.describe');
192
+ const context = await this.contextRetrieverFn('describe');
193
+ const { screenshotBase64, size } = context;
194
+ (0, utils_namespaceObject.assert)(screenshotBase64, 'screenshot is required for insight.describe');
195
+ const { vlMode } = modelConfig;
196
+ const systemPrompt = (0, describe_js_namespaceObject.elementDescriberInstruction)();
197
+ const defaultRectSize = 30;
198
+ const targetRect = Array.isArray(target) ? {
199
+ left: Math.floor(target[0] - defaultRectSize / 2),
200
+ top: Math.floor(target[1] - defaultRectSize / 2),
201
+ width: defaultRectSize,
202
+ height: defaultRectSize
203
+ } : target;
204
+ let imagePayload = await (0, img_namespaceObject.compositeElementInfoImg)({
205
+ inputImgBase64: screenshotBase64,
206
+ size,
207
+ elementsPositionInfo: [
208
+ {
209
+ rect: targetRect
210
+ }
211
+ ],
212
+ borderThickness: 3
213
+ });
214
+ if (null == opt ? void 0 : opt.deepThink) {
215
+ const searchArea = (0, common_js_namespaceObject.expandSearchArea)(targetRect, context.size, vlMode);
216
+ debug('describe: set searchArea', searchArea);
217
+ const croppedResult = await (0, img_namespaceObject.cropByRect)(imagePayload, searchArea, 'qwen-vl' === vlMode);
218
+ imagePayload = croppedResult.imageBase64;
219
+ }
220
+ const msgs = [
221
+ {
222
+ role: 'system',
223
+ content: systemPrompt
224
+ },
225
+ {
226
+ role: 'user',
227
+ content: [
228
+ {
229
+ type: 'image_url',
230
+ image_url: {
231
+ url: imagePayload,
232
+ detail: 'high'
233
+ }
234
+ }
235
+ ]
236
+ }
237
+ ];
238
+ const callAIFn = this.aiVendorFn;
239
+ const res = await callAIFn(msgs, common_js_namespaceObject.AIActionType.DESCRIBE_ELEMENT, modelConfig);
240
+ const { content } = res;
241
+ (0, utils_namespaceObject.assert)(!content.error, `describe failed: ${content.error}`);
242
+ (0, utils_namespaceObject.assert)(content.description, 'failed to describe the element');
243
+ return content;
244
+ }
245
+ constructor(context, opt){
246
+ _define_property(this, "contextRetrieverFn", void 0);
247
+ _define_property(this, "aiVendorFn", index_js_namespaceObject.callAIWithObjectResponse);
248
+ _define_property(this, "onceDumpUpdatedFn", void 0);
249
+ _define_property(this, "taskInfo", void 0);
250
+ (0, utils_namespaceObject.assert)(context, 'context is required for Insight');
251
+ if ('function' == typeof context) this.contextRetrieverFn = context;
252
+ else this.contextRetrieverFn = ()=>Promise.resolve(context);
253
+ if (void 0 !== (null == opt ? void 0 : opt.aiVendorFn)) this.aiVendorFn = opt.aiVendorFn;
254
+ if (void 0 !== (null == opt ? void 0 : opt.taskInfo)) this.taskInfo = opt.taskInfo;
255
+ }
256
+ }
257
+ exports["default"] = __webpack_exports__["default"];
258
+ for(var __webpack_i__ in __webpack_exports__)if (-1 === [
259
+ "default"
260
+ ].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
261
+ Object.defineProperty(exports, '__esModule', {
262
+ value: true
263
+ });
264
+
265
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insight\\index.js","sources":["webpack://@sqaitech/core/webpack/runtime/define_property_getters","webpack://@sqaitech/core/webpack/runtime/has_own_property","webpack://@sqaitech/core/webpack/runtime/make_namespace_object","webpack://@sqaitech/core/./src/insight/index.ts"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import { AIActionType, type AIArgs, expandSearchArea } from '@/ai-model/common';\r\nimport {\r\n AiExtractElementInfo,\r\n AiLocateElement,\r\n callAIWithObjectResponse,\r\n} from '@/ai-model/index';\r\nimport { AiLocateSection } from '@/ai-model/inspect';\r\nimport { elementDescriberInstruction } from '@/ai-model/prompt/describe';\r\nimport type {\r\n AIDescribeElementResponse,\r\n AIUsageInfo,\r\n BaseElement,\r\n DetailedLocateParam,\r\n DumpSubscriber,\r\n InsightAction,\r\n InsightExtractOption,\r\n InsightExtractParam,\r\n InsightTaskInfo,\r\n LocateResult,\r\n PartialInsightDumpFromSDK,\r\n Rect,\r\n UIContext,\r\n} from '@/types';\r\nimport {\r\n type IModelConfig,\r\n SQAI_FORCE_DEEP_THINK,\r\n globalConfigManager,\r\n} from '@sqaitech/shared/env';\r\nimport { compositeElementInfoImg, cropByRect } from '@sqaitech/shared/img';\r\nimport { getDebug } from '@sqaitech/shared/logger';\r\nimport { assert } from '@sqaitech/shared/utils';\r\nimport type { TMultimodalPrompt } from '../ai-model/common';\r\nimport { emitInsightDump } from './utils';\r\n\r\nexport interface LocateOpts {\r\n context?: UIContext<BaseElement>;\r\n}\r\n\r\nexport type AnyValue<T> = {\r\n [K in keyof T]: unknown extends T[K] ? any : T[K];\r\n};\r\n\r\ninterface InsightOptions {\r\n taskInfo?: Omit<InsightTaskInfo, 'durationMs'>;\r\n aiVendorFn?: typeof callAIWithObjectResponse;\r\n}\r\n\r\nconst debug = getDebug('ai:insight');\r\nexport default class Insight<\r\n ElementType extends BaseElement = BaseElement,\r\n ContextType extends UIContext<ElementType> = UIContext<ElementType>,\r\n> {\r\n contextRetrieverFn: (\r\n action: InsightAction,\r\n ) => Promise<ContextType> | ContextType;\r\n\r\n aiVendorFn: Exclude<InsightOptions['aiVendorFn'], undefined> =\r\n callAIWithObjectResponse;\r\n\r\n onceDumpUpdatedFn?: DumpSubscriber;\r\n\r\n taskInfo?: Omit<InsightTaskInfo, 'durationMs'>;\r\n\r\n constructor(\r\n context:\r\n | ContextType\r\n | ((action: InsightAction) => Promise<ContextType> | ContextType),\r\n opt?: InsightOptions,\r\n ) {\r\n assert(context, 'context is required for Insight');\r\n if (typeof context === 'function') {\r\n this.contextRetrieverFn = context;\r\n } else {\r\n this.contextRetrieverFn = () => Promise.resolve(context);\r\n }\r\n\r\n // just for unit test, aiVendorFn is callAIWithObjectResponse by default\r\n if (typeof opt?.aiVendorFn !== 'undefined') {\r\n this.aiVendorFn = opt.aiVendorFn;\r\n }\r\n if (typeof opt?.taskInfo !== 'undefined') {\r\n this.taskInfo = opt.taskInfo;\r\n }\r\n }\r\n\r\n async locate(\r\n query: DetailedLocateParam,\r\n opt: LocateOpts,\r\n modelConfig: IModelConfig,\r\n ): Promise<LocateResult> {\r\n const queryPrompt = typeof query === 'string' ? query : query.prompt;\r\n assert(queryPrompt, 'query is required for locate');\r\n const dumpSubscriber = this.onceDumpUpdatedFn;\r\n this.onceDumpUpdatedFn = undefined;\r\n\r\n assert(typeof query === 'object', 'query should be an object for locate');\r\n\r\n const globalDeepThinkSwitch = globalConfigManager.getEnvConfigInBoolean(\r\n SQAI_FORCE_DEEP_THINK,\r\n );\r\n if (globalDeepThinkSwitch) {\r\n debug('globalDeepThinkSwitch', globalDeepThinkSwitch);\r\n }\r\n let searchAreaPrompt;\r\n if (query.deepThink || globalDeepThinkSwitch) {\r\n searchAreaPrompt = query.prompt;\r\n }\r\n\r\n const { vlMode } = modelConfig;\r\n\r\n if (searchAreaPrompt && !vlMode) {\r\n console.warn(\r\n 'The \"deepThink\" feature is not supported with multimodal LLM. Please config VL model for SQAI. https://sqai.tech/choose-a-model',\r\n );\r\n searchAreaPrompt = undefined;\r\n }\r\n\r\n const context = opt?.context || (await this.contextRetrieverFn('locate'));\r\n\r\n let searchArea: Rect | undefined = undefined;\r\n let searchAreaRawResponse: string | undefined = undefined;\r\n let searchAreaUsage: AIUsageInfo | undefined = undefined;\r\n let searchAreaResponse:\r\n | Awaited<ReturnType<typeof AiLocateSection>>\r\n | undefined = undefined;\r\n if (searchAreaPrompt) {\r\n searchAreaResponse = await AiLocateSection({\r\n context,\r\n sectionDescription: searchAreaPrompt,\r\n modelConfig,\r\n });\r\n assert(\r\n searchAreaResponse.rect,\r\n `cannot find search area for \"${searchAreaPrompt}\"${\r\n searchAreaResponse.error ? `: ${searchAreaResponse.error}` : ''\r\n }`,\r\n );\r\n searchAreaRawResponse = searchAreaResponse.rawResponse;\r\n searchAreaUsage = searchAreaResponse.usage;\r\n searchArea = searchAreaResponse.rect;\r\n }\r\n\r\n const startTime = Date.now();\r\n const {\r\n parseResult,\r\n rect,\r\n elementById,\r\n rawResponse,\r\n usage,\r\n isOrderSensitive,\r\n } = await AiLocateElement({\r\n callAIFn: this.aiVendorFn,\r\n context,\r\n targetElementDescription: queryPrompt,\r\n searchConfig: searchAreaResponse,\r\n modelConfig,\r\n });\r\n\r\n const timeCost = Date.now() - startTime;\r\n const taskInfo: InsightTaskInfo = {\r\n ...(this.taskInfo ? this.taskInfo : {}),\r\n durationMs: timeCost,\r\n rawResponse: JSON.stringify(rawResponse),\r\n formatResponse: JSON.stringify(parseResult),\r\n usage,\r\n searchArea,\r\n searchAreaRawResponse,\r\n searchAreaUsage,\r\n };\r\n\r\n let errorLog: string | undefined;\r\n if (parseResult.errors?.length) {\r\n errorLog = `AI model failed to locate: \\n${parseResult.errors.join('\\n')}`;\r\n }\r\n\r\n const dumpData: PartialInsightDumpFromSDK = {\r\n type: 'locate',\r\n userQuery: {\r\n element: queryPrompt,\r\n },\r\n matchedElement: [],\r\n matchedRect: rect,\r\n data: null,\r\n taskInfo,\r\n deepThink: !!searchArea,\r\n error: errorLog,\r\n };\r\n\r\n const elements: BaseElement[] = [];\r\n (parseResult.elements || []).forEach((item) => {\r\n if ('id' in item) {\r\n const element = elementById(item?.id);\r\n\r\n if (!element) {\r\n console.warn(\r\n `locate: cannot find element id=${item.id}. Maybe an unstable response from AI model`,\r\n );\r\n return;\r\n }\r\n elements.push(element);\r\n }\r\n });\r\n\r\n emitInsightDump(\r\n {\r\n ...dumpData,\r\n matchedElement: elements,\r\n },\r\n dumpSubscriber,\r\n );\r\n\r\n if (errorLog) {\r\n throw new Error(errorLog);\r\n }\r\n\r\n assert(\r\n elements.length <= 1,\r\n `locate: multiple elements found, length = ${elements.length}`,\r\n );\r\n\r\n if (elements.length === 1) {\r\n return {\r\n element: {\r\n id: elements[0]!.id,\r\n indexId: elements[0]!.indexId,\r\n center: elements[0]!.center,\r\n rect: elements[0]!.rect,\r\n xpaths: elements[0]!.xpaths || [],\r\n attributes: elements[0]!.attributes,\r\n isOrderSensitive,\r\n },\r\n rect,\r\n };\r\n }\r\n return {\r\n element: null,\r\n rect,\r\n };\r\n }\r\n\r\n async extract<T>(\r\n dataDemand: InsightExtractParam,\r\n modelConfig: IModelConfig,\r\n opt?: InsightExtractOption,\r\n multimodalPrompt?: TMultimodalPrompt,\r\n ): Promise<{\r\n data: T;\r\n thought?: string;\r\n usage?: AIUsageInfo;\r\n }> {\r\n assert(\r\n typeof dataDemand === 'object' || typeof dataDemand === 'string',\r\n `dataDemand should be object or string, but get ${typeof dataDemand}`,\r\n );\r\n const dumpSubscriber = this.onceDumpUpdatedFn;\r\n this.onceDumpUpdatedFn = undefined;\r\n\r\n const context = await this.contextRetrieverFn('extract');\r\n\r\n const startTime = Date.now();\r\n\r\n const { parseResult, usage } = await AiExtractElementInfo<T>({\r\n context,\r\n dataQuery: dataDemand,\r\n multimodalPrompt,\r\n extractOption: opt,\r\n modelConfig,\r\n });\r\n\r\n const timeCost = Date.now() - startTime;\r\n const taskInfo: InsightTaskInfo = {\r\n ...(this.taskInfo ? this.taskInfo : {}),\r\n durationMs: timeCost,\r\n rawResponse: JSON.stringify(parseResult),\r\n };\r\n\r\n let errorLog: string | undefined;\r\n if (parseResult.errors?.length) {\r\n errorLog = `AI response error: \\n${parseResult.errors.join('\\n')}`;\r\n }\r\n\r\n const dumpData: PartialInsightDumpFromSDK = {\r\n type: 'extract',\r\n userQuery: {\r\n dataDemand,\r\n },\r\n matchedElement: [],\r\n data: null,\r\n taskInfo,\r\n error: errorLog,\r\n };\r\n\r\n const { data, thought } = parseResult || {};\r\n\r\n // 4\r\n emitInsightDump(\r\n {\r\n ...dumpData,\r\n data,\r\n },\r\n dumpSubscriber,\r\n );\r\n\r\n if (errorLog && !data && !opt?.doNotThrowError) {\r\n throw new Error(errorLog);\r\n }\r\n\r\n return {\r\n data,\r\n thought,\r\n usage,\r\n };\r\n }\r\n\r\n async describe(\r\n target: Rect | [number, number],\r\n modelConfig: IModelConfig,\r\n opt?: {\r\n deepThink?: boolean;\r\n },\r\n ): Promise<Pick<AIDescribeElementResponse, 'description'>> {\r\n assert(target, 'target is required for insight.describe');\r\n const context = await this.contextRetrieverFn('describe');\r\n const { screenshotBase64, size } = context;\r\n assert(screenshotBase64, 'screenshot is required for insight.describe');\r\n // The result of the \"describe\" function will be used for positioning, so essentially it is a form of grounding.\r\n const { vlMode } = modelConfig;\r\n const systemPrompt = elementDescriberInstruction();\r\n\r\n // Convert [x,y] center point to Rect if needed\r\n const defaultRectSize = 30;\r\n const targetRect: Rect = Array.isArray(target)\r\n ? {\r\n left: Math.floor(target[0] - defaultRectSize / 2),\r\n top: Math.floor(target[1] - defaultRectSize / 2),\r\n width: defaultRectSize,\r\n height: defaultRectSize,\r\n }\r\n : target;\r\n\r\n let imagePayload = await compositeElementInfoImg({\r\n inputImgBase64: screenshotBase64,\r\n size,\r\n elementsPositionInfo: [\r\n {\r\n rect: targetRect,\r\n },\r\n ],\r\n borderThickness: 3,\r\n });\r\n\r\n if (opt?.deepThink) {\r\n const searchArea = expandSearchArea(targetRect, context.size, vlMode);\r\n debug('describe: set searchArea', searchArea);\r\n const croppedResult = await cropByRect(\r\n imagePayload,\r\n searchArea,\r\n vlMode === 'qwen-vl',\r\n );\r\n imagePayload = croppedResult.imageBase64;\r\n }\r\n\r\n const msgs: AIArgs = [\r\n { role: 'system', content: systemPrompt },\r\n {\r\n role: 'user',\r\n content: [\r\n {\r\n type: 'image_url',\r\n image_url: {\r\n url: imagePayload,\r\n detail: 'high',\r\n },\r\n },\r\n ],\r\n },\r\n ];\r\n\r\n const callAIFn = this\r\n .aiVendorFn as typeof callAIWithObjectResponse<AIDescribeElementResponse>;\r\n\r\n const res = await callAIFn(\r\n msgs,\r\n AIActionType.DESCRIBE_ELEMENT,\r\n modelConfig,\r\n );\r\n\r\n const { content } = res;\r\n assert(!content.error, `describe failed: ${content.error}`);\r\n assert(content.description, 'failed to describe the element');\r\n return content;\r\n }\r\n}\r\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","debug","getDebug","Insight","query","opt","modelConfig","_parseResult_errors","queryPrompt","assert","dumpSubscriber","undefined","globalDeepThinkSwitch","globalConfigManager","SQAI_FORCE_DEEP_THINK","searchAreaPrompt","vlMode","console","context","searchArea","searchAreaRawResponse","searchAreaUsage","searchAreaResponse","AiLocateSection","startTime","Date","parseResult","rect","elementById","rawResponse","usage","isOrderSensitive","AiLocateElement","timeCost","taskInfo","JSON","errorLog","dumpData","elements","item","element","emitInsightDump","Error","dataDemand","multimodalPrompt","AiExtractElementInfo","data","thought","target","screenshotBase64","size","systemPrompt","elementDescriberInstruction","defaultRectSize","targetRect","Array","Math","imagePayload","compositeElementInfoImg","expandSearchArea","croppedResult","cropByRect","msgs","callAIFn","res","AIActionType","content","callAIWithObjectResponse","Promise"],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, definition)=>{
5
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
6
+ enumerable: true,
7
+ get: definition[key]
8
+ });
9
+ };
10
+ })();
11
+ (()=>{
12
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
13
+ })();
14
+ (()=>{
15
+ __webpack_require__.r = (exports1)=>{
16
+ if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
17
+ value: 'Module'
18
+ });
19
+ Object.defineProperty(exports1, '__esModule', {
20
+ value: true
21
+ });
22
+ };
23
+ })();
24
+ var __webpack_exports__ = {};
25
+ __webpack_require__.r(__webpack_exports__);
26
+ __webpack_require__.d(__webpack_exports__, {
27
+ emitInsightDump: ()=>emitInsightDump
28
+ });
29
+ const utils_namespaceObject = require("@sqaitech/shared/utils");
30
+ function emitInsightDump(data, dumpSubscriber) {
31
+ const baseData = {
32
+ logTime: Date.now()
33
+ };
34
+ const finalData = {
35
+ logId: (0, utils_namespaceObject.uuid)(),
36
+ ...baseData,
37
+ ...data
38
+ };
39
+ null == dumpSubscriber || dumpSubscriber(finalData);
40
+ }
41
+ exports.emitInsightDump = __webpack_exports__.emitInsightDump;
42
+ for(var __webpack_i__ in __webpack_exports__)if (-1 === [
43
+ "emitInsightDump"
44
+ ].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
45
+ Object.defineProperty(exports, '__esModule', {
46
+ value: true
47
+ });
48
+
49
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insight\\utils.js","sources":["webpack://@sqaitech/core/webpack/runtime/define_property_getters","webpack://@sqaitech/core/webpack/runtime/has_own_property","webpack://@sqaitech/core/webpack/runtime/make_namespace_object","webpack://@sqaitech/core/./src/insight/utils.ts"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import type {\r\n DumpMeta,\r\n DumpSubscriber,\r\n InsightDump,\r\n PartialInsightDumpFromSDK,\r\n} from '@/types';\r\nimport { uuid } from '@sqaitech/shared/utils';\r\n\r\nexport function emitInsightDump(\r\n data: PartialInsightDumpFromSDK,\r\n dumpSubscriber?: DumpSubscriber,\r\n) {\r\n const baseData: DumpMeta = {\r\n logTime: Date.now(),\r\n };\r\n const finalData: InsightDump = {\r\n logId: uuid(),\r\n ...baseData,\r\n ...data,\r\n };\r\n\r\n dumpSubscriber?.(finalData);\r\n}\r\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","emitInsightDump","data","dumpSubscriber","baseData","Date","finalData","uuid"],"mappings":";;;IAAAA,oBAAoB,CAAC,GAAG,CAAC,UAASC;QACjC,IAAI,IAAIC,OAAOD,WACR,IAAGD,oBAAoB,CAAC,CAACC,YAAYC,QAAQ,CAACF,oBAAoB,CAAC,CAAC,UAASE,MACzEC,OAAO,cAAc,CAAC,UAASD,KAAK;YAAE,YAAY;YAAM,KAAKD,UAAU,CAACC,IAAI;QAAC;IAGzF;;;ICNAF,oBAAoB,CAAC,GAAG,CAACI,KAAKC,OAAUF,OAAO,SAAS,CAAC,cAAc,CAAC,IAAI,CAACC,KAAKC;;;ICClFL,oBAAoB,CAAC,GAAG,CAAC;QACxB,IAAG,AAAkB,eAAlB,OAAOM,UAA0BA,OAAO,WAAW,EACrDH,OAAO,cAAc,CAAC,UAASG,OAAO,WAAW,EAAE;YAAE,OAAO;QAAS;QAEtEH,OAAO,cAAc,CAAC,UAAS,cAAc;YAAE,OAAO;QAAK;IAC5D;;;;;;;;ACEO,SAASI,gBACdC,IAA+B,EAC/BC,cAA+B;IAE/B,MAAMC,WAAqB;QACzB,SAASC,KAAK,GAAG;IACnB;IACA,MAAMC,YAAyB;QAC7B,OAAOC,AAAAA,IAAAA,sBAAAA,IAAAA,AAAAA;QACP,GAAGH,QAAQ;QACX,GAAGF,IAAI;IACT;IAEAC,QAAAA,kBAAAA,eAAiBG;AACnB"}
@@ -0,0 +1,122 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, definition)=>{
5
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
6
+ enumerable: true,
7
+ get: definition[key]
8
+ });
9
+ };
10
+ })();
11
+ (()=>{
12
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
13
+ })();
14
+ (()=>{
15
+ __webpack_require__.r = (exports1)=>{
16
+ if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
17
+ value: 'Module'
18
+ });
19
+ Object.defineProperty(exports1, '__esModule', {
20
+ value: true
21
+ });
22
+ };
23
+ })();
24
+ var __webpack_exports__ = {};
25
+ __webpack_require__.r(__webpack_exports__);
26
+ __webpack_require__.d(__webpack_exports__, {
27
+ ReportMergingTool: ()=>ReportMergingTool
28
+ });
29
+ const external_node_fs_namespaceObject = require("node:fs");
30
+ const external_node_path_namespaceObject = require("node:path");
31
+ const common_namespaceObject = require("@sqaitech/shared/common");
32
+ const index_js_namespaceObject = require("./agent/index.js");
33
+ const external_utils_js_namespaceObject = require("./utils.js");
34
+ function _define_property(obj, key, value) {
35
+ if (key in obj) Object.defineProperty(obj, key, {
36
+ value: value,
37
+ enumerable: true,
38
+ configurable: true,
39
+ writable: true
40
+ });
41
+ else obj[key] = value;
42
+ return obj;
43
+ }
44
+ class ReportMergingTool {
45
+ append(reportInfo) {
46
+ this.reportInfos.push(reportInfo);
47
+ }
48
+ clear() {
49
+ this.reportInfos = [];
50
+ }
51
+ extractScriptContent(filePath) {
52
+ const scriptRegex = /\n<script type="SQAI_web_dump" type="application\/json"[^>]*>([\s\S]*?)\n<\/script>/;
53
+ const fileContent = external_node_fs_namespaceObject.readFileSync(filePath, 'utf-8');
54
+ const match = scriptRegex.exec(fileContent);
55
+ return match ? match[1].trim() : '';
56
+ }
57
+ mergeReports(reportFileName = 'AUTO', opts) {
58
+ if (this.reportInfos.length <= 1) {
59
+ console.log('Not enough report to merge');
60
+ return null;
61
+ }
62
+ opts = Object.assign({
63
+ rmOriginalReports: false,
64
+ overwrite: false
65
+ }, opts || {});
66
+ const { rmOriginalReports, overwrite } = opts;
67
+ let outputFilePath;
68
+ const targetDir = `${(0, common_namespaceObject.getMidsceneRunSubDir)('report')}`;
69
+ if ('AUTO' === reportFileName) outputFilePath = external_node_path_namespaceObject.resolve(targetDir, `${(0, index_js_namespaceObject.getReportFileName)('merged-report')}.html`);
70
+ else {
71
+ outputFilePath = external_node_path_namespaceObject.resolve(targetDir, `${reportFileName}.html`);
72
+ if (external_node_fs_namespaceObject.existsSync(outputFilePath) && !overwrite) throw Error(`report file already existed: ${outputFilePath}\nset override to true to overwrite this file.`);
73
+ if (external_node_fs_namespaceObject.existsSync(outputFilePath) && overwrite) external_node_fs_namespaceObject.unlinkSync(outputFilePath);
74
+ }
75
+ console.log(`Start merging ${this.reportInfos.length} reports...\nCreating template file...`);
76
+ try {
77
+ external_node_fs_namespaceObject.appendFileSync(outputFilePath, (0, external_utils_js_namespaceObject.getReportTpl)());
78
+ for(let i = 0; i < this.reportInfos.length; i++){
79
+ const reportInfo = this.reportInfos[i];
80
+ console.log(`Processing report ${i + 1}/${this.reportInfos.length}`);
81
+ const dumpString = this.extractScriptContent(reportInfo.reportFilePath);
82
+ const reportAttributes = reportInfo.reportAttributes;
83
+ const reportHtmlStr = `${(0, external_utils_js_namespaceObject.reportHTMLContent)({
84
+ dumpString,
85
+ attributes: {
86
+ playwright_test_duration: reportAttributes.testDuration,
87
+ playwright_test_status: reportAttributes.testStatus,
88
+ playwright_test_title: reportAttributes.testTitle,
89
+ playwright_test_id: reportAttributes.testId,
90
+ playwright_test_description: reportAttributes.testDescription
91
+ }
92
+ }, void 0, void 0, false)}\n`;
93
+ external_node_fs_namespaceObject.appendFileSync(outputFilePath, reportHtmlStr);
94
+ }
95
+ console.log(`Successfully merged new report: ${outputFilePath}`);
96
+ if (rmOriginalReports) {
97
+ for (const info of this.reportInfos)try {
98
+ external_node_fs_namespaceObject.unlinkSync(info.reportFilePath);
99
+ } catch (error) {
100
+ console.error(`Error deleting report ${info.reportFilePath}:`, error);
101
+ }
102
+ console.log(`Removed ${this.reportInfos.length} original reports`);
103
+ }
104
+ return outputFilePath;
105
+ } catch (error) {
106
+ console.error('Error in mergeReports:', error);
107
+ throw error;
108
+ }
109
+ }
110
+ constructor(){
111
+ _define_property(this, "reportInfos", []);
112
+ }
113
+ }
114
+ exports.ReportMergingTool = __webpack_exports__.ReportMergingTool;
115
+ for(var __webpack_i__ in __webpack_exports__)if (-1 === [
116
+ "ReportMergingTool"
117
+ ].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
118
+ Object.defineProperty(exports, '__esModule', {
119
+ value: true
120
+ });
121
+
122
+ //# sourceMappingURL=report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.js","sources":["webpack://@sqaitech/core/webpack/runtime/define_property_getters","webpack://@sqaitech/core/webpack/runtime/has_own_property","webpack://@sqaitech/core/webpack/runtime/make_namespace_object","webpack://@sqaitech/core/./src/report.ts"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import * as fs from 'node:fs';\r\nimport * as path from 'node:path';\r\nimport { getMidsceneRunSubDir } from '@sqaitech/shared/common';\r\nimport { getReportFileName } from './agent';\r\nimport type { ReportFileWithAttributes } from './types';\r\nimport { getReportTpl, reportHTMLContent } from './utils';\r\n\r\nexport class ReportMergingTool {\r\n private reportInfos: ReportFileWithAttributes[] = [];\r\n public append(reportInfo: ReportFileWithAttributes) {\r\n this.reportInfos.push(reportInfo);\r\n }\r\n public clear() {\r\n this.reportInfos = [];\r\n }\r\n private extractScriptContent(filePath: string): string {\r\n // Regular expression to match content between script tags\r\n // Requires newline before <script and </script>\r\n const scriptRegex =\r\n /\\n<script type=\"SQAI_web_dump\" type=\"application\\/json\"[^>]*>([\\s\\S]*?)\\n<\\/script>/;\r\n\r\n const fileContent = fs.readFileSync(filePath, 'utf-8');\r\n const match = scriptRegex.exec(fileContent);\r\n\r\n return match ? match[1].trim() : '';\r\n }\r\n\r\n public mergeReports(\r\n reportFileName: 'AUTO' | string = 'AUTO', // user custom report filename, save into midscene report dir if undefined\r\n opts?: {\r\n rmOriginalReports?: boolean; // whether to remove origin report files\r\n overwrite?: boolean; // if outfilepath specified, throw an error when overwrite = true, otherwise overwrite the file\r\n },\r\n ): string | null {\r\n if (this.reportInfos.length <= 1) {\r\n console.log('Not enough report to merge');\r\n return null;\r\n }\r\n opts = Object.assign(\r\n {\r\n rmOriginalReports: false,\r\n overwrite: false,\r\n },\r\n opts || {},\r\n );\r\n const { rmOriginalReports, overwrite } = opts;\r\n let outputFilePath;\r\n const targetDir = `${getMidsceneRunSubDir('report')}`;\r\n if (reportFileName === 'AUTO') {\r\n outputFilePath = path.resolve(\r\n targetDir,\r\n `${getReportFileName('merged-report')}.html`,\r\n );\r\n } else {\r\n // user specified a outfilepath\r\n outputFilePath = path.resolve(targetDir, `${reportFileName}.html`);\r\n if (fs.existsSync(outputFilePath) && !overwrite) {\r\n throw Error(\r\n `report file already existed: ${outputFilePath}\\nset override to true to overwrite this file.`,\r\n );\r\n } else if (fs.existsSync(outputFilePath) && overwrite) {\r\n fs.unlinkSync(outputFilePath);\r\n }\r\n }\r\n\r\n console.log(\r\n `Start merging ${this.reportInfos.length} reports...\\nCreating template file...`,\r\n );\r\n\r\n try {\r\n // Write template\r\n fs.appendFileSync(outputFilePath, getReportTpl());\r\n\r\n // Process all reports one by one\r\n for (let i = 0; i < this.reportInfos.length; i++) {\r\n const reportInfo = this.reportInfos[i];\r\n console.log(`Processing report ${i + 1}/${this.reportInfos.length}`);\r\n\r\n const dumpString = this.extractScriptContent(reportInfo.reportFilePath);\r\n const reportAttributes = reportInfo.reportAttributes;\r\n\r\n const reportHtmlStr = `${reportHTMLContent(\r\n {\r\n dumpString,\r\n attributes: {\r\n playwright_test_duration: reportAttributes.testDuration,\r\n playwright_test_status: reportAttributes.testStatus,\r\n playwright_test_title: reportAttributes.testTitle,\r\n playwright_test_id: reportAttributes.testId,\r\n playwright_test_description: reportAttributes.testDescription,\r\n },\r\n },\r\n undefined,\r\n undefined,\r\n false,\r\n )}\\n`; // use existed function to achieve report script content\r\n\r\n fs.appendFileSync(outputFilePath, reportHtmlStr);\r\n }\r\n\r\n console.log(`Successfully merged new report: ${outputFilePath}`);\r\n\r\n // Remove original reports if needed\r\n if (rmOriginalReports) {\r\n for (const info of this.reportInfos) {\r\n try {\r\n fs.unlinkSync(info.reportFilePath);\r\n } catch (error) {\r\n console.error(\r\n `Error deleting report ${info.reportFilePath}:`,\r\n error,\r\n );\r\n }\r\n }\r\n console.log(`Removed ${this.reportInfos.length} original reports`);\r\n }\r\n return outputFilePath;\r\n } catch (error) {\r\n console.error('Error in mergeReports:', error);\r\n throw error;\r\n }\r\n }\r\n}\r\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","ReportMergingTool","reportInfo","filePath","scriptRegex","fileContent","fs","match","reportFileName","opts","console","rmOriginalReports","overwrite","outputFilePath","targetDir","getMidsceneRunSubDir","path","getReportFileName","Error","getReportTpl","i","dumpString","reportAttributes","reportHtmlStr","reportHTMLContent","undefined","info","error"],"mappings":"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"}