@midscene/core 0.30.9 → 0.30.11-beta-20251218071621.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 +63 -17
  162. package/dist/types/agent/execution-session.d.ts +36 -0
  163. package/dist/types/agent/index.d.ts +2 -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 +6 -5
  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
@@ -1,15 +1,16 @@
1
- import { Insight } from "../index.mjs";
1
+ import { Service } from "../index.mjs";
2
2
  import js_yaml from "js-yaml";
3
3
  import { getVersion, groupedActionDumpFileExt, processCacheConfig, reportHTMLContent, stringifyDumpData, writeLogFile } from "../utils.mjs";
4
4
  import { ScriptPlayer, buildDetailedLocateParam, parseYamlScript } from "../yaml/index.mjs";
5
- import { ModelConfigManager, globalModelConfigManager } from "@midscene/shared/env";
5
+ import { MIDSCENE_REPLANNING_CYCLE_LIMIT, ModelConfigManager, globalConfigManager, globalModelConfigManager } from "@midscene/shared/env";
6
6
  import { imageInfoOfBase64, resizeImgBase64 } from "@midscene/shared/img";
7
7
  import { getDebug } from "@midscene/shared/logger";
8
8
  import { assert } from "@midscene/shared/utils";
9
+ import { defineActionAssert } from "../device/index.mjs";
9
10
  import { TaskCache } from "./task-cache.mjs";
10
- import { TaskExecutor, locatePlanForLocate } from "./tasks.mjs";
11
+ import { TaskExecutionError, TaskExecutor, locatePlanForLocate } from "./tasks.mjs";
11
12
  import { locateParamStr, paramStr, taskTitleStr, typeStr } from "./ui-utils.mjs";
12
- import { commonContextParser, getReportFileName, parsePrompt, printReportMsg, trimContextByViewport } from "./utils.mjs";
13
+ import { commonContextParser, getReportFileName, parsePrompt, printReportMsg } from "./utils.mjs";
13
14
  function _define_property(obj, key, value) {
14
15
  if (key in obj) Object.defineProperty(obj, key, {
15
16
  value: value,
@@ -31,7 +32,7 @@ const includedInRect = (point, rect)=>{
31
32
  const { left, top, width, height } = rect;
32
33
  return x >= left && x <= left + width && y >= top && y <= top + height;
33
34
  };
34
- const defaultInsightExtractOption = {
35
+ const defaultServiceExtractOption = {
35
36
  domIncluded: false,
36
37
  screenshotIncluded: true
37
38
  };
@@ -42,7 +43,31 @@ const CACHE_STRATEGIES = [
42
43
  ];
43
44
  const isValidCacheStrategy = (strategy)=>CACHE_STRATEGIES.some((value)=>value === strategy);
44
45
  const CACHE_STRATEGY_VALUES = CACHE_STRATEGIES.map((value)=>`"${value}"`).join(', ');
46
+ const legacyScrollTypeMap = {
47
+ once: 'singleAction',
48
+ untilBottom: 'scrollToBottom',
49
+ untilTop: 'scrollToTop',
50
+ untilRight: 'scrollToRight',
51
+ untilLeft: 'scrollToLeft'
52
+ };
53
+ const normalizeScrollType = (scrollType)=>{
54
+ if (!scrollType) return scrollType;
55
+ if (scrollType in legacyScrollTypeMap) return legacyScrollTypeMap[scrollType];
56
+ return scrollType;
57
+ };
58
+ const defaultReplanningCycleLimit = 20;
59
+ const defaultVlmUiTarsReplanningCycleLimit = 40;
45
60
  class Agent {
61
+ get onDumpUpdate() {
62
+ return this.dumpUpdateListeners[0];
63
+ }
64
+ set onDumpUpdate(callback) {
65
+ this.dumpUpdateListeners = [];
66
+ if (callback) this.dumpUpdateListeners.push(callback);
67
+ }
68
+ get aiActContext() {
69
+ return this.opts.aiActContext ?? this.opts.aiActionContext;
70
+ }
46
71
  get page() {
47
72
  return this.interface;
48
73
  }
@@ -55,10 +80,11 @@ class Agent {
55
80
  async getScreenshotScale(context) {
56
81
  if (void 0 !== this.screenshotScale) return this.screenshotScale;
57
82
  if (!this.screenshotScalePromise) this.screenshotScalePromise = (async ()=>{
58
- var _context_size;
59
- const pageWidth = null == (_context_size = context.size) ? void 0 : _context_size.width;
83
+ const pageWidth = context.size?.width;
60
84
  assert(pageWidth && pageWidth > 0, `Invalid page width when computing screenshot scale: ${pageWidth}`);
85
+ debug('will get image info of base64');
61
86
  const { width: screenshotWidth } = await imageInfoOfBase64(context.screenshotBase64);
87
+ debug('image info of base64 done');
62
88
  assert(Number.isFinite(screenshotWidth) && screenshotWidth > 0, `Invalid screenshot width when computing screenshot scale: ${screenshotWidth}`);
63
89
  const computedScale = screenshotWidth / pageWidth;
64
90
  assert(Number.isFinite(computedScale) && computedScale > 0, `Invalid computed screenshot scale: ${computedScale}`);
@@ -72,8 +98,16 @@ class Agent {
72
98
  this.screenshotScalePromise = void 0;
73
99
  }
74
100
  }
101
+ resolveReplanningCycleLimit(modelConfigForPlanning) {
102
+ if (void 0 !== this.opts.replanningCycleLimit) return this.opts.replanningCycleLimit;
103
+ return 'vlm-ui-tars' === modelConfigForPlanning.vlMode ? defaultVlmUiTarsReplanningCycleLimit : defaultReplanningCycleLimit;
104
+ }
75
105
  async getActionSpace() {
76
- return this.interface.actionSpace();
106
+ const commonAssertionAction = defineActionAssert();
107
+ return [
108
+ ...this.interface.actionSpace(),
109
+ commonAssertionAction
110
+ ];
77
111
  }
78
112
  async getUIContext(action) {
79
113
  this.ensureVLModelWarning();
@@ -86,12 +120,14 @@ class Agent {
86
120
  debug('Using page.getContext for action:', action);
87
121
  context = await this.interface.getContext();
88
122
  } else {
89
- debug('Using commonContextParser for action:', action);
123
+ debug('Using commonContextParser');
90
124
  context = await commonContextParser(this.interface, {
91
125
  uploadServerUrl: this.modelConfigManager.getUploadTestServerUrl()
92
126
  });
93
127
  }
128
+ debug('will get screenshot scale');
94
129
  const computedScreenshotScale = await this.getScreenshotScale(context);
130
+ debug('computedScreenshotScale', computedScreenshotScale);
95
131
  if (1 !== computedScreenshotScale) {
96
132
  const scaleForLog = Number.parseFloat(computedScreenshotScale.toFixed(4));
97
133
  debug(`Applying computed screenshot scale: ${scaleForLog} (resize to logical size)`);
@@ -109,7 +145,11 @@ class Agent {
109
145
  return await this.getUIContext('locate');
110
146
  }
111
147
  async setAIActionContext(prompt) {
112
- if (this.opts.aiActionContext) console.warn('aiActionContext is already set, and it is called again, will override the previous setting');
148
+ await this.setAIActContext(prompt);
149
+ }
150
+ async setAIActContext(prompt) {
151
+ if (this.aiActContext) console.warn('aiActContext is already set, and it is called again, will override the previous setting');
152
+ this.opts.aiActContext = prompt;
113
153
  this.opts.aiActionContext = prompt;
114
154
  }
115
155
  resetDump() {
@@ -120,12 +160,22 @@ class Agent {
120
160
  executions: [],
121
161
  modelBriefs: []
122
162
  };
163
+ this.executionDumpIndexByRunner = new WeakMap();
123
164
  return this.dump;
124
165
  }
125
- appendExecutionDump(execution) {
126
- const trimmedExecution = trimContextByViewport(execution);
166
+ appendExecutionDump(execution, runner) {
127
167
  const currentDump = this.dump;
128
- currentDump.executions.push(trimmedExecution);
168
+ if (runner) {
169
+ const existingIndex = this.executionDumpIndexByRunner.get(runner);
170
+ if (void 0 !== existingIndex) {
171
+ currentDump.executions[existingIndex] = execution;
172
+ return;
173
+ }
174
+ currentDump.executions.push(execution);
175
+ this.executionDumpIndexByRunner.set(runner, currentDump.executions.length - 1);
176
+ return;
177
+ }
178
+ currentDump.executions.push(execution);
129
179
  }
130
180
  dumpDataString() {
131
181
  this.dump.groupName = this.opts.groupName;
@@ -153,22 +203,8 @@ class Agent {
153
203
  const tip = param ? `${typeStr(task)} - ${param}` : typeStr(task);
154
204
  if (this.onTaskStartTip) await this.onTaskStartTip(tip);
155
205
  }
156
- async afterTaskRunning(executor, doNotThrowError = false) {
157
- const executionDump = executor.dump();
158
- if (this.opts.aiActionContext) executionDump.aiActionContext = this.opts.aiActionContext;
159
- this.appendExecutionDump(executionDump);
160
- try {
161
- if (this.onDumpUpdate) this.onDumpUpdate(this.dumpDataString());
162
- } catch (error) {
163
- console.error('Error in onDumpUpdate', error);
164
- }
165
- this.writeOutActionDumps();
166
- if (executor.isInErrorState() && !doNotThrowError) {
167
- const errorTask = executor.latestErrorTask();
168
- throw new Error(`${null == errorTask ? void 0 : errorTask.errorMessage}\n${null == errorTask ? void 0 : errorTask.errorStack}`, {
169
- cause: null == errorTask ? void 0 : errorTask.error
170
- });
171
- }
206
+ wrapActionInActionSpace(name) {
207
+ return async (param)=>await this.callActionInActionSpace(name, param);
172
208
  }
173
209
  async callActionInActionSpace(type, opt) {
174
210
  debug('callActionInActionSpace', type, ',', opt);
@@ -181,10 +217,10 @@ class Agent {
181
217
  const plans = [
182
218
  actionPlan
183
219
  ].filter(Boolean);
184
- const title = taskTitleStr(type, locateParamStr((null == opt ? void 0 : opt.locate) || {}));
185
- const modelConfig = this.modelConfigManager.getModelConfig('grounding');
186
- const { output, executor } = await this.taskExecutor.runPlans(title, plans, modelConfig);
187
- await this.afterTaskRunning(executor);
220
+ const title = taskTitleStr(type, locateParamStr(opt?.locate || {}));
221
+ const defaultIntentModelConfig = this.modelConfigManager.getModelConfig('default');
222
+ const modelConfigForPlanning = this.modelConfigManager.getModelConfig('planning');
223
+ const { output } = await this.taskExecutor.runPlans(title, plans, modelConfigForPlanning, defaultIntentModelConfig);
188
224
  return output;
189
225
  }
190
226
  async aiTap(locatePrompt, opt) {
@@ -235,8 +271,10 @@ class Agent {
235
271
  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');
236
272
  assert(locatePrompt, 'missing locate prompt for input');
237
273
  const detailedLocateParam = buildDetailedLocateParam(locatePrompt, opt);
274
+ const stringValue = 'number' == typeof value ? String(value) : value;
238
275
  return this.callActionInActionSpace('Input', {
239
276
  ...opt || {},
277
+ value: stringValue,
240
278
  locate: detailedLocateParam
241
279
  });
242
280
  }
@@ -255,7 +293,7 @@ class Agent {
255
293
  keyName
256
294
  };
257
295
  }
258
- assert(null == opt ? void 0 : opt.keyName, 'missing keyName for keyboard press');
296
+ assert(opt?.keyName, 'missing keyName for keyboard press');
259
297
  const detailedLocateParam = locatePrompt ? buildDetailedLocateParam(locatePrompt, opt) : void 0;
260
298
  return this.callActionInActionSpace('KeyboardPress', {
261
299
  ...opt || {},
@@ -277,28 +315,45 @@ class Agent {
277
315
  ...scrollParam || {}
278
316
  };
279
317
  }
318
+ if (opt) {
319
+ const normalizedScrollType = normalizeScrollType(opt.scrollType);
320
+ if (normalizedScrollType !== opt.scrollType) opt = {
321
+ ...opt || {},
322
+ scrollType: normalizedScrollType
323
+ };
324
+ }
280
325
  const detailedLocateParam = buildDetailedLocateParam(locatePrompt || '', opt);
281
326
  return this.callActionInActionSpace('Scroll', {
282
327
  ...opt || {},
283
328
  locate: detailedLocateParam
284
329
  });
285
330
  }
286
- async aiAction(taskPrompt, opt) {
287
- var _this_taskCache, _this_taskCache1;
288
- const modelConfig = this.modelConfigManager.getModelConfig('planning');
289
- const cacheable = null == opt ? void 0 : opt.cacheable;
290
- const isVlmUiTars = 'vlm-ui-tars' === modelConfig.vlMode;
291
- const matchedCache = isVlmUiTars || false === cacheable ? void 0 : null == (_this_taskCache = this.taskCache) ? void 0 : _this_taskCache.matchPlanCache(taskPrompt);
292
- if (matchedCache && (null == (_this_taskCache1 = this.taskCache) ? void 0 : _this_taskCache1.isCacheResultUsed)) {
293
- var _matchedCache_cacheContent, _matchedCache_cacheContent1;
294
- const { executor } = await this.taskExecutor.loadYamlFlowAsPlanning(taskPrompt, null == (_matchedCache_cacheContent = matchedCache.cacheContent) ? void 0 : _matchedCache_cacheContent.yamlWorkflow);
295
- await this.afterTaskRunning(executor);
331
+ async aiAct(taskPrompt, opt) {
332
+ const modelConfigForPlanning = this.modelConfigManager.getModelConfig('planning');
333
+ const defaultIntentModelConfig = this.modelConfigManager.getModelConfig('default');
334
+ let planningStrategyToUse = opt?.planningStrategy || 'standard';
335
+ if (this.aiActContext && 'fast' === planningStrategyToUse) console.warn('using fast planning strategy with aiActContext is not recommended');
336
+ if (this.opts?._deepThink) {
337
+ debug('using deep think planning strategy');
338
+ planningStrategyToUse = 'max';
339
+ }
340
+ const includeBboxInPlanning = modelConfigForPlanning.modelName === defaultIntentModelConfig.modelName && 'fast' === planningStrategyToUse;
341
+ debug('setting includeBboxInPlanning to', includeBboxInPlanning);
342
+ const cacheable = opt?.cacheable;
343
+ const replanningCycleLimit = this.resolveReplanningCycleLimit(modelConfigForPlanning);
344
+ const isVlmUiTars = 'vlm-ui-tars' === modelConfigForPlanning.vlMode;
345
+ const matchedCache = isVlmUiTars || false === cacheable ? void 0 : this.taskCache?.matchPlanCache(taskPrompt);
346
+ if (matchedCache && this.taskCache?.isCacheResultUsed && matchedCache.cacheContent?.yamlWorkflow?.trim()) {
347
+ await this.taskExecutor.loadYamlFlowAsPlanning(taskPrompt, matchedCache.cacheContent.yamlWorkflow);
296
348
  debug('matched cache, will call .runYaml to run the action');
297
- const yaml = null == (_matchedCache_cacheContent1 = matchedCache.cacheContent) ? void 0 : _matchedCache_cacheContent1.yamlWorkflow;
349
+ const yaml = matchedCache.cacheContent.yamlWorkflow;
298
350
  return this.runYaml(yaml);
299
351
  }
300
- const { output, executor } = await this.taskExecutor.action(taskPrompt, modelConfig, this.opts.aiActionContext, cacheable);
301
- if (this.taskCache && (null == output ? void 0 : output.yamlFlow) && false !== cacheable) {
352
+ let imagesIncludeCount = 1;
353
+ if ('standard' === planningStrategyToUse) imagesIncludeCount = 2;
354
+ else if ('max' === planningStrategyToUse) imagesIncludeCount = void 0;
355
+ const { output } = await this.taskExecutor.action(taskPrompt, modelConfigForPlanning, defaultIntentModelConfig, includeBboxInPlanning, this.aiActContext, cacheable, replanningCycleLimit, imagesIncludeCount);
356
+ if (this.taskCache && output?.yamlFlow && false !== cacheable) {
302
357
  const yamlContent = {
303
358
  tasks: [
304
359
  {
@@ -314,37 +369,35 @@ class Agent {
314
369
  yamlWorkflow: yamlFlowStr
315
370
  }, matchedCache);
316
371
  }
317
- await this.afterTaskRunning(executor);
318
372
  return output;
319
373
  }
320
- async aiQuery(demand, opt = defaultInsightExtractOption) {
321
- const modelConfig = this.modelConfigManager.getModelConfig('VQA');
322
- const { output, executor } = await this.taskExecutor.createTypeQueryExecution('Query', demand, modelConfig, opt);
323
- await this.afterTaskRunning(executor);
374
+ async aiAction(taskPrompt, opt) {
375
+ return this.aiAct(taskPrompt, opt);
376
+ }
377
+ async aiQuery(demand, opt = defaultServiceExtractOption) {
378
+ const modelConfig = this.modelConfigManager.getModelConfig('insight');
379
+ const { output } = await this.taskExecutor.createTypeQueryExecution('Query', demand, modelConfig, opt);
324
380
  return output;
325
381
  }
326
- async aiBoolean(prompt, opt = defaultInsightExtractOption) {
327
- const modelConfig = this.modelConfigManager.getModelConfig('VQA');
382
+ async aiBoolean(prompt, opt = defaultServiceExtractOption) {
383
+ const modelConfig = this.modelConfigManager.getModelConfig('insight');
328
384
  const { textPrompt, multimodalPrompt } = parsePrompt(prompt);
329
- const { output, executor } = await this.taskExecutor.createTypeQueryExecution('Boolean', textPrompt, modelConfig, opt, multimodalPrompt);
330
- await this.afterTaskRunning(executor);
385
+ const { output } = await this.taskExecutor.createTypeQueryExecution('Boolean', textPrompt, modelConfig, opt, multimodalPrompt);
331
386
  return output;
332
387
  }
333
- async aiNumber(prompt, opt = defaultInsightExtractOption) {
334
- const modelConfig = this.modelConfigManager.getModelConfig('VQA');
388
+ async aiNumber(prompt, opt = defaultServiceExtractOption) {
389
+ const modelConfig = this.modelConfigManager.getModelConfig('insight');
335
390
  const { textPrompt, multimodalPrompt } = parsePrompt(prompt);
336
- const { output, executor } = await this.taskExecutor.createTypeQueryExecution('Number', textPrompt, modelConfig, opt, multimodalPrompt);
337
- await this.afterTaskRunning(executor);
391
+ const { output } = await this.taskExecutor.createTypeQueryExecution('Number', textPrompt, modelConfig, opt, multimodalPrompt);
338
392
  return output;
339
393
  }
340
- async aiString(prompt, opt = defaultInsightExtractOption) {
341
- const modelConfig = this.modelConfigManager.getModelConfig('VQA');
394
+ async aiString(prompt, opt = defaultServiceExtractOption) {
395
+ const modelConfig = this.modelConfigManager.getModelConfig('insight');
342
396
  const { textPrompt, multimodalPrompt } = parsePrompt(prompt);
343
- const { output, executor } = await this.taskExecutor.createTypeQueryExecution('String', textPrompt, modelConfig, opt, multimodalPrompt);
344
- await this.afterTaskRunning(executor);
397
+ const { output } = await this.taskExecutor.createTypeQueryExecution('String', textPrompt, modelConfig, opt, multimodalPrompt);
345
398
  return output;
346
399
  }
347
- async aiAsk(prompt, opt = defaultInsightExtractOption) {
400
+ async aiAsk(prompt, opt = defaultServiceExtractOption) {
348
401
  return this.aiString(prompt, opt);
349
402
  }
350
403
  async describeElementAtPoint(center, opt) {
@@ -352,13 +405,13 @@ class Agent {
352
405
  let success = false;
353
406
  let retryCount = 0;
354
407
  let resultPrompt = '';
355
- let deepThink = (null == opt ? void 0 : opt.deepThink) || false;
408
+ let deepThink = opt?.deepThink || false;
356
409
  let verifyResult;
357
410
  while(!success && retryCount < retryLimit){
358
411
  if (retryCount >= 2) deepThink = true;
359
412
  debug('aiDescribe', center, 'verifyPrompt', verifyPrompt, 'retryCount', retryCount, 'deepThink', deepThink);
360
- const modelConfig = this.modelConfigManager.getModelConfig('grounding');
361
- const text = await this.insight.describe(center, modelConfig, {
413
+ const modelConfig = this.modelConfigManager.getModelConfig('insight');
414
+ const text = await this.service.describe(center, modelConfig, {
362
415
  deepThink
363
416
  });
364
417
  debug('aiDescribe text', text);
@@ -381,7 +434,7 @@ class Agent {
381
434
  const { center: verifyCenter, rect: verifyRect } = await this.aiLocate(prompt, locateOpt);
382
435
  const distance = distanceOfTwoPoints(expectCenter, verifyCenter);
383
436
  const included = includedInRect(expectCenter, verifyRect);
384
- const pass = distance <= ((null == verifyLocateOption ? void 0 : verifyLocateOption.centerDistanceThreshold) || 20) || included;
437
+ const pass = distance <= (verifyLocateOption?.centerDistanceThreshold || 20) || included;
385
438
  const verifyResult = {
386
439
  pass,
387
440
  rect: verifyRect,
@@ -398,59 +451,67 @@ class Agent {
398
451
  const plans = [
399
452
  locatePlan
400
453
  ];
401
- const modelConfig = this.modelConfigManager.getModelConfig('grounding');
402
- const { executor, output } = await this.taskExecutor.runPlans(taskTitleStr('Locate', locateParamStr(locateParam)), plans, modelConfig);
403
- await this.afterTaskRunning(executor);
454
+ const defaultIntentModelConfig = this.modelConfigManager.getModelConfig('default');
455
+ const modelConfigForPlanning = this.modelConfigManager.getModelConfig('planning');
456
+ const { output } = await this.taskExecutor.runPlans(taskTitleStr('Locate', locateParamStr(locateParam)), plans, modelConfigForPlanning, defaultIntentModelConfig);
404
457
  const { element } = output;
405
458
  const dprValue = await this.interface.size().dpr;
406
459
  const dprEntry = dprValue ? {
407
460
  dpr: dprValue
408
461
  } : {};
409
462
  return {
410
- rect: null == element ? void 0 : element.rect,
411
- center: null == element ? void 0 : element.center,
463
+ rect: element?.rect,
464
+ center: element?.center,
412
465
  ...dprEntry
413
466
  };
414
467
  }
415
468
  async aiAssert(assertion, msg, opt) {
416
- var _executor_latestErrorTask;
417
- const modelConfig = this.modelConfigManager.getModelConfig('VQA');
418
- const insightOpt = {
419
- domIncluded: (null == opt ? void 0 : opt.domIncluded) ?? defaultInsightExtractOption.domIncluded,
420
- screenshotIncluded: (null == opt ? void 0 : opt.screenshotIncluded) ?? defaultInsightExtractOption.screenshotIncluded,
421
- doNotThrowError: null == opt ? void 0 : opt.doNotThrowError
469
+ const modelConfig = this.modelConfigManager.getModelConfig('insight');
470
+ const serviceOpt = {
471
+ domIncluded: opt?.domIncluded ?? defaultServiceExtractOption.domIncluded,
472
+ screenshotIncluded: opt?.screenshotIncluded ?? defaultServiceExtractOption.screenshotIncluded
422
473
  };
423
474
  const { textPrompt, multimodalPrompt } = parsePrompt(assertion);
424
- const { output, executor, thought } = await this.taskExecutor.createTypeQueryExecution('Assert', textPrompt, modelConfig, insightOpt, multimodalPrompt);
425
- await this.afterTaskRunning(executor, true);
426
- 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)'}`;
427
- if (null == opt ? void 0 : opt.keepRawResponse) return {
428
- pass: output,
429
- thought,
430
- message
431
- };
432
- if (!output) throw new Error(message);
475
+ const assertionText = 'string' == typeof assertion ? assertion : assertion.prompt;
476
+ try {
477
+ const { output, thought } = await this.taskExecutor.createTypeQueryExecution('Assert', textPrompt, modelConfig, serviceOpt, multimodalPrompt);
478
+ const pass = Boolean(output);
479
+ const message = pass ? void 0 : `Assertion failed: ${msg || assertionText}\nReason: ${thought || '(no_reason)'}`;
480
+ if (opt?.keepRawResponse) return {
481
+ pass,
482
+ thought,
483
+ message
484
+ };
485
+ if (!pass) throw new Error(message);
486
+ } catch (error) {
487
+ if (error instanceof TaskExecutionError) {
488
+ const errorTask = error.errorTask;
489
+ const thought = errorTask?.thought;
490
+ const rawError = errorTask?.error;
491
+ const rawMessage = errorTask?.errorMessage || (rawError instanceof Error ? rawError.message : rawError ? String(rawError) : void 0);
492
+ const reason = thought || rawMessage || '(no_reason)';
493
+ const message = `Assertion failed: ${msg || assertionText}\nReason: ${reason}`;
494
+ if (opt?.keepRawResponse) return {
495
+ pass: false,
496
+ thought,
497
+ message
498
+ };
499
+ throw new Error(message, {
500
+ cause: rawError ?? error
501
+ });
502
+ }
503
+ throw error;
504
+ }
433
505
  }
434
506
  async aiWaitFor(assertion, opt) {
435
- const modelConfig = this.modelConfigManager.getModelConfig('VQA');
436
- const { executor } = await this.taskExecutor.waitFor(assertion, {
437
- timeoutMs: (null == opt ? void 0 : opt.timeoutMs) || 15000,
438
- checkIntervalMs: (null == opt ? void 0 : opt.checkIntervalMs) || 3000
507
+ const modelConfig = this.modelConfigManager.getModelConfig('insight');
508
+ await this.taskExecutor.waitFor(assertion, {
509
+ timeoutMs: opt?.timeoutMs || 15000,
510
+ checkIntervalMs: opt?.checkIntervalMs || 3000
439
511
  }, modelConfig);
440
- await this.afterTaskRunning(executor, true);
441
- if (executor.isInErrorState()) {
442
- const errorTask = executor.latestErrorTask();
443
- throw new Error(`${null == errorTask ? void 0 : errorTask.error}\n${null == errorTask ? void 0 : errorTask.errorStack}`);
444
- }
445
512
  }
446
- async ai(taskPrompt, type = 'action') {
447
- if ('action' === type) return this.aiAction(taskPrompt);
448
- if ('query' === type) return this.aiQuery(taskPrompt);
449
- if ('assert' === type) return this.aiAssert(taskPrompt);
450
- if ('tap' === type) return this.aiTap(taskPrompt);
451
- if ('rightClick' === type) return this.aiRightClick(taskPrompt);
452
- if ('doubleClick' === type) return this.aiDoubleClick(taskPrompt);
453
- throw new Error(`Unknown type: ${type}, only support 'action', 'query', 'assert', 'tap', 'rightClick', 'doubleClick'`);
513
+ async ai(...args) {
514
+ return this.aiAct(...args);
454
515
  }
455
516
  async runYaml(yamlScriptContent) {
456
517
  const script = parseYamlScript(yamlScriptContent, 'yaml');
@@ -460,10 +521,7 @@ class Agent {
460
521
  }));
461
522
  await player.run();
462
523
  if ('error' === player.status) {
463
- const errors = player.taskStatusList.filter((task)=>'error' === task.status).map((task)=>{
464
- var _task_error;
465
- return `task - ${task.name}: ${null == (_task_error = task.error) ? void 0 : _task_error.message}`;
466
- }).join('\n');
524
+ const errors = player.taskStatusList.filter((task)=>'error' === task.status).map((task)=>`task - ${task.name}: ${task.error?.message}`).join('\n');
467
525
  throw new Error(`Error(s) occurred in running yaml script:\n${errors}`);
468
526
  }
469
527
  return {
@@ -474,14 +532,26 @@ class Agent {
474
532
  assert(this.interface.evaluateJavaScript, 'evaluateJavaScript is not supported in current agent');
475
533
  return this.interface.evaluateJavaScript(script);
476
534
  }
535
+ addDumpUpdateListener(listener) {
536
+ this.dumpUpdateListeners.push(listener);
537
+ return ()=>{
538
+ this.removeDumpUpdateListener(listener);
539
+ };
540
+ }
541
+ removeDumpUpdateListener(listener) {
542
+ const index = this.dumpUpdateListeners.indexOf(listener);
543
+ if (index > -1) this.dumpUpdateListeners.splice(index, 1);
544
+ }
545
+ clearDumpUpdateListeners() {
546
+ this.dumpUpdateListeners = [];
547
+ }
477
548
  async destroy() {
478
- var _this_interface_destroy, _this_interface;
479
549
  if (this.destroyed) return;
480
- await (null == (_this_interface_destroy = (_this_interface = this.interface).destroy) ? void 0 : _this_interface_destroy.call(_this_interface));
550
+ await this.interface.destroy?.();
481
551
  this.resetDump();
482
552
  this.destroyed = true;
483
553
  }
484
- async logScreenshot(title, opt) {
554
+ async recordToReport(title, opt) {
485
555
  const base64 = await this.interface.screenshotBase64();
486
556
  const now = Date.now();
487
557
  const recorder = [
@@ -502,48 +572,36 @@ class Agent {
502
572
  cost: 0
503
573
  },
504
574
  param: {
505
- content: (null == opt ? void 0 : opt.content) || ''
575
+ content: opt?.content || ''
506
576
  },
507
577
  executor: async ()=>{}
508
578
  };
509
579
  const executionDump = {
510
580
  logTime: now,
511
581
  name: `Log - ${title || 'untitled'}`,
512
- description: (null == opt ? void 0 : opt.content) || '',
582
+ description: opt?.content || '',
513
583
  tasks: [
514
584
  task
515
585
  ]
516
586
  };
517
- if (this.opts.aiActionContext) executionDump.aiActionContext = this.opts.aiActionContext;
518
587
  this.appendExecutionDump(executionDump);
519
- try {
520
- var _this_onDumpUpdate, _this;
521
- null == (_this_onDumpUpdate = (_this = this).onDumpUpdate) || _this_onDumpUpdate.call(_this, this.dumpDataString());
588
+ const dumpString = this.dumpDataString();
589
+ for (const listener of this.dumpUpdateListeners)try {
590
+ listener(dumpString);
522
591
  } catch (error) {
523
- console.error('Failed to update dump', error);
592
+ console.error('Error in onDumpUpdate listener', error);
524
593
  }
525
594
  this.writeOutActionDumps();
526
595
  }
596
+ async logScreenshot(title, opt) {
597
+ await this.recordToReport(title, opt);
598
+ }
527
599
  _unstableLogContent() {
528
600
  const { groupName, groupDescription, executions } = this.dump;
529
- const newExecutions = Array.isArray(executions) ? executions.map((execution)=>{
530
- const { tasks, ...restExecution } = execution;
531
- let newTasks = tasks;
532
- if (Array.isArray(tasks)) newTasks = tasks.map((task)=>{
533
- const { uiContext, log, ...restTask } = task;
534
- return restTask;
535
- });
536
- return {
537
- ...restExecution,
538
- ...newTasks ? {
539
- tasks: newTasks
540
- } : {}
541
- };
542
- }) : [];
543
601
  return {
544
602
  groupName,
545
603
  groupDescription,
546
- executions: newExecutions
604
+ executions: executions || []
547
605
  };
548
606
  }
549
607
  async freezePageContext() {
@@ -588,7 +646,7 @@ class Agent {
588
646
  }
589
647
  constructor(interfaceInstance, opts){
590
648
  _define_property(this, "interface", void 0);
591
- _define_property(this, "insight", void 0);
649
+ _define_property(this, "service", void 0);
592
650
  _define_property(this, "dump", void 0);
593
651
  _define_property(this, "reportFile", void 0);
594
652
  _define_property(this, "reportFileName", void 0);
@@ -597,36 +655,67 @@ class Agent {
597
655
  _define_property(this, "dryMode", false);
598
656
  _define_property(this, "onTaskStartTip", void 0);
599
657
  _define_property(this, "taskCache", void 0);
600
- _define_property(this, "onDumpUpdate", void 0);
658
+ _define_property(this, "dumpUpdateListeners", []);
601
659
  _define_property(this, "destroyed", false);
602
660
  _define_property(this, "modelConfigManager", void 0);
603
661
  _define_property(this, "frozenUIContext", void 0);
604
662
  _define_property(this, "hasWarnedNonVLModel", false);
605
663
  _define_property(this, "screenshotScale", void 0);
606
664
  _define_property(this, "screenshotScalePromise", void 0);
665
+ _define_property(this, "executionDumpIndexByRunner", new WeakMap());
607
666
  this.interface = interfaceInstance;
667
+ const envConfig = globalConfigManager.getAllEnvConfig();
668
+ const envReplanningCycleLimitRaw = envConfig[MIDSCENE_REPLANNING_CYCLE_LIMIT];
669
+ const envReplanningCycleLimit = void 0 !== envReplanningCycleLimitRaw ? Number(envReplanningCycleLimitRaw) : void 0;
608
670
  this.opts = Object.assign({
609
671
  generateReport: true,
610
672
  autoPrintReportMsg: true,
611
673
  groupName: 'Midscene Report',
612
674
  groupDescription: ''
613
- }, opts || {});
614
- 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)}`);
615
- this.modelConfigManager = (null == opts ? void 0 : opts.modelConfig) ? new ModelConfigManager(opts.modelConfig) : globalModelConfigManager;
675
+ }, opts || {}, opts?.replanningCycleLimit !== void 0 || void 0 === envReplanningCycleLimit || Number.isNaN(envReplanningCycleLimit) ? {} : {
676
+ replanningCycleLimit: envReplanningCycleLimit
677
+ });
678
+ const resolvedAiActContext = this.opts.aiActContext ?? this.opts.aiActionContext;
679
+ if (void 0 !== resolvedAiActContext) {
680
+ this.opts.aiActContext = resolvedAiActContext;
681
+ this.opts.aiActionContext ??= resolvedAiActContext;
682
+ }
683
+ 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}`);
684
+ const hasCustomConfig = opts?.modelConfig || opts?.createOpenAIClient;
685
+ this.modelConfigManager = hasCustomConfig ? new ModelConfigManager(opts?.modelConfig, opts?.createOpenAIClient) : globalModelConfigManager;
616
686
  this.onTaskStartTip = this.opts.onTaskStartTip;
617
- this.insight = new Insight(async (action)=>this.getUIContext(action));
687
+ this.service = new Service(async ()=>this.getUIContext());
618
688
  const cacheConfigObj = this.processCacheConfig(opts || {});
619
689
  if (cacheConfigObj) this.taskCache = new TaskCache(cacheConfigObj.id, cacheConfigObj.enabled, void 0, {
620
690
  readOnly: cacheConfigObj.readOnly,
621
691
  writeOnly: cacheConfigObj.writeOnly
622
692
  });
623
- this.taskExecutor = new TaskExecutor(this.interface, this.insight, {
693
+ const baseActionSpace = this.interface.actionSpace();
694
+ const fullActionSpace = [
695
+ ...baseActionSpace,
696
+ defineActionAssert()
697
+ ];
698
+ this.taskExecutor = new TaskExecutor(this.interface, this.service, {
624
699
  taskCache: this.taskCache,
625
700
  onTaskStart: this.callbackOnTaskStartTip.bind(this),
626
- replanningCycleLimit: this.opts.replanningCycleLimit
701
+ replanningCycleLimit: this.opts.replanningCycleLimit,
702
+ actionSpace: fullActionSpace,
703
+ hooks: {
704
+ onTaskUpdate: (runner)=>{
705
+ const executionDump = runner.dump();
706
+ this.appendExecutionDump(executionDump, runner);
707
+ const dumpString = this.dumpDataString();
708
+ for (const listener of this.dumpUpdateListeners)try {
709
+ listener(dumpString, executionDump);
710
+ } catch (error) {
711
+ console.error('Error in onDumpUpdate listener', error);
712
+ }
713
+ this.writeOutActionDumps();
714
+ }
715
+ }
627
716
  });
628
717
  this.dump = this.resetDump();
629
- this.reportFileName = (null == opts ? void 0 : opts.reportFileName) || getReportFileName((null == opts ? void 0 : opts.testId) || this.interface.interfaceType || 'web');
718
+ this.reportFileName = opts?.reportFileName || getReportFileName(opts?.testId || this.interface.interfaceType || 'web');
630
719
  }
631
720
  }
632
721
  const createAgent = (interfaceInstance, opts)=>new Agent(interfaceInstance, opts);