@midscene/core 0.30.10 → 1.0.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 (203) hide show
  1. package/dist/es/agent/agent.mjs +233 -144
  2. package/dist/es/agent/agent.mjs.map +1 -1
  3. package/dist/es/agent/execution-session.mjs +41 -0
  4. package/dist/es/agent/execution-session.mjs.map +1 -0
  5. package/dist/es/agent/index.mjs +3 -3
  6. package/dist/es/agent/task-builder.mjs +319 -0
  7. package/dist/es/agent/task-builder.mjs.map +1 -0
  8. package/dist/es/agent/task-cache.mjs +4 -4
  9. package/dist/es/agent/task-cache.mjs.map +1 -1
  10. package/dist/es/agent/tasks.mjs +197 -504
  11. package/dist/es/agent/tasks.mjs.map +1 -1
  12. package/dist/es/agent/ui-utils.mjs +54 -35
  13. package/dist/es/agent/ui-utils.mjs.map +1 -1
  14. package/dist/es/agent/utils.mjs +16 -58
  15. package/dist/es/agent/utils.mjs.map +1 -1
  16. package/dist/es/ai-model/conversation-history.mjs +25 -13
  17. package/dist/es/ai-model/conversation-history.mjs.map +1 -1
  18. package/dist/es/ai-model/index.mjs +4 -4
  19. package/dist/es/ai-model/inspect.mjs +45 -54
  20. package/dist/es/ai-model/inspect.mjs.map +1 -1
  21. package/dist/es/ai-model/llm-planning.mjs +47 -65
  22. package/dist/es/ai-model/llm-planning.mjs.map +1 -1
  23. package/dist/es/ai-model/prompt/assertion.mjs.map +1 -1
  24. package/dist/es/ai-model/prompt/common.mjs.map +1 -1
  25. package/dist/es/ai-model/prompt/describe.mjs.map +1 -1
  26. package/dist/es/ai-model/prompt/extraction.mjs.map +1 -1
  27. package/dist/es/ai-model/prompt/llm-locator.mjs +11 -235
  28. package/dist/es/ai-model/prompt/llm-locator.mjs.map +1 -1
  29. package/dist/es/ai-model/prompt/llm-planning.mjs +76 -322
  30. package/dist/es/ai-model/prompt/llm-planning.mjs.map +1 -1
  31. package/dist/es/ai-model/prompt/llm-section-locator.mjs +15 -14
  32. package/dist/es/ai-model/prompt/llm-section-locator.mjs.map +1 -1
  33. package/dist/es/ai-model/prompt/order-sensitive-judge.mjs +35 -0
  34. package/dist/es/ai-model/prompt/order-sensitive-judge.mjs.map +1 -0
  35. package/dist/es/ai-model/prompt/playwright-generator.mjs +2 -2
  36. package/dist/es/ai-model/prompt/playwright-generator.mjs.map +1 -1
  37. package/dist/es/ai-model/prompt/ui-tars-locator.mjs.map +1 -1
  38. package/dist/es/ai-model/prompt/ui-tars-planning.mjs.map +1 -1
  39. package/dist/es/ai-model/prompt/util.mjs +3 -88
  40. package/dist/es/ai-model/prompt/util.mjs.map +1 -1
  41. package/dist/es/ai-model/prompt/yaml-generator.mjs +10 -10
  42. package/dist/es/ai-model/prompt/yaml-generator.mjs.map +1 -1
  43. package/dist/es/ai-model/service-caller/index.mjs +182 -274
  44. package/dist/es/ai-model/service-caller/index.mjs.map +1 -1
  45. package/dist/es/ai-model/ui-tars-planning.mjs +69 -8
  46. package/dist/es/ai-model/ui-tars-planning.mjs.map +1 -1
  47. package/dist/es/{ai-model/common.mjs → common.mjs} +18 -30
  48. package/dist/es/common.mjs.map +1 -0
  49. package/dist/es/device/device-options.mjs +0 -0
  50. package/dist/es/device/index.mjs +29 -12
  51. package/dist/es/device/index.mjs.map +1 -1
  52. package/dist/es/index.mjs +5 -4
  53. package/dist/es/index.mjs.map +1 -1
  54. package/dist/es/report.mjs.map +1 -1
  55. package/dist/es/{insight → service}/index.mjs +38 -51
  56. package/dist/es/service/index.mjs.map +1 -0
  57. package/dist/es/{insight → service}/utils.mjs +3 -3
  58. package/dist/es/service/utils.mjs.map +1 -0
  59. package/dist/es/task-runner.mjs +264 -0
  60. package/dist/es/task-runner.mjs.map +1 -0
  61. package/dist/es/tree.mjs +13 -2
  62. package/dist/es/tree.mjs.map +1 -0
  63. package/dist/es/types.mjs +18 -1
  64. package/dist/es/types.mjs.map +1 -1
  65. package/dist/es/utils.mjs +6 -7
  66. package/dist/es/utils.mjs.map +1 -1
  67. package/dist/es/yaml/builder.mjs.map +1 -1
  68. package/dist/es/yaml/player.mjs +121 -98
  69. package/dist/es/yaml/player.mjs.map +1 -1
  70. package/dist/es/yaml/utils.mjs +1 -1
  71. package/dist/es/yaml/utils.mjs.map +1 -1
  72. package/dist/lib/agent/agent.js +231 -142
  73. package/dist/lib/agent/agent.js.map +1 -1
  74. package/dist/lib/agent/common.js +1 -1
  75. package/dist/lib/agent/execution-session.js +75 -0
  76. package/dist/lib/agent/execution-session.js.map +1 -0
  77. package/dist/lib/agent/index.js +14 -14
  78. package/dist/lib/agent/index.js.map +1 -1
  79. package/dist/lib/agent/task-builder.js +356 -0
  80. package/dist/lib/agent/task-builder.js.map +1 -0
  81. package/dist/lib/agent/task-cache.js +8 -8
  82. package/dist/lib/agent/task-cache.js.map +1 -1
  83. package/dist/lib/agent/tasks.js +202 -506
  84. package/dist/lib/agent/tasks.js.map +1 -1
  85. package/dist/lib/agent/ui-utils.js +58 -36
  86. package/dist/lib/agent/ui-utils.js.map +1 -1
  87. package/dist/lib/agent/utils.js +26 -68
  88. package/dist/lib/agent/utils.js.map +1 -1
  89. package/dist/lib/ai-model/conversation-history.js +27 -15
  90. package/dist/lib/ai-model/conversation-history.js.map +1 -1
  91. package/dist/lib/ai-model/index.js +27 -27
  92. package/dist/lib/ai-model/index.js.map +1 -1
  93. package/dist/lib/ai-model/inspect.js +51 -57
  94. package/dist/lib/ai-model/inspect.js.map +1 -1
  95. package/dist/lib/ai-model/llm-planning.js +49 -67
  96. package/dist/lib/ai-model/llm-planning.js.map +1 -1
  97. package/dist/lib/ai-model/prompt/assertion.js +2 -2
  98. package/dist/lib/ai-model/prompt/assertion.js.map +1 -1
  99. package/dist/lib/ai-model/prompt/common.js +2 -2
  100. package/dist/lib/ai-model/prompt/common.js.map +1 -1
  101. package/dist/lib/ai-model/prompt/describe.js +2 -2
  102. package/dist/lib/ai-model/prompt/describe.js.map +1 -1
  103. package/dist/lib/ai-model/prompt/extraction.js +2 -2
  104. package/dist/lib/ai-model/prompt/extraction.js.map +1 -1
  105. package/dist/lib/ai-model/prompt/llm-locator.js +14 -241
  106. package/dist/lib/ai-model/prompt/llm-locator.js.map +1 -1
  107. package/dist/lib/ai-model/prompt/llm-planning.js +79 -328
  108. package/dist/lib/ai-model/prompt/llm-planning.js.map +1 -1
  109. package/dist/lib/ai-model/prompt/llm-section-locator.js +17 -16
  110. package/dist/lib/ai-model/prompt/llm-section-locator.js.map +1 -1
  111. package/dist/lib/ai-model/prompt/order-sensitive-judge.js +72 -0
  112. package/dist/lib/ai-model/prompt/order-sensitive-judge.js.map +1 -0
  113. package/dist/lib/ai-model/prompt/playwright-generator.js +11 -11
  114. package/dist/lib/ai-model/prompt/playwright-generator.js.map +1 -1
  115. package/dist/lib/ai-model/prompt/ui-tars-locator.js +2 -2
  116. package/dist/lib/ai-model/prompt/ui-tars-locator.js.map +1 -1
  117. package/dist/lib/ai-model/prompt/ui-tars-planning.js +2 -2
  118. package/dist/lib/ai-model/prompt/ui-tars-planning.js.map +1 -1
  119. package/dist/lib/ai-model/prompt/util.js +7 -95
  120. package/dist/lib/ai-model/prompt/util.js.map +1 -1
  121. package/dist/lib/ai-model/prompt/yaml-generator.js +18 -18
  122. package/dist/lib/ai-model/prompt/yaml-generator.js.map +1 -1
  123. package/dist/lib/ai-model/service-caller/index.js +288 -401
  124. package/dist/lib/ai-model/service-caller/index.js.map +1 -1
  125. package/dist/lib/ai-model/ui-tars-planning.js +71 -10
  126. package/dist/lib/ai-model/ui-tars-planning.js.map +1 -1
  127. package/dist/lib/{ai-model/common.js → common.js} +40 -55
  128. package/dist/lib/common.js.map +1 -0
  129. package/dist/lib/device/device-options.js +20 -0
  130. package/dist/lib/device/device-options.js.map +1 -0
  131. package/dist/lib/device/index.js +63 -40
  132. package/dist/lib/device/index.js.map +1 -1
  133. package/dist/lib/image/index.js +5 -5
  134. package/dist/lib/image/index.js.map +1 -1
  135. package/dist/lib/index.js +24 -20
  136. package/dist/lib/index.js.map +1 -1
  137. package/dist/lib/report.js +2 -2
  138. package/dist/lib/report.js.map +1 -1
  139. package/dist/lib/{insight → service}/index.js +41 -54
  140. package/dist/lib/service/index.js.map +1 -0
  141. package/dist/lib/{insight → service}/utils.js +7 -7
  142. package/dist/lib/service/utils.js.map +1 -0
  143. package/dist/lib/task-runner.js +301 -0
  144. package/dist/lib/task-runner.js.map +1 -0
  145. package/dist/lib/tree.js +13 -4
  146. package/dist/lib/tree.js.map +1 -1
  147. package/dist/lib/types.js +31 -12
  148. package/dist/lib/types.js.map +1 -1
  149. package/dist/lib/utils.js +16 -17
  150. package/dist/lib/utils.js.map +1 -1
  151. package/dist/lib/yaml/builder.js +2 -2
  152. package/dist/lib/yaml/builder.js.map +1 -1
  153. package/dist/lib/yaml/index.js +16 -22
  154. package/dist/lib/yaml/index.js.map +1 -1
  155. package/dist/lib/yaml/player.js +123 -100
  156. package/dist/lib/yaml/player.js.map +1 -1
  157. package/dist/lib/yaml/utils.js +6 -6
  158. package/dist/lib/yaml/utils.js.map +1 -1
  159. package/dist/lib/yaml.js +1 -1
  160. package/dist/lib/yaml.js.map +1 -1
  161. package/dist/types/agent/agent.d.ts +62 -17
  162. package/dist/types/agent/execution-session.d.ts +36 -0
  163. package/dist/types/agent/index.d.ts +3 -2
  164. package/dist/types/agent/task-builder.d.ts +35 -0
  165. package/dist/types/agent/tasks.d.ts +32 -23
  166. package/dist/types/agent/ui-utils.d.ts +9 -2
  167. package/dist/types/agent/utils.d.ts +9 -35
  168. package/dist/types/ai-model/conversation-history.d.ts +8 -4
  169. package/dist/types/ai-model/index.d.ts +5 -5
  170. package/dist/types/ai-model/inspect.d.ts +20 -12
  171. package/dist/types/ai-model/llm-planning.d.ts +3 -1
  172. package/dist/types/ai-model/prompt/llm-locator.d.ts +1 -6
  173. package/dist/types/ai-model/prompt/llm-planning.d.ts +2 -3
  174. package/dist/types/ai-model/prompt/llm-section-locator.d.ts +1 -3
  175. package/dist/types/ai-model/prompt/order-sensitive-judge.d.ts +2 -0
  176. package/dist/types/ai-model/prompt/util.d.ts +2 -34
  177. package/dist/types/ai-model/service-caller/index.d.ts +2 -3
  178. package/dist/types/ai-model/ui-tars-planning.d.ts +15 -2
  179. package/dist/types/{ai-model/common.d.ts → common.d.ts} +6 -6
  180. package/dist/types/device/device-options.d.ts +57 -0
  181. package/dist/types/device/index.d.ts +55 -39
  182. package/dist/types/index.d.ts +7 -6
  183. package/dist/types/service/index.d.ts +26 -0
  184. package/dist/types/service/utils.d.ts +2 -0
  185. package/dist/types/task-runner.d.ts +49 -0
  186. package/dist/types/tree.d.ts +4 -1
  187. package/dist/types/types.d.ts +103 -66
  188. package/dist/types/yaml/utils.d.ts +1 -1
  189. package/dist/types/yaml.d.ts +68 -43
  190. package/package.json +9 -12
  191. package/dist/es/ai-model/action-executor.mjs +0 -129
  192. package/dist/es/ai-model/action-executor.mjs.map +0 -1
  193. package/dist/es/ai-model/common.mjs.map +0 -1
  194. package/dist/es/insight/index.mjs.map +0 -1
  195. package/dist/es/insight/utils.mjs.map +0 -1
  196. package/dist/lib/ai-model/action-executor.js +0 -163
  197. package/dist/lib/ai-model/action-executor.js.map +0 -1
  198. package/dist/lib/ai-model/common.js.map +0 -1
  199. package/dist/lib/insight/index.js.map +0 -1
  200. package/dist/lib/insight/utils.js.map +0 -1
  201. package/dist/types/ai-model/action-executor.d.ts +0 -19
  202. package/dist/types/insight/index.d.ts +0 -31
  203. package/dist/types/insight/utils.d.ts +0 -2
@@ -45,6 +45,7 @@ const env_namespaceObject = require("@midscene/shared/env");
45
45
  const img_namespaceObject = require("@midscene/shared/img");
46
46
  const logger_namespaceObject = require("@midscene/shared/logger");
47
47
  const utils_namespaceObject = require("@midscene/shared/utils");
48
+ const external_device_index_js_namespaceObject = require("../device/index.js");
48
49
  const external_task_cache_js_namespaceObject = require("./task-cache.js");
49
50
  const external_tasks_js_namespaceObject = require("./tasks.js");
50
51
  const external_ui_utils_js_namespaceObject = require("./ui-utils.js");
@@ -70,7 +71,7 @@ const includedInRect = (point, rect)=>{
70
71
  const { left, top, width, height } = rect;
71
72
  return x >= left && x <= left + width && y >= top && y <= top + height;
72
73
  };
73
- const defaultInsightExtractOption = {
74
+ const defaultServiceExtractOption = {
74
75
  domIncluded: false,
75
76
  screenshotIncluded: true
76
77
  };
@@ -81,7 +82,31 @@ const CACHE_STRATEGIES = [
81
82
  ];
82
83
  const isValidCacheStrategy = (strategy)=>CACHE_STRATEGIES.some((value)=>value === strategy);
83
84
  const CACHE_STRATEGY_VALUES = CACHE_STRATEGIES.map((value)=>`"${value}"`).join(', ');
85
+ const legacyScrollTypeMap = {
86
+ once: 'singleAction',
87
+ untilBottom: 'scrollToBottom',
88
+ untilTop: 'scrollToTop',
89
+ untilRight: 'scrollToRight',
90
+ untilLeft: 'scrollToLeft'
91
+ };
92
+ const normalizeScrollType = (scrollType)=>{
93
+ if (!scrollType) return scrollType;
94
+ if (scrollType in legacyScrollTypeMap) return legacyScrollTypeMap[scrollType];
95
+ return scrollType;
96
+ };
97
+ const defaultReplanningCycleLimit = 20;
98
+ const defaultVlmUiTarsReplanningCycleLimit = 40;
84
99
  class Agent {
100
+ get onDumpUpdate() {
101
+ return this.dumpUpdateListeners[0];
102
+ }
103
+ set onDumpUpdate(callback) {
104
+ this.dumpUpdateListeners = [];
105
+ if (callback) this.dumpUpdateListeners.push(callback);
106
+ }
107
+ get aiActContext() {
108
+ return this.opts.aiActContext ?? this.opts.aiActionContext;
109
+ }
85
110
  get page() {
86
111
  return this.interface;
87
112
  }
@@ -94,10 +119,11 @@ class Agent {
94
119
  async getScreenshotScale(context) {
95
120
  if (void 0 !== this.screenshotScale) return this.screenshotScale;
96
121
  if (!this.screenshotScalePromise) this.screenshotScalePromise = (async ()=>{
97
- var _context_size;
98
- const pageWidth = null == (_context_size = context.size) ? void 0 : _context_size.width;
122
+ const pageWidth = context.size?.width;
99
123
  (0, utils_namespaceObject.assert)(pageWidth && pageWidth > 0, `Invalid page width when computing screenshot scale: ${pageWidth}`);
124
+ debug('will get image info of base64');
100
125
  const { width: screenshotWidth } = await (0, img_namespaceObject.imageInfoOfBase64)(context.screenshotBase64);
126
+ debug('image info of base64 done');
101
127
  (0, utils_namespaceObject.assert)(Number.isFinite(screenshotWidth) && screenshotWidth > 0, `Invalid screenshot width when computing screenshot scale: ${screenshotWidth}`);
102
128
  const computedScale = screenshotWidth / pageWidth;
103
129
  (0, utils_namespaceObject.assert)(Number.isFinite(computedScale) && computedScale > 0, `Invalid computed screenshot scale: ${computedScale}`);
@@ -111,8 +137,16 @@ class Agent {
111
137
  this.screenshotScalePromise = void 0;
112
138
  }
113
139
  }
140
+ resolveReplanningCycleLimit(modelConfigForPlanning) {
141
+ if (void 0 !== this.opts.replanningCycleLimit) return this.opts.replanningCycleLimit;
142
+ return 'vlm-ui-tars' === modelConfigForPlanning.vlMode ? defaultVlmUiTarsReplanningCycleLimit : defaultReplanningCycleLimit;
143
+ }
114
144
  async getActionSpace() {
115
- return this.interface.actionSpace();
145
+ const commonAssertionAction = (0, external_device_index_js_namespaceObject.defineActionAssert)();
146
+ return [
147
+ ...this.interface.actionSpace(),
148
+ commonAssertionAction
149
+ ];
116
150
  }
117
151
  async getUIContext(action) {
118
152
  this.ensureVLModelWarning();
@@ -125,12 +159,14 @@ class Agent {
125
159
  debug('Using page.getContext for action:', action);
126
160
  context = await this.interface.getContext();
127
161
  } else {
128
- debug('Using commonContextParser for action:', action);
162
+ debug('Using commonContextParser');
129
163
  context = await (0, external_utils_js_namespaceObject_1.commonContextParser)(this.interface, {
130
164
  uploadServerUrl: this.modelConfigManager.getUploadTestServerUrl()
131
165
  });
132
166
  }
167
+ debug('will get screenshot scale');
133
168
  const computedScreenshotScale = await this.getScreenshotScale(context);
169
+ debug('computedScreenshotScale', computedScreenshotScale);
134
170
  if (1 !== computedScreenshotScale) {
135
171
  const scaleForLog = Number.parseFloat(computedScreenshotScale.toFixed(4));
136
172
  debug(`Applying computed screenshot scale: ${scaleForLog} (resize to logical size)`);
@@ -148,7 +184,11 @@ class Agent {
148
184
  return await this.getUIContext('locate');
149
185
  }
150
186
  async setAIActionContext(prompt) {
151
- if (this.opts.aiActionContext) console.warn('aiActionContext is already set, and it is called again, will override the previous setting');
187
+ await this.setAIActContext(prompt);
188
+ }
189
+ async setAIActContext(prompt) {
190
+ if (this.aiActContext) console.warn('aiActContext is already set, and it is called again, will override the previous setting');
191
+ this.opts.aiActContext = prompt;
152
192
  this.opts.aiActionContext = prompt;
153
193
  }
154
194
  resetDump() {
@@ -159,12 +199,22 @@ class Agent {
159
199
  executions: [],
160
200
  modelBriefs: []
161
201
  };
202
+ this.executionDumpIndexByRunner = new WeakMap();
162
203
  return this.dump;
163
204
  }
164
- appendExecutionDump(execution) {
165
- const trimmedExecution = (0, external_utils_js_namespaceObject_1.trimContextByViewport)(execution);
205
+ appendExecutionDump(execution, runner) {
166
206
  const currentDump = this.dump;
167
- currentDump.executions.push(trimmedExecution);
207
+ if (runner) {
208
+ const existingIndex = this.executionDumpIndexByRunner.get(runner);
209
+ if (void 0 !== existingIndex) {
210
+ currentDump.executions[existingIndex] = execution;
211
+ return;
212
+ }
213
+ currentDump.executions.push(execution);
214
+ this.executionDumpIndexByRunner.set(runner, currentDump.executions.length - 1);
215
+ return;
216
+ }
217
+ currentDump.executions.push(execution);
168
218
  }
169
219
  dumpDataString() {
170
220
  this.dump.groupName = this.opts.groupName;
@@ -192,22 +242,8 @@ class Agent {
192
242
  const tip = param ? `${(0, external_ui_utils_js_namespaceObject.typeStr)(task)} - ${param}` : (0, external_ui_utils_js_namespaceObject.typeStr)(task);
193
243
  if (this.onTaskStartTip) await this.onTaskStartTip(tip);
194
244
  }
195
- async afterTaskRunning(executor, doNotThrowError = false) {
196
- const executionDump = executor.dump();
197
- if (this.opts.aiActionContext) executionDump.aiActionContext = this.opts.aiActionContext;
198
- this.appendExecutionDump(executionDump);
199
- try {
200
- if (this.onDumpUpdate) this.onDumpUpdate(this.dumpDataString());
201
- } catch (error) {
202
- console.error('Error in onDumpUpdate', error);
203
- }
204
- this.writeOutActionDumps();
205
- if (executor.isInErrorState() && !doNotThrowError) {
206
- const errorTask = executor.latestErrorTask();
207
- throw new Error(`${null == errorTask ? void 0 : errorTask.errorMessage}\n${null == errorTask ? void 0 : errorTask.errorStack}`, {
208
- cause: null == errorTask ? void 0 : errorTask.error
209
- });
210
- }
245
+ wrapActionInActionSpace(name) {
246
+ return async (param)=>await this.callActionInActionSpace(name, param);
211
247
  }
212
248
  async callActionInActionSpace(type, opt) {
213
249
  debug('callActionInActionSpace', type, ',', opt);
@@ -220,10 +256,10 @@ class Agent {
220
256
  const plans = [
221
257
  actionPlan
222
258
  ].filter(Boolean);
223
- const title = (0, external_ui_utils_js_namespaceObject.taskTitleStr)(type, (0, external_ui_utils_js_namespaceObject.locateParamStr)((null == opt ? void 0 : opt.locate) || {}));
224
- const modelConfig = this.modelConfigManager.getModelConfig('grounding');
225
- const { output, executor } = await this.taskExecutor.runPlans(title, plans, modelConfig);
226
- await this.afterTaskRunning(executor);
259
+ const title = (0, external_ui_utils_js_namespaceObject.taskTitleStr)(type, (0, external_ui_utils_js_namespaceObject.locateParamStr)(opt?.locate || {}));
260
+ const defaultIntentModelConfig = this.modelConfigManager.getModelConfig('default');
261
+ const modelConfigForPlanning = this.modelConfigManager.getModelConfig('planning');
262
+ const { output } = await this.taskExecutor.runPlans(title, plans, modelConfigForPlanning, defaultIntentModelConfig);
227
263
  return output;
228
264
  }
229
265
  async aiTap(locatePrompt, opt) {
@@ -274,8 +310,10 @@ class Agent {
274
310
  (0, utils_namespaceObject.assert)('string' == typeof value || 'number' == typeof value, 'input value must be a string or number, use empty string if you want to clear the input');
275
311
  (0, utils_namespaceObject.assert)(locatePrompt, 'missing locate prompt for input');
276
312
  const detailedLocateParam = (0, index_js_namespaceObject.buildDetailedLocateParam)(locatePrompt, opt);
313
+ const stringValue = 'number' == typeof value ? String(value) : value;
277
314
  return this.callActionInActionSpace('Input', {
278
315
  ...opt || {},
316
+ value: stringValue,
279
317
  locate: detailedLocateParam
280
318
  });
281
319
  }
@@ -294,7 +332,7 @@ class Agent {
294
332
  keyName
295
333
  };
296
334
  }
297
- (0, utils_namespaceObject.assert)(null == opt ? void 0 : opt.keyName, 'missing keyName for keyboard press');
335
+ (0, utils_namespaceObject.assert)(opt?.keyName, 'missing keyName for keyboard press');
298
336
  const detailedLocateParam = locatePrompt ? (0, index_js_namespaceObject.buildDetailedLocateParam)(locatePrompt, opt) : void 0;
299
337
  return this.callActionInActionSpace('KeyboardPress', {
300
338
  ...opt || {},
@@ -316,28 +354,45 @@ class Agent {
316
354
  ...scrollParam || {}
317
355
  };
318
356
  }
357
+ if (opt) {
358
+ const normalizedScrollType = normalizeScrollType(opt.scrollType);
359
+ if (normalizedScrollType !== opt.scrollType) opt = {
360
+ ...opt || {},
361
+ scrollType: normalizedScrollType
362
+ };
363
+ }
319
364
  const detailedLocateParam = (0, index_js_namespaceObject.buildDetailedLocateParam)(locatePrompt || '', opt);
320
365
  return this.callActionInActionSpace('Scroll', {
321
366
  ...opt || {},
322
367
  locate: detailedLocateParam
323
368
  });
324
369
  }
325
- async aiAction(taskPrompt, opt) {
326
- var _this_taskCache, _this_taskCache1;
327
- const modelConfig = this.modelConfigManager.getModelConfig('planning');
328
- const cacheable = null == opt ? void 0 : opt.cacheable;
329
- const isVlmUiTars = 'vlm-ui-tars' === modelConfig.vlMode;
330
- const matchedCache = isVlmUiTars || false === cacheable ? void 0 : null == (_this_taskCache = this.taskCache) ? void 0 : _this_taskCache.matchPlanCache(taskPrompt);
331
- if (matchedCache && (null == (_this_taskCache1 = this.taskCache) ? void 0 : _this_taskCache1.isCacheResultUsed)) {
332
- var _matchedCache_cacheContent, _matchedCache_cacheContent1;
333
- const { executor } = await this.taskExecutor.loadYamlFlowAsPlanning(taskPrompt, null == (_matchedCache_cacheContent = matchedCache.cacheContent) ? void 0 : _matchedCache_cacheContent.yamlWorkflow);
334
- await this.afterTaskRunning(executor);
370
+ async aiAct(taskPrompt, opt) {
371
+ const modelConfigForPlanning = this.modelConfigManager.getModelConfig('planning');
372
+ const defaultIntentModelConfig = this.modelConfigManager.getModelConfig('default');
373
+ let planningStrategyToUse = opt?.planningStrategy || 'standard';
374
+ if (this.aiActContext && 'fast' === planningStrategyToUse) console.warn('using fast planning strategy with aiActContext is not recommended');
375
+ if (this.opts?._deepThink) {
376
+ debug('using deep think planning strategy');
377
+ planningStrategyToUse = 'max';
378
+ }
379
+ const includeBboxInPlanning = modelConfigForPlanning.modelName === defaultIntentModelConfig.modelName && 'fast' === planningStrategyToUse;
380
+ debug('setting includeBboxInPlanning to', includeBboxInPlanning);
381
+ const cacheable = opt?.cacheable;
382
+ const replanningCycleLimit = this.resolveReplanningCycleLimit(modelConfigForPlanning);
383
+ const isVlmUiTars = 'vlm-ui-tars' === modelConfigForPlanning.vlMode;
384
+ const matchedCache = isVlmUiTars || false === cacheable ? void 0 : this.taskCache?.matchPlanCache(taskPrompt);
385
+ if (matchedCache && this.taskCache?.isCacheResultUsed && matchedCache.cacheContent?.yamlWorkflow?.trim()) {
386
+ await this.taskExecutor.loadYamlFlowAsPlanning(taskPrompt, matchedCache.cacheContent.yamlWorkflow);
335
387
  debug('matched cache, will call .runYaml to run the action');
336
- const yaml = null == (_matchedCache_cacheContent1 = matchedCache.cacheContent) ? void 0 : _matchedCache_cacheContent1.yamlWorkflow;
388
+ const yaml = matchedCache.cacheContent.yamlWorkflow;
337
389
  return this.runYaml(yaml);
338
390
  }
339
- const { output, executor } = await this.taskExecutor.action(taskPrompt, modelConfig, this.opts.aiActionContext, cacheable);
340
- if (this.taskCache && (null == output ? void 0 : output.yamlFlow) && false !== cacheable) {
391
+ let imagesIncludeCount = 1;
392
+ if ('standard' === planningStrategyToUse) imagesIncludeCount = 2;
393
+ else if ('max' === planningStrategyToUse) imagesIncludeCount = void 0;
394
+ const { output } = await this.taskExecutor.action(taskPrompt, modelConfigForPlanning, defaultIntentModelConfig, includeBboxInPlanning, this.aiActContext, cacheable, replanningCycleLimit, imagesIncludeCount);
395
+ if (this.taskCache && output?.yamlFlow && false !== cacheable) {
341
396
  const yamlContent = {
342
397
  tasks: [
343
398
  {
@@ -353,37 +408,35 @@ class Agent {
353
408
  yamlWorkflow: yamlFlowStr
354
409
  }, matchedCache);
355
410
  }
356
- await this.afterTaskRunning(executor);
357
411
  return output;
358
412
  }
359
- async aiQuery(demand, opt = defaultInsightExtractOption) {
360
- const modelConfig = this.modelConfigManager.getModelConfig('VQA');
361
- const { output, executor } = await this.taskExecutor.createTypeQueryExecution('Query', demand, modelConfig, opt);
362
- await this.afterTaskRunning(executor);
413
+ async aiAction(taskPrompt, opt) {
414
+ return this.aiAct(taskPrompt, opt);
415
+ }
416
+ async aiQuery(demand, opt = defaultServiceExtractOption) {
417
+ const modelConfig = this.modelConfigManager.getModelConfig('insight');
418
+ const { output } = await this.taskExecutor.createTypeQueryExecution('Query', demand, modelConfig, opt);
363
419
  return output;
364
420
  }
365
- async aiBoolean(prompt, opt = defaultInsightExtractOption) {
366
- const modelConfig = this.modelConfigManager.getModelConfig('VQA');
421
+ async aiBoolean(prompt, opt = defaultServiceExtractOption) {
422
+ const modelConfig = this.modelConfigManager.getModelConfig('insight');
367
423
  const { textPrompt, multimodalPrompt } = (0, external_utils_js_namespaceObject_1.parsePrompt)(prompt);
368
- const { output, executor } = await this.taskExecutor.createTypeQueryExecution('Boolean', textPrompt, modelConfig, opt, multimodalPrompt);
369
- await this.afterTaskRunning(executor);
424
+ const { output } = await this.taskExecutor.createTypeQueryExecution('Boolean', textPrompt, modelConfig, opt, multimodalPrompt);
370
425
  return output;
371
426
  }
372
- async aiNumber(prompt, opt = defaultInsightExtractOption) {
373
- const modelConfig = this.modelConfigManager.getModelConfig('VQA');
427
+ async aiNumber(prompt, opt = defaultServiceExtractOption) {
428
+ const modelConfig = this.modelConfigManager.getModelConfig('insight');
374
429
  const { textPrompt, multimodalPrompt } = (0, external_utils_js_namespaceObject_1.parsePrompt)(prompt);
375
- const { output, executor } = await this.taskExecutor.createTypeQueryExecution('Number', textPrompt, modelConfig, opt, multimodalPrompt);
376
- await this.afterTaskRunning(executor);
430
+ const { output } = await this.taskExecutor.createTypeQueryExecution('Number', textPrompt, modelConfig, opt, multimodalPrompt);
377
431
  return output;
378
432
  }
379
- async aiString(prompt, opt = defaultInsightExtractOption) {
380
- const modelConfig = this.modelConfigManager.getModelConfig('VQA');
433
+ async aiString(prompt, opt = defaultServiceExtractOption) {
434
+ const modelConfig = this.modelConfigManager.getModelConfig('insight');
381
435
  const { textPrompt, multimodalPrompt } = (0, external_utils_js_namespaceObject_1.parsePrompt)(prompt);
382
- const { output, executor } = await this.taskExecutor.createTypeQueryExecution('String', textPrompt, modelConfig, opt, multimodalPrompt);
383
- await this.afterTaskRunning(executor);
436
+ const { output } = await this.taskExecutor.createTypeQueryExecution('String', textPrompt, modelConfig, opt, multimodalPrompt);
384
437
  return output;
385
438
  }
386
- async aiAsk(prompt, opt = defaultInsightExtractOption) {
439
+ async aiAsk(prompt, opt = defaultServiceExtractOption) {
387
440
  return this.aiString(prompt, opt);
388
441
  }
389
442
  async describeElementAtPoint(center, opt) {
@@ -391,13 +444,13 @@ class Agent {
391
444
  let success = false;
392
445
  let retryCount = 0;
393
446
  let resultPrompt = '';
394
- let deepThink = (null == opt ? void 0 : opt.deepThink) || false;
447
+ let deepThink = opt?.deepThink || false;
395
448
  let verifyResult;
396
449
  while(!success && retryCount < retryLimit){
397
450
  if (retryCount >= 2) deepThink = true;
398
451
  debug('aiDescribe', center, 'verifyPrompt', verifyPrompt, 'retryCount', retryCount, 'deepThink', deepThink);
399
- const modelConfig = this.modelConfigManager.getModelConfig('grounding');
400
- const text = await this.insight.describe(center, modelConfig, {
452
+ const modelConfig = this.modelConfigManager.getModelConfig('insight');
453
+ const text = await this.service.describe(center, modelConfig, {
401
454
  deepThink
402
455
  });
403
456
  debug('aiDescribe text', text);
@@ -420,7 +473,7 @@ class Agent {
420
473
  const { center: verifyCenter, rect: verifyRect } = await this.aiLocate(prompt, locateOpt);
421
474
  const distance = distanceOfTwoPoints(expectCenter, verifyCenter);
422
475
  const included = includedInRect(expectCenter, verifyRect);
423
- const pass = distance <= ((null == verifyLocateOption ? void 0 : verifyLocateOption.centerDistanceThreshold) || 20) || included;
476
+ const pass = distance <= (verifyLocateOption?.centerDistanceThreshold || 20) || included;
424
477
  const verifyResult = {
425
478
  pass,
426
479
  rect: verifyRect,
@@ -437,59 +490,67 @@ class Agent {
437
490
  const plans = [
438
491
  locatePlan
439
492
  ];
440
- const modelConfig = this.modelConfigManager.getModelConfig('grounding');
441
- const { executor, output } = await this.taskExecutor.runPlans((0, external_ui_utils_js_namespaceObject.taskTitleStr)('Locate', (0, external_ui_utils_js_namespaceObject.locateParamStr)(locateParam)), plans, modelConfig);
442
- await this.afterTaskRunning(executor);
493
+ const defaultIntentModelConfig = this.modelConfigManager.getModelConfig('default');
494
+ const modelConfigForPlanning = this.modelConfigManager.getModelConfig('planning');
495
+ const { output } = await this.taskExecutor.runPlans((0, external_ui_utils_js_namespaceObject.taskTitleStr)('Locate', (0, external_ui_utils_js_namespaceObject.locateParamStr)(locateParam)), plans, modelConfigForPlanning, defaultIntentModelConfig);
443
496
  const { element } = output;
444
497
  const dprValue = await this.interface.size().dpr;
445
498
  const dprEntry = dprValue ? {
446
499
  dpr: dprValue
447
500
  } : {};
448
501
  return {
449
- rect: null == element ? void 0 : element.rect,
450
- center: null == element ? void 0 : element.center,
502
+ rect: element?.rect,
503
+ center: element?.center,
451
504
  ...dprEntry
452
505
  };
453
506
  }
454
507
  async aiAssert(assertion, msg, opt) {
455
- var _executor_latestErrorTask;
456
- const modelConfig = this.modelConfigManager.getModelConfig('VQA');
457
- const insightOpt = {
458
- domIncluded: (null == opt ? void 0 : opt.domIncluded) ?? defaultInsightExtractOption.domIncluded,
459
- screenshotIncluded: (null == opt ? void 0 : opt.screenshotIncluded) ?? defaultInsightExtractOption.screenshotIncluded,
460
- doNotThrowError: null == opt ? void 0 : opt.doNotThrowError
508
+ const modelConfig = this.modelConfigManager.getModelConfig('insight');
509
+ const serviceOpt = {
510
+ domIncluded: opt?.domIncluded ?? defaultServiceExtractOption.domIncluded,
511
+ screenshotIncluded: opt?.screenshotIncluded ?? defaultServiceExtractOption.screenshotIncluded
461
512
  };
462
513
  const { textPrompt, multimodalPrompt } = (0, external_utils_js_namespaceObject_1.parsePrompt)(assertion);
463
- const { output, executor, thought } = await this.taskExecutor.createTypeQueryExecution('Assert', textPrompt, modelConfig, insightOpt, multimodalPrompt);
464
- await this.afterTaskRunning(executor, true);
465
- const message = output ? void 0 : `Assertion failed: ${msg || ('string' == typeof assertion ? assertion : assertion.prompt)}\nReason: ${thought || (null == (_executor_latestErrorTask = executor.latestErrorTask()) ? void 0 : _executor_latestErrorTask.error) || '(no_reason)'}`;
466
- if (null == opt ? void 0 : opt.keepRawResponse) return {
467
- pass: output,
468
- thought,
469
- message
470
- };
471
- if (!output) throw new Error(message);
514
+ const assertionText = 'string' == typeof assertion ? assertion : assertion.prompt;
515
+ try {
516
+ const { output, thought } = await this.taskExecutor.createTypeQueryExecution('Assert', textPrompt, modelConfig, serviceOpt, multimodalPrompt);
517
+ const pass = Boolean(output);
518
+ const message = pass ? void 0 : `Assertion failed: ${msg || assertionText}\nReason: ${thought || '(no_reason)'}`;
519
+ if (opt?.keepRawResponse) return {
520
+ pass,
521
+ thought,
522
+ message
523
+ };
524
+ if (!pass) throw new Error(message);
525
+ } catch (error) {
526
+ if (error instanceof external_tasks_js_namespaceObject.TaskExecutionError) {
527
+ const errorTask = error.errorTask;
528
+ const thought = errorTask?.thought;
529
+ const rawError = errorTask?.error;
530
+ const rawMessage = errorTask?.errorMessage || (rawError instanceof Error ? rawError.message : rawError ? String(rawError) : void 0);
531
+ const reason = thought || rawMessage || '(no_reason)';
532
+ const message = `Assertion failed: ${msg || assertionText}\nReason: ${reason}`;
533
+ if (opt?.keepRawResponse) return {
534
+ pass: false,
535
+ thought,
536
+ message
537
+ };
538
+ throw new Error(message, {
539
+ cause: rawError ?? error
540
+ });
541
+ }
542
+ throw error;
543
+ }
472
544
  }
473
545
  async aiWaitFor(assertion, opt) {
474
- const modelConfig = this.modelConfigManager.getModelConfig('VQA');
475
- const { executor } = await this.taskExecutor.waitFor(assertion, {
476
- timeoutMs: (null == opt ? void 0 : opt.timeoutMs) || 15000,
477
- checkIntervalMs: (null == opt ? void 0 : opt.checkIntervalMs) || 3000
546
+ const modelConfig = this.modelConfigManager.getModelConfig('insight');
547
+ await this.taskExecutor.waitFor(assertion, {
548
+ timeoutMs: opt?.timeoutMs || 15000,
549
+ checkIntervalMs: opt?.checkIntervalMs || 3000
478
550
  }, modelConfig);
479
- await this.afterTaskRunning(executor, true);
480
- if (executor.isInErrorState()) {
481
- const errorTask = executor.latestErrorTask();
482
- throw new Error(`${null == errorTask ? void 0 : errorTask.error}\n${null == errorTask ? void 0 : errorTask.errorStack}`);
483
- }
484
551
  }
485
- async ai(taskPrompt, type = 'action') {
486
- if ('action' === type) return this.aiAction(taskPrompt);
487
- if ('query' === type) return this.aiQuery(taskPrompt);
488
- if ('assert' === type) return this.aiAssert(taskPrompt);
489
- if ('tap' === type) return this.aiTap(taskPrompt);
490
- if ('rightClick' === type) return this.aiRightClick(taskPrompt);
491
- if ('doubleClick' === type) return this.aiDoubleClick(taskPrompt);
492
- throw new Error(`Unknown type: ${type}, only support 'action', 'query', 'assert', 'tap', 'rightClick', 'doubleClick'`);
552
+ async ai(...args) {
553
+ return this.aiAct(...args);
493
554
  }
494
555
  async runYaml(yamlScriptContent) {
495
556
  const script = (0, index_js_namespaceObject.parseYamlScript)(yamlScriptContent, 'yaml');
@@ -499,10 +560,7 @@ class Agent {
499
560
  }));
500
561
  await player.run();
501
562
  if ('error' === player.status) {
502
- const errors = player.taskStatusList.filter((task)=>'error' === task.status).map((task)=>{
503
- var _task_error;
504
- return `task - ${task.name}: ${null == (_task_error = task.error) ? void 0 : _task_error.message}`;
505
- }).join('\n');
563
+ const errors = player.taskStatusList.filter((task)=>'error' === task.status).map((task)=>`task - ${task.name}: ${task.error?.message}`).join('\n');
506
564
  throw new Error(`Error(s) occurred in running yaml script:\n${errors}`);
507
565
  }
508
566
  return {
@@ -513,14 +571,26 @@ class Agent {
513
571
  (0, utils_namespaceObject.assert)(this.interface.evaluateJavaScript, 'evaluateJavaScript is not supported in current agent');
514
572
  return this.interface.evaluateJavaScript(script);
515
573
  }
574
+ addDumpUpdateListener(listener) {
575
+ this.dumpUpdateListeners.push(listener);
576
+ return ()=>{
577
+ this.removeDumpUpdateListener(listener);
578
+ };
579
+ }
580
+ removeDumpUpdateListener(listener) {
581
+ const index = this.dumpUpdateListeners.indexOf(listener);
582
+ if (index > -1) this.dumpUpdateListeners.splice(index, 1);
583
+ }
584
+ clearDumpUpdateListeners() {
585
+ this.dumpUpdateListeners = [];
586
+ }
516
587
  async destroy() {
517
- var _this_interface_destroy, _this_interface;
518
588
  if (this.destroyed) return;
519
- await (null == (_this_interface_destroy = (_this_interface = this.interface).destroy) ? void 0 : _this_interface_destroy.call(_this_interface));
589
+ await this.interface.destroy?.();
520
590
  this.resetDump();
521
591
  this.destroyed = true;
522
592
  }
523
- async logScreenshot(title, opt) {
593
+ async recordToReport(title, opt) {
524
594
  const base64 = await this.interface.screenshotBase64();
525
595
  const now = Date.now();
526
596
  const recorder = [
@@ -541,48 +611,36 @@ class Agent {
541
611
  cost: 0
542
612
  },
543
613
  param: {
544
- content: (null == opt ? void 0 : opt.content) || ''
614
+ content: opt?.content || ''
545
615
  },
546
616
  executor: async ()=>{}
547
617
  };
548
618
  const executionDump = {
549
619
  logTime: now,
550
620
  name: `Log - ${title || 'untitled'}`,
551
- description: (null == opt ? void 0 : opt.content) || '',
621
+ description: opt?.content || '',
552
622
  tasks: [
553
623
  task
554
624
  ]
555
625
  };
556
- if (this.opts.aiActionContext) executionDump.aiActionContext = this.opts.aiActionContext;
557
626
  this.appendExecutionDump(executionDump);
558
- try {
559
- var _this_onDumpUpdate, _this;
560
- null == (_this_onDumpUpdate = (_this = this).onDumpUpdate) || _this_onDumpUpdate.call(_this, this.dumpDataString());
627
+ const dumpString = this.dumpDataString();
628
+ for (const listener of this.dumpUpdateListeners)try {
629
+ listener(dumpString);
561
630
  } catch (error) {
562
- console.error('Failed to update dump', error);
631
+ console.error('Error in onDumpUpdate listener', error);
563
632
  }
564
633
  this.writeOutActionDumps();
565
634
  }
635
+ async logScreenshot(title, opt) {
636
+ await this.recordToReport(title, opt);
637
+ }
566
638
  _unstableLogContent() {
567
639
  const { groupName, groupDescription, executions } = this.dump;
568
- const newExecutions = Array.isArray(executions) ? executions.map((execution)=>{
569
- const { tasks, ...restExecution } = execution;
570
- let newTasks = tasks;
571
- if (Array.isArray(tasks)) newTasks = tasks.map((task)=>{
572
- const { uiContext, log, ...restTask } = task;
573
- return restTask;
574
- });
575
- return {
576
- ...restExecution,
577
- ...newTasks ? {
578
- tasks: newTasks
579
- } : {}
580
- };
581
- }) : [];
582
640
  return {
583
641
  groupName,
584
642
  groupDescription,
585
- executions: newExecutions
643
+ executions: executions || []
586
644
  };
587
645
  }
588
646
  async freezePageContext() {
@@ -627,7 +685,7 @@ class Agent {
627
685
  }
628
686
  constructor(interfaceInstance, opts){
629
687
  _define_property(this, "interface", void 0);
630
- _define_property(this, "insight", void 0);
688
+ _define_property(this, "service", void 0);
631
689
  _define_property(this, "dump", void 0);
632
690
  _define_property(this, "reportFile", void 0);
633
691
  _define_property(this, "reportFileName", void 0);
@@ -636,45 +694,76 @@ class Agent {
636
694
  _define_property(this, "dryMode", false);
637
695
  _define_property(this, "onTaskStartTip", void 0);
638
696
  _define_property(this, "taskCache", void 0);
639
- _define_property(this, "onDumpUpdate", void 0);
697
+ _define_property(this, "dumpUpdateListeners", []);
640
698
  _define_property(this, "destroyed", false);
641
699
  _define_property(this, "modelConfigManager", void 0);
642
700
  _define_property(this, "frozenUIContext", void 0);
643
701
  _define_property(this, "hasWarnedNonVLModel", false);
644
702
  _define_property(this, "screenshotScale", void 0);
645
703
  _define_property(this, "screenshotScalePromise", void 0);
704
+ _define_property(this, "executionDumpIndexByRunner", new WeakMap());
646
705
  this.interface = interfaceInstance;
706
+ const envConfig = env_namespaceObject.globalConfigManager.getAllEnvConfig();
707
+ const envReplanningCycleLimitRaw = envConfig[env_namespaceObject.MIDSCENE_REPLANNING_CYCLE_LIMIT];
708
+ const envReplanningCycleLimit = void 0 !== envReplanningCycleLimitRaw ? Number(envReplanningCycleLimitRaw) : void 0;
647
709
  this.opts = Object.assign({
648
710
  generateReport: true,
649
711
  autoPrintReportMsg: true,
650
712
  groupName: 'Midscene Report',
651
713
  groupDescription: ''
652
- }, opts || {});
653
- if ((null == opts ? void 0 : opts.modelConfig) && 'function' != typeof (null == opts ? void 0 : opts.modelConfig)) throw new Error(`opts.modelConfig must be one of function or undefined, but got ${typeof (null == opts ? void 0 : opts.modelConfig)}`);
654
- this.modelConfigManager = (null == opts ? void 0 : opts.modelConfig) ? new env_namespaceObject.ModelConfigManager(opts.modelConfig) : env_namespaceObject.globalModelConfigManager;
714
+ }, opts || {}, opts?.replanningCycleLimit !== void 0 || void 0 === envReplanningCycleLimit || Number.isNaN(envReplanningCycleLimit) ? {} : {
715
+ replanningCycleLimit: envReplanningCycleLimit
716
+ });
717
+ const resolvedAiActContext = this.opts.aiActContext ?? this.opts.aiActionContext;
718
+ if (void 0 !== resolvedAiActContext) {
719
+ this.opts.aiActContext = resolvedAiActContext;
720
+ this.opts.aiActionContext ??= resolvedAiActContext;
721
+ }
722
+ if (opts?.modelConfig && ('object' != typeof opts?.modelConfig || Array.isArray(opts.modelConfig))) throw new Error(`opts.modelConfig must be a plain object map of env keys to values, but got ${typeof opts?.modelConfig}`);
723
+ const hasCustomConfig = opts?.modelConfig || opts?.createOpenAIClient;
724
+ this.modelConfigManager = hasCustomConfig ? new env_namespaceObject.ModelConfigManager(opts?.modelConfig, opts?.createOpenAIClient) : env_namespaceObject.globalModelConfigManager;
655
725
  this.onTaskStartTip = this.opts.onTaskStartTip;
656
- this.insight = new external_index_js_namespaceObject.Insight(async (action)=>this.getUIContext(action));
726
+ this.service = new external_index_js_namespaceObject.Service(async ()=>this.getUIContext());
657
727
  const cacheConfigObj = this.processCacheConfig(opts || {});
658
728
  if (cacheConfigObj) this.taskCache = new external_task_cache_js_namespaceObject.TaskCache(cacheConfigObj.id, cacheConfigObj.enabled, void 0, {
659
729
  readOnly: cacheConfigObj.readOnly,
660
730
  writeOnly: cacheConfigObj.writeOnly
661
731
  });
662
- this.taskExecutor = new external_tasks_js_namespaceObject.TaskExecutor(this.interface, this.insight, {
732
+ const baseActionSpace = this.interface.actionSpace();
733
+ const fullActionSpace = [
734
+ ...baseActionSpace,
735
+ (0, external_device_index_js_namespaceObject.defineActionAssert)()
736
+ ];
737
+ this.taskExecutor = new external_tasks_js_namespaceObject.TaskExecutor(this.interface, this.service, {
663
738
  taskCache: this.taskCache,
664
739
  onTaskStart: this.callbackOnTaskStartTip.bind(this),
665
- replanningCycleLimit: this.opts.replanningCycleLimit
740
+ replanningCycleLimit: this.opts.replanningCycleLimit,
741
+ actionSpace: fullActionSpace,
742
+ hooks: {
743
+ onTaskUpdate: (runner)=>{
744
+ const executionDump = runner.dump();
745
+ this.appendExecutionDump(executionDump, runner);
746
+ const dumpString = this.dumpDataString();
747
+ for (const listener of this.dumpUpdateListeners)try {
748
+ listener(dumpString, executionDump);
749
+ } catch (error) {
750
+ console.error('Error in onDumpUpdate listener', error);
751
+ }
752
+ this.writeOutActionDumps();
753
+ }
754
+ }
666
755
  });
667
756
  this.dump = this.resetDump();
668
- this.reportFileName = (null == opts ? void 0 : opts.reportFileName) || (0, external_utils_js_namespaceObject_1.getReportFileName)((null == opts ? void 0 : opts.testId) || this.interface.interfaceType || 'web');
757
+ this.reportFileName = opts?.reportFileName || (0, external_utils_js_namespaceObject_1.getReportFileName)(opts?.testId || this.interface.interfaceType || 'web');
669
758
  }
670
759
  }
671
760
  const createAgent = (interfaceInstance, opts)=>new Agent(interfaceInstance, opts);
672
761
  exports.Agent = __webpack_exports__.Agent;
673
762
  exports.createAgent = __webpack_exports__.createAgent;
674
- for(var __webpack_i__ in __webpack_exports__)if (-1 === [
763
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
675
764
  "Agent",
676
765
  "createAgent"
677
- ].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
766
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
678
767
  Object.defineProperty(exports, '__esModule', {
679
768
  value: true
680
769
  });