@midscene/core 0.30.10 → 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.
- 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 +63 -17
- package/dist/types/agent/execution-session.d.ts +36 -0
- package/dist/types/agent/index.d.ts +2 -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 +6 -5
- 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/es/agent/agent.mjs
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
|
-
import {
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
157
|
-
|
|
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(
|
|
185
|
-
const
|
|
186
|
-
const
|
|
187
|
-
await this.
|
|
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(
|
|
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
|
|
287
|
-
|
|
288
|
-
const
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
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 =
|
|
349
|
+
const yaml = matchedCache.cacheContent.yamlWorkflow;
|
|
298
350
|
return this.runYaml(yaml);
|
|
299
351
|
}
|
|
300
|
-
|
|
301
|
-
if (
|
|
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
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
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 =
|
|
327
|
-
const modelConfig = this.modelConfigManager.getModelConfig('
|
|
382
|
+
async aiBoolean(prompt, opt = defaultServiceExtractOption) {
|
|
383
|
+
const modelConfig = this.modelConfigManager.getModelConfig('insight');
|
|
328
384
|
const { textPrompt, multimodalPrompt } = parsePrompt(prompt);
|
|
329
|
-
const { output
|
|
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 =
|
|
334
|
-
const modelConfig = this.modelConfigManager.getModelConfig('
|
|
388
|
+
async aiNumber(prompt, opt = defaultServiceExtractOption) {
|
|
389
|
+
const modelConfig = this.modelConfigManager.getModelConfig('insight');
|
|
335
390
|
const { textPrompt, multimodalPrompt } = parsePrompt(prompt);
|
|
336
|
-
const { output
|
|
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 =
|
|
341
|
-
const modelConfig = this.modelConfigManager.getModelConfig('
|
|
394
|
+
async aiString(prompt, opt = defaultServiceExtractOption) {
|
|
395
|
+
const modelConfig = this.modelConfigManager.getModelConfig('insight');
|
|
342
396
|
const { textPrompt, multimodalPrompt } = parsePrompt(prompt);
|
|
343
|
-
const { output
|
|
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 =
|
|
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 =
|
|
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('
|
|
361
|
-
const text = await this.
|
|
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 <= (
|
|
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
|
|
402
|
-
const
|
|
403
|
-
await this.
|
|
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:
|
|
411
|
-
center:
|
|
463
|
+
rect: element?.rect,
|
|
464
|
+
center: element?.center,
|
|
412
465
|
...dprEntry
|
|
413
466
|
};
|
|
414
467
|
}
|
|
415
468
|
async aiAssert(assertion, msg, opt) {
|
|
416
|
-
|
|
417
|
-
const
|
|
418
|
-
|
|
419
|
-
|
|
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
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
pass:
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
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('
|
|
436
|
-
|
|
437
|
-
timeoutMs:
|
|
438
|
-
checkIntervalMs:
|
|
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(
|
|
447
|
-
|
|
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
|
|
550
|
+
await this.interface.destroy?.();
|
|
481
551
|
this.resetDump();
|
|
482
552
|
this.destroyed = true;
|
|
483
553
|
}
|
|
484
|
-
async
|
|
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:
|
|
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:
|
|
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
|
-
|
|
520
|
-
|
|
521
|
-
|
|
588
|
+
const dumpString = this.dumpDataString();
|
|
589
|
+
for (const listener of this.dumpUpdateListeners)try {
|
|
590
|
+
listener(dumpString);
|
|
522
591
|
} catch (error) {
|
|
523
|
-
console.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:
|
|
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, "
|
|
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, "
|
|
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
|
-
|
|
615
|
-
|
|
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.
|
|
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
|
-
|
|
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 =
|
|
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);
|