@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.
- package/dist/es/agent/agent.mjs +233 -144
- package/dist/es/agent/agent.mjs.map +1 -1
- package/dist/es/agent/execution-session.mjs +41 -0
- package/dist/es/agent/execution-session.mjs.map +1 -0
- package/dist/es/agent/index.mjs +3 -3
- package/dist/es/agent/task-builder.mjs +319 -0
- package/dist/es/agent/task-builder.mjs.map +1 -0
- package/dist/es/agent/task-cache.mjs +4 -4
- package/dist/es/agent/task-cache.mjs.map +1 -1
- package/dist/es/agent/tasks.mjs +197 -504
- package/dist/es/agent/tasks.mjs.map +1 -1
- package/dist/es/agent/ui-utils.mjs +54 -35
- package/dist/es/agent/ui-utils.mjs.map +1 -1
- package/dist/es/agent/utils.mjs +16 -58
- package/dist/es/agent/utils.mjs.map +1 -1
- package/dist/es/ai-model/conversation-history.mjs +25 -13
- package/dist/es/ai-model/conversation-history.mjs.map +1 -1
- package/dist/es/ai-model/index.mjs +4 -4
- package/dist/es/ai-model/inspect.mjs +45 -54
- package/dist/es/ai-model/inspect.mjs.map +1 -1
- package/dist/es/ai-model/llm-planning.mjs +47 -65
- package/dist/es/ai-model/llm-planning.mjs.map +1 -1
- package/dist/es/ai-model/prompt/assertion.mjs.map +1 -1
- package/dist/es/ai-model/prompt/common.mjs.map +1 -1
- package/dist/es/ai-model/prompt/describe.mjs.map +1 -1
- package/dist/es/ai-model/prompt/extraction.mjs.map +1 -1
- package/dist/es/ai-model/prompt/llm-locator.mjs +11 -235
- package/dist/es/ai-model/prompt/llm-locator.mjs.map +1 -1
- package/dist/es/ai-model/prompt/llm-planning.mjs +76 -322
- package/dist/es/ai-model/prompt/llm-planning.mjs.map +1 -1
- package/dist/es/ai-model/prompt/llm-section-locator.mjs +15 -14
- package/dist/es/ai-model/prompt/llm-section-locator.mjs.map +1 -1
- package/dist/es/ai-model/prompt/order-sensitive-judge.mjs +35 -0
- package/dist/es/ai-model/prompt/order-sensitive-judge.mjs.map +1 -0
- package/dist/es/ai-model/prompt/playwright-generator.mjs +2 -2
- package/dist/es/ai-model/prompt/playwright-generator.mjs.map +1 -1
- package/dist/es/ai-model/prompt/ui-tars-locator.mjs.map +1 -1
- package/dist/es/ai-model/prompt/ui-tars-planning.mjs.map +1 -1
- package/dist/es/ai-model/prompt/util.mjs +3 -88
- package/dist/es/ai-model/prompt/util.mjs.map +1 -1
- package/dist/es/ai-model/prompt/yaml-generator.mjs +10 -10
- package/dist/es/ai-model/prompt/yaml-generator.mjs.map +1 -1
- package/dist/es/ai-model/service-caller/index.mjs +182 -274
- package/dist/es/ai-model/service-caller/index.mjs.map +1 -1
- package/dist/es/ai-model/ui-tars-planning.mjs +69 -8
- package/dist/es/ai-model/ui-tars-planning.mjs.map +1 -1
- package/dist/es/{ai-model/common.mjs → common.mjs} +18 -30
- package/dist/es/common.mjs.map +1 -0
- package/dist/es/device/device-options.mjs +0 -0
- package/dist/es/device/index.mjs +29 -12
- package/dist/es/device/index.mjs.map +1 -1
- package/dist/es/index.mjs +5 -4
- package/dist/es/index.mjs.map +1 -1
- package/dist/es/report.mjs.map +1 -1
- package/dist/es/{insight → service}/index.mjs +38 -51
- package/dist/es/service/index.mjs.map +1 -0
- package/dist/es/{insight → service}/utils.mjs +3 -3
- package/dist/es/service/utils.mjs.map +1 -0
- package/dist/es/task-runner.mjs +264 -0
- package/dist/es/task-runner.mjs.map +1 -0
- package/dist/es/tree.mjs +13 -2
- package/dist/es/tree.mjs.map +1 -0
- package/dist/es/types.mjs +18 -1
- package/dist/es/types.mjs.map +1 -1
- package/dist/es/utils.mjs +6 -7
- package/dist/es/utils.mjs.map +1 -1
- package/dist/es/yaml/builder.mjs.map +1 -1
- package/dist/es/yaml/player.mjs +121 -98
- package/dist/es/yaml/player.mjs.map +1 -1
- package/dist/es/yaml/utils.mjs +1 -1
- package/dist/es/yaml/utils.mjs.map +1 -1
- package/dist/lib/agent/agent.js +231 -142
- package/dist/lib/agent/agent.js.map +1 -1
- package/dist/lib/agent/common.js +1 -1
- package/dist/lib/agent/execution-session.js +75 -0
- package/dist/lib/agent/execution-session.js.map +1 -0
- package/dist/lib/agent/index.js +14 -14
- package/dist/lib/agent/index.js.map +1 -1
- package/dist/lib/agent/task-builder.js +356 -0
- package/dist/lib/agent/task-builder.js.map +1 -0
- package/dist/lib/agent/task-cache.js +8 -8
- package/dist/lib/agent/task-cache.js.map +1 -1
- package/dist/lib/agent/tasks.js +202 -506
- package/dist/lib/agent/tasks.js.map +1 -1
- package/dist/lib/agent/ui-utils.js +58 -36
- package/dist/lib/agent/ui-utils.js.map +1 -1
- package/dist/lib/agent/utils.js +26 -68
- package/dist/lib/agent/utils.js.map +1 -1
- package/dist/lib/ai-model/conversation-history.js +27 -15
- package/dist/lib/ai-model/conversation-history.js.map +1 -1
- package/dist/lib/ai-model/index.js +27 -27
- package/dist/lib/ai-model/index.js.map +1 -1
- package/dist/lib/ai-model/inspect.js +51 -57
- package/dist/lib/ai-model/inspect.js.map +1 -1
- package/dist/lib/ai-model/llm-planning.js +49 -67
- package/dist/lib/ai-model/llm-planning.js.map +1 -1
- package/dist/lib/ai-model/prompt/assertion.js +2 -2
- package/dist/lib/ai-model/prompt/assertion.js.map +1 -1
- package/dist/lib/ai-model/prompt/common.js +2 -2
- package/dist/lib/ai-model/prompt/common.js.map +1 -1
- package/dist/lib/ai-model/prompt/describe.js +2 -2
- package/dist/lib/ai-model/prompt/describe.js.map +1 -1
- package/dist/lib/ai-model/prompt/extraction.js +2 -2
- package/dist/lib/ai-model/prompt/extraction.js.map +1 -1
- package/dist/lib/ai-model/prompt/llm-locator.js +14 -241
- package/dist/lib/ai-model/prompt/llm-locator.js.map +1 -1
- package/dist/lib/ai-model/prompt/llm-planning.js +79 -328
- package/dist/lib/ai-model/prompt/llm-planning.js.map +1 -1
- package/dist/lib/ai-model/prompt/llm-section-locator.js +17 -16
- package/dist/lib/ai-model/prompt/llm-section-locator.js.map +1 -1
- package/dist/lib/ai-model/prompt/order-sensitive-judge.js +72 -0
- package/dist/lib/ai-model/prompt/order-sensitive-judge.js.map +1 -0
- package/dist/lib/ai-model/prompt/playwright-generator.js +11 -11
- package/dist/lib/ai-model/prompt/playwright-generator.js.map +1 -1
- package/dist/lib/ai-model/prompt/ui-tars-locator.js +2 -2
- package/dist/lib/ai-model/prompt/ui-tars-locator.js.map +1 -1
- package/dist/lib/ai-model/prompt/ui-tars-planning.js +2 -2
- package/dist/lib/ai-model/prompt/ui-tars-planning.js.map +1 -1
- package/dist/lib/ai-model/prompt/util.js +7 -95
- package/dist/lib/ai-model/prompt/util.js.map +1 -1
- package/dist/lib/ai-model/prompt/yaml-generator.js +18 -18
- package/dist/lib/ai-model/prompt/yaml-generator.js.map +1 -1
- package/dist/lib/ai-model/service-caller/index.js +288 -401
- package/dist/lib/ai-model/service-caller/index.js.map +1 -1
- package/dist/lib/ai-model/ui-tars-planning.js +71 -10
- package/dist/lib/ai-model/ui-tars-planning.js.map +1 -1
- package/dist/lib/{ai-model/common.js → common.js} +40 -55
- package/dist/lib/common.js.map +1 -0
- package/dist/lib/device/device-options.js +20 -0
- package/dist/lib/device/device-options.js.map +1 -0
- package/dist/lib/device/index.js +63 -40
- package/dist/lib/device/index.js.map +1 -1
- package/dist/lib/image/index.js +5 -5
- package/dist/lib/image/index.js.map +1 -1
- package/dist/lib/index.js +24 -20
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/report.js +2 -2
- package/dist/lib/report.js.map +1 -1
- package/dist/lib/{insight → service}/index.js +41 -54
- package/dist/lib/service/index.js.map +1 -0
- package/dist/lib/{insight → service}/utils.js +7 -7
- package/dist/lib/service/utils.js.map +1 -0
- package/dist/lib/task-runner.js +301 -0
- package/dist/lib/task-runner.js.map +1 -0
- package/dist/lib/tree.js +13 -4
- package/dist/lib/tree.js.map +1 -1
- package/dist/lib/types.js +31 -12
- package/dist/lib/types.js.map +1 -1
- package/dist/lib/utils.js +16 -17
- package/dist/lib/utils.js.map +1 -1
- package/dist/lib/yaml/builder.js +2 -2
- package/dist/lib/yaml/builder.js.map +1 -1
- package/dist/lib/yaml/index.js +16 -22
- package/dist/lib/yaml/index.js.map +1 -1
- package/dist/lib/yaml/player.js +123 -100
- package/dist/lib/yaml/player.js.map +1 -1
- package/dist/lib/yaml/utils.js +6 -6
- package/dist/lib/yaml/utils.js.map +1 -1
- package/dist/lib/yaml.js +1 -1
- package/dist/lib/yaml.js.map +1 -1
- package/dist/types/agent/agent.d.ts +62 -17
- package/dist/types/agent/execution-session.d.ts +36 -0
- package/dist/types/agent/index.d.ts +3 -2
- package/dist/types/agent/task-builder.d.ts +35 -0
- package/dist/types/agent/tasks.d.ts +32 -23
- package/dist/types/agent/ui-utils.d.ts +9 -2
- package/dist/types/agent/utils.d.ts +9 -35
- package/dist/types/ai-model/conversation-history.d.ts +8 -4
- package/dist/types/ai-model/index.d.ts +5 -5
- package/dist/types/ai-model/inspect.d.ts +20 -12
- package/dist/types/ai-model/llm-planning.d.ts +3 -1
- package/dist/types/ai-model/prompt/llm-locator.d.ts +1 -6
- package/dist/types/ai-model/prompt/llm-planning.d.ts +2 -3
- package/dist/types/ai-model/prompt/llm-section-locator.d.ts +1 -3
- package/dist/types/ai-model/prompt/order-sensitive-judge.d.ts +2 -0
- package/dist/types/ai-model/prompt/util.d.ts +2 -34
- package/dist/types/ai-model/service-caller/index.d.ts +2 -3
- package/dist/types/ai-model/ui-tars-planning.d.ts +15 -2
- package/dist/types/{ai-model/common.d.ts → common.d.ts} +6 -6
- package/dist/types/device/device-options.d.ts +57 -0
- package/dist/types/device/index.d.ts +55 -39
- package/dist/types/index.d.ts +7 -6
- package/dist/types/service/index.d.ts +26 -0
- package/dist/types/service/utils.d.ts +2 -0
- package/dist/types/task-runner.d.ts +49 -0
- package/dist/types/tree.d.ts +4 -1
- package/dist/types/types.d.ts +103 -66
- package/dist/types/yaml/utils.d.ts +1 -1
- package/dist/types/yaml.d.ts +68 -43
- package/package.json +9 -12
- package/dist/es/ai-model/action-executor.mjs +0 -129
- package/dist/es/ai-model/action-executor.mjs.map +0 -1
- package/dist/es/ai-model/common.mjs.map +0 -1
- package/dist/es/insight/index.mjs.map +0 -1
- package/dist/es/insight/utils.mjs.map +0 -1
- package/dist/lib/ai-model/action-executor.js +0 -163
- package/dist/lib/ai-model/action-executor.js.map +0 -1
- package/dist/lib/ai-model/common.js.map +0 -1
- package/dist/lib/insight/index.js.map +0 -1
- package/dist/lib/insight/utils.js.map +0 -1
- package/dist/types/ai-model/action-executor.d.ts +0 -19
- package/dist/types/insight/index.d.ts +0 -31
- package/dist/types/insight/utils.d.ts +0 -2
package/dist/lib/agent/agent.js
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
196
|
-
|
|
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)(
|
|
224
|
-
const
|
|
225
|
-
const
|
|
226
|
-
await this.
|
|
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)(
|
|
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
|
|
326
|
-
|
|
327
|
-
const
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
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 =
|
|
388
|
+
const yaml = matchedCache.cacheContent.yamlWorkflow;
|
|
337
389
|
return this.runYaml(yaml);
|
|
338
390
|
}
|
|
339
|
-
|
|
340
|
-
if (
|
|
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
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
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 =
|
|
366
|
-
const modelConfig = this.modelConfigManager.getModelConfig('
|
|
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
|
|
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 =
|
|
373
|
-
const modelConfig = this.modelConfigManager.getModelConfig('
|
|
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
|
|
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 =
|
|
380
|
-
const modelConfig = this.modelConfigManager.getModelConfig('
|
|
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
|
|
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 =
|
|
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 =
|
|
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('
|
|
400
|
-
const text = await this.
|
|
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 <= (
|
|
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
|
|
441
|
-
const
|
|
442
|
-
await this.
|
|
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:
|
|
450
|
-
center:
|
|
502
|
+
rect: element?.rect,
|
|
503
|
+
center: element?.center,
|
|
451
504
|
...dprEntry
|
|
452
505
|
};
|
|
453
506
|
}
|
|
454
507
|
async aiAssert(assertion, msg, opt) {
|
|
455
|
-
|
|
456
|
-
const
|
|
457
|
-
|
|
458
|
-
|
|
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
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
pass:
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
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('
|
|
475
|
-
|
|
476
|
-
timeoutMs:
|
|
477
|
-
checkIntervalMs:
|
|
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(
|
|
486
|
-
|
|
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
|
|
589
|
+
await this.interface.destroy?.();
|
|
520
590
|
this.resetDump();
|
|
521
591
|
this.destroyed = true;
|
|
522
592
|
}
|
|
523
|
-
async
|
|
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:
|
|
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:
|
|
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
|
-
|
|
559
|
-
|
|
560
|
-
|
|
627
|
+
const dumpString = this.dumpDataString();
|
|
628
|
+
for (const listener of this.dumpUpdateListeners)try {
|
|
629
|
+
listener(dumpString);
|
|
561
630
|
} catch (error) {
|
|
562
|
-
console.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:
|
|
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, "
|
|
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, "
|
|
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
|
-
|
|
654
|
-
|
|
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.
|
|
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
|
-
|
|
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 =
|
|
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
|
|
763
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
675
764
|
"Agent",
|
|
676
765
|
"createAgent"
|
|
677
|
-
].indexOf(
|
|
766
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
678
767
|
Object.defineProperty(exports, '__esModule', {
|
|
679
768
|
value: true
|
|
680
769
|
});
|