@midscene/core 0.27.4 → 0.27.5-beta-20250827031507.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 +25 -22
- package/dist/es/agent/agent.mjs.map +1 -1
- package/dist/es/agent/index.mjs +2 -2
- package/dist/es/agent/tasks.mjs +47 -44
- package/dist/es/agent/tasks.mjs.map +1 -1
- package/dist/es/agent/utils.mjs +17 -17
- package/dist/es/agent/utils.mjs.map +1 -1
- package/dist/es/ai-model/common.mjs +1 -1
- package/dist/es/ai-model/common.mjs.map +1 -1
- package/dist/es/ai-model/llm-planning.mjs.map +1 -1
- package/dist/es/device/index.mjs +2 -2
- package/dist/es/device/index.mjs.map +1 -1
- package/dist/es/index.mjs.map +1 -1
- package/dist/es/types.mjs.map +1 -1
- package/dist/es/utils.mjs +2 -2
- package/dist/es/yaml/player.mjs +6 -6
- package/dist/es/yaml/player.mjs.map +1 -1
- package/dist/lib/agent/agent.js +24 -21
- package/dist/lib/agent/agent.js.map +1 -1
- package/dist/lib/agent/index.js +3 -3
- package/dist/lib/agent/tasks.js +49 -46
- package/dist/lib/agent/tasks.js.map +1 -1
- package/dist/lib/agent/utils.js +17 -17
- package/dist/lib/agent/utils.js.map +1 -1
- package/dist/lib/ai-model/common.js +1 -1
- package/dist/lib/ai-model/common.js.map +1 -1
- package/dist/lib/ai-model/llm-planning.js.map +1 -1
- package/dist/lib/device/index.js +4 -4
- package/dist/lib/device/index.js.map +1 -1
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/types.js.map +1 -1
- package/dist/lib/utils.js +2 -2
- package/dist/lib/yaml/player.js +6 -6
- package/dist/lib/yaml/player.js.map +1 -1
- package/dist/types/agent/agent.d.ts +10 -9
- package/dist/types/agent/index.d.ts +2 -2
- package/dist/types/agent/tasks.d.ts +5 -4
- package/dist/types/agent/utils.d.ts +5 -5
- package/dist/types/ai-model/llm-planning.d.ts +2 -2
- package/dist/types/device/index.d.ts +3 -2
- package/dist/types/index.d.ts +1 -1
- package/dist/types/types.d.ts +2 -3
- package/dist/types/yaml/player.d.ts +1 -1
- package/dist/types/yaml.d.ts +1 -1
- package/package.json +3 -3
package/dist/es/agent/agent.mjs
CHANGED
|
@@ -6,7 +6,7 @@ import { MIDSCENE_CACHE, globalConfigManager, vlLocateMode } from "@midscene/sha
|
|
|
6
6
|
import { getDebug } from "@midscene/shared/logger";
|
|
7
7
|
import { assert } from "@midscene/shared/utils";
|
|
8
8
|
import { TaskCache } from "./task-cache.mjs";
|
|
9
|
-
import {
|
|
9
|
+
import { TaskExecutor, locatePlanForLocate } from "./tasks.mjs";
|
|
10
10
|
import { locateParamStr, paramStr, taskTitleStr, typeStr } from "./ui-utils.mjs";
|
|
11
11
|
import { commonContextParser, getReportFileName, parsePrompt, printReportMsg, trimContextByViewport } from "./utils.mjs";
|
|
12
12
|
function _define_property(obj, key, value) {
|
|
@@ -35,20 +35,23 @@ const defaultInsightExtractOption = {
|
|
|
35
35
|
screenshotIncluded: true
|
|
36
36
|
};
|
|
37
37
|
class Agent {
|
|
38
|
+
get page() {
|
|
39
|
+
return this.interface;
|
|
40
|
+
}
|
|
38
41
|
async getActionSpace() {
|
|
39
|
-
return this.
|
|
42
|
+
return this.interface.actionSpace();
|
|
40
43
|
}
|
|
41
44
|
async getUIContext(action) {
|
|
42
|
-
if (this.
|
|
45
|
+
if (this.frozenUIContext) {
|
|
43
46
|
debug('Using frozen page context for action:', action);
|
|
44
|
-
return this.
|
|
47
|
+
return this.frozenUIContext;
|
|
45
48
|
}
|
|
46
|
-
if (this.
|
|
49
|
+
if (this.interface.getContext) {
|
|
47
50
|
debug('Using page.getContext for action:', action);
|
|
48
|
-
return await this.
|
|
51
|
+
return await this.interface.getContext();
|
|
49
52
|
}
|
|
50
53
|
debug('Using commonContextParser for action:', action);
|
|
51
|
-
return await commonContextParser(this.
|
|
54
|
+
return await commonContextParser(this.interface);
|
|
52
55
|
}
|
|
53
56
|
async _snapshotContext() {
|
|
54
57
|
return await this.getUIContext('locate');
|
|
@@ -335,7 +338,7 @@ class Agent {
|
|
|
335
338
|
return {
|
|
336
339
|
rect: null == element ? void 0 : element.rect,
|
|
337
340
|
center: null == element ? void 0 : element.center,
|
|
338
|
-
scale: (await this.
|
|
341
|
+
scale: (await this.interface.size()).dpr
|
|
339
342
|
};
|
|
340
343
|
}
|
|
341
344
|
async aiAssert(assertion, msg, opt) {
|
|
@@ -395,16 +398,16 @@ class Agent {
|
|
|
395
398
|
};
|
|
396
399
|
}
|
|
397
400
|
async evaluateJavaScript(script) {
|
|
398
|
-
assert(this.
|
|
399
|
-
return this.
|
|
401
|
+
assert(this.interface.evaluateJavaScript, 'evaluateJavaScript is not supported in current agent');
|
|
402
|
+
return this.interface.evaluateJavaScript(script);
|
|
400
403
|
}
|
|
401
404
|
async destroy() {
|
|
402
|
-
await this.
|
|
405
|
+
await this.interface.destroy();
|
|
403
406
|
this.resetDump();
|
|
404
407
|
this.destroyed = true;
|
|
405
408
|
}
|
|
406
409
|
async logScreenshot(title, opt) {
|
|
407
|
-
const base64 = await this.
|
|
410
|
+
const base64 = await this.interface.screenshotBase64();
|
|
408
411
|
const now = Date.now();
|
|
409
412
|
const recorder = [
|
|
410
413
|
{
|
|
@@ -452,7 +455,7 @@ class Agent {
|
|
|
452
455
|
const { tasks, ...restExecution } = execution;
|
|
453
456
|
let newTasks = tasks;
|
|
454
457
|
if (Array.isArray(tasks)) newTasks = tasks.map((task)=>{
|
|
455
|
-
const {
|
|
458
|
+
const { uiContext, log, ...restTask } = task;
|
|
456
459
|
return restTask;
|
|
457
460
|
});
|
|
458
461
|
return {
|
|
@@ -472,16 +475,16 @@ class Agent {
|
|
|
472
475
|
debug('Freezing page context');
|
|
473
476
|
const context = await this._snapshotContext();
|
|
474
477
|
context._isFrozen = true;
|
|
475
|
-
this.
|
|
478
|
+
this.frozenUIContext = context;
|
|
476
479
|
debug('Page context frozen successfully');
|
|
477
480
|
}
|
|
478
481
|
async unfreezePageContext() {
|
|
479
482
|
debug('Unfreezing page context');
|
|
480
|
-
this.
|
|
483
|
+
this.frozenUIContext = void 0;
|
|
481
484
|
debug('Page context unfrozen successfully');
|
|
482
485
|
}
|
|
483
|
-
constructor(
|
|
484
|
-
_define_property(this, "
|
|
486
|
+
constructor(interfaceInstance, opts){
|
|
487
|
+
_define_property(this, "interface", void 0);
|
|
485
488
|
_define_property(this, "insight", void 0);
|
|
486
489
|
_define_property(this, "dump", void 0);
|
|
487
490
|
_define_property(this, "reportFile", void 0);
|
|
@@ -493,8 +496,8 @@ class Agent {
|
|
|
493
496
|
_define_property(this, "taskCache", void 0);
|
|
494
497
|
_define_property(this, "onDumpUpdate", void 0);
|
|
495
498
|
_define_property(this, "destroyed", false);
|
|
496
|
-
_define_property(this, "
|
|
497
|
-
this.
|
|
499
|
+
_define_property(this, "frozenUIContext", void 0);
|
|
500
|
+
this.interface = interfaceInstance;
|
|
498
501
|
this.opts = Object.assign({
|
|
499
502
|
generateReport: true,
|
|
500
503
|
autoPrintReportMsg: true,
|
|
@@ -505,13 +508,13 @@ class Agent {
|
|
|
505
508
|
globalConfigManager.init(null == opts ? void 0 : opts.modelConfig);
|
|
506
509
|
this.onTaskStartTip = this.opts.onTaskStartTip;
|
|
507
510
|
this.insight = new Insight(async (action)=>this.getUIContext(action));
|
|
508
|
-
if ((null == opts ? void 0 : opts.cacheId) && 'android' !== this.
|
|
509
|
-
this.taskExecutor = new
|
|
511
|
+
if ((null == opts ? void 0 : opts.cacheId) && 'android' !== this.interface.interfaceType) this.taskCache = new TaskCache(opts.cacheId, globalConfigManager.getEnvConfigInBoolean(MIDSCENE_CACHE));
|
|
512
|
+
this.taskExecutor = new TaskExecutor(this.interface, this.insight, {
|
|
510
513
|
taskCache: this.taskCache,
|
|
511
514
|
onTaskStart: this.callbackOnTaskStartTip.bind(this)
|
|
512
515
|
});
|
|
513
516
|
this.dump = this.resetDump();
|
|
514
|
-
this.reportFileName = (null == opts ? void 0 : opts.reportFileName) || getReportFileName((null == opts ? void 0 : opts.testId) || this.
|
|
517
|
+
this.reportFileName = (null == opts ? void 0 : opts.reportFileName) || getReportFileName((null == opts ? void 0 : opts.testId) || this.interface.interfaceType || 'web');
|
|
515
518
|
}
|
|
516
519
|
}
|
|
517
520
|
export { Agent };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent/agent.mjs","sources":["webpack://@midscene/core/./src/agent/agent.ts"],"sourcesContent":["import {\n type AgentAssertOpt,\n type AgentDescribeElementAtPointResult,\n type AgentWaitForOpt,\n type DeviceAction,\n type ExecutionDump,\n type ExecutionRecorderItem,\n type ExecutionTask,\n type ExecutionTaskLog,\n type Executor,\n type GroupedActionDump,\n Insight,\n type InsightAction,\n type InsightExtractOption,\n type InsightExtractParam,\n type LocateOption,\n type LocateResultElement,\n type LocateValidatorResult,\n type LocatorValidatorOption,\n type MidsceneYamlScript,\n type OnTaskStartTip,\n type PlanningAction,\n type Rect,\n type ScrollParam,\n type TUserPrompt,\n type UIContext,\n} from '../index';\n\nimport yaml from 'js-yaml';\n\nimport {\n groupedActionDumpFileExt,\n reportHTMLContent,\n stringifyDumpData,\n writeLogFile,\n} from '@/utils';\nimport {\n ScriptPlayer,\n buildDetailedLocateParam,\n parseYamlScript,\n} from '../yaml/index';\n\nimport type { AbstractDevice } from '@/device';\nimport {\n type IModelPreferences,\n MIDSCENE_CACHE,\n type TModelConfigFn,\n globalConfigManager,\n vlLocateMode,\n} from '@midscene/shared/env';\nimport { getDebug } from '@midscene/shared/logger';\nimport { assert } from '@midscene/shared/utils';\n// import type { AndroidDeviceInputOpt } from '../device';\nimport { TaskCache } from './task-cache';\nimport { PageTaskExecutor, locatePlanForLocate } from './tasks';\nimport { locateParamStr, paramStr, taskTitleStr, typeStr } from './ui-utils';\nimport {\n commonContextParser,\n getReportFileName,\n parsePrompt,\n printReportMsg,\n} from './utils';\nimport { trimContextByViewport } from './utils';\n\nconst debug = getDebug('agent');\n\nconst distanceOfTwoPoints = (p1: [number, number], p2: [number, number]) => {\n const [x1, y1] = p1;\n const [x2, y2] = p2;\n return Math.round(Math.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2));\n};\n\nconst includedInRect = (point: [number, number], rect: Rect) => {\n const [x, y] = point;\n const { left, top, width, height } = rect;\n return x >= left && x <= left + width && y >= top && y <= top + height;\n};\n\nconst defaultInsightExtractOption: InsightExtractOption = {\n domIncluded: false,\n screenshotIncluded: true,\n};\n\nexport interface PageAgentOpt {\n testId?: string;\n cacheId?: string;\n groupName?: string;\n groupDescription?: string;\n /* if auto generate report, default true */\n generateReport?: boolean;\n /* if auto print report msg, default true */\n autoPrintReportMsg?: boolean;\n onTaskStartTip?: OnTaskStartTip;\n aiActionContext?: string;\n /* custom report file name */\n reportFileName?: string;\n modelConfig?: TModelConfigFn;\n}\n\nexport class Agent<PageType extends AbstractDevice = AbstractDevice> {\n page: PageType;\n\n insight: Insight;\n\n dump: GroupedActionDump;\n\n reportFile?: string | null;\n\n reportFileName?: string;\n\n taskExecutor: PageTaskExecutor;\n\n opts: PageAgentOpt;\n\n /**\n * If true, the agent will not perform any actions\n */\n dryMode = false;\n\n onTaskStartTip?: OnTaskStartTip;\n\n taskCache?: TaskCache;\n\n onDumpUpdate?: (dump: string) => void;\n\n destroyed = false;\n\n /**\n * Frozen page context for consistent AI operations\n */\n private frozenPageContext?: UIContext;\n\n constructor(page: PageType, opts?: PageAgentOpt) {\n this.page = page;\n this.opts = Object.assign(\n {\n generateReport: true,\n autoPrintReportMsg: true,\n groupName: 'Midscene Report',\n groupDescription: '',\n },\n opts || {},\n );\n if (opts?.modelConfig && typeof opts?.modelConfig !== 'function') {\n throw new Error(\n `opts.modelConfig must be one of function or undefined, but got ${typeof opts?.modelConfig}`,\n );\n }\n\n globalConfigManager.init(opts?.modelConfig);\n\n this.onTaskStartTip = this.opts.onTaskStartTip;\n // get the parent browser of the puppeteer page\n // const browser = (this.page as PuppeteerWebPage).browser();\n\n this.insight = new Insight(async (action: InsightAction) => {\n return this.getUIContext(action);\n });\n\n if (opts?.cacheId && this.page.pageType !== 'android') {\n this.taskCache = new TaskCache(\n opts.cacheId,\n globalConfigManager.getEnvConfigInBoolean(MIDSCENE_CACHE), // if we should use cache to match the element\n );\n }\n\n this.taskExecutor = new PageTaskExecutor(this.page, this.insight, {\n taskCache: this.taskCache,\n onTaskStart: this.callbackOnTaskStartTip.bind(this),\n });\n this.dump = this.resetDump();\n this.reportFileName =\n opts?.reportFileName ||\n getReportFileName(opts?.testId || this.page.pageType || 'web');\n }\n\n async getActionSpace(): Promise<DeviceAction[]> {\n return this.page.actionSpace();\n }\n\n async getUIContext(action?: InsightAction): Promise<UIContext> {\n // If page context is frozen, return the frozen context for all actions\n if (this.frozenPageContext) {\n debug('Using frozen page context for action:', action);\n return this.frozenPageContext;\n }\n\n if (this.page.getContext) {\n debug('Using page.getContext for action:', action);\n return await this.page.getContext();\n } else {\n debug('Using commonContextParser for action:', action);\n return await commonContextParser(this.page);\n }\n }\n\n async _snapshotContext(): Promise<UIContext> {\n return await this.getUIContext('locate');\n }\n\n async setAIActionContext(prompt: string) {\n this.opts.aiActionContext = prompt;\n }\n\n resetDump() {\n this.dump = {\n groupName: this.opts.groupName!,\n groupDescription: this.opts.groupDescription,\n executions: [],\n modelBriefs: [],\n };\n\n return this.dump;\n }\n\n appendExecutionDump(execution: ExecutionDump) {\n // use trimContextByViewport to process execution\n const trimmedExecution = trimContextByViewport(execution);\n const currentDump = this.dump;\n currentDump.executions.push(trimmedExecution);\n }\n\n dumpDataString() {\n // update dump info\n this.dump.groupName = this.opts.groupName!;\n this.dump.groupDescription = this.opts.groupDescription;\n return stringifyDumpData(this.dump);\n }\n\n reportHTMLString() {\n return reportHTMLContent(this.dumpDataString());\n }\n\n writeOutActionDumps() {\n if (this.destroyed) {\n throw new Error(\n 'PageAgent has been destroyed. Cannot update report file.',\n );\n }\n const { generateReport, autoPrintReportMsg } = this.opts;\n this.reportFile = writeLogFile({\n fileName: this.reportFileName!,\n fileExt: groupedActionDumpFileExt,\n fileContent: this.dumpDataString(),\n type: 'dump',\n generateReport,\n });\n debug('writeOutActionDumps', this.reportFile);\n if (generateReport && autoPrintReportMsg && this.reportFile) {\n printReportMsg(this.reportFile);\n }\n }\n\n private async callbackOnTaskStartTip(task: ExecutionTask) {\n const param = paramStr(task);\n const tip = param ? `${typeStr(task)} - ${param}` : typeStr(task);\n\n if (this.onTaskStartTip) {\n await this.onTaskStartTip(tip);\n }\n }\n\n private async afterTaskRunning(executor: Executor, doNotThrowError = false) {\n this.appendExecutionDump(executor.dump());\n\n try {\n await this.onDumpUpdate?.(this.dumpDataString());\n } catch (error) {\n console.error('Error in onDumpUpdate', error);\n }\n\n this.writeOutActionDumps();\n\n if (executor.isInErrorState() && !doNotThrowError) {\n const errorTask = executor.latestErrorTask();\n throw new Error(`${errorTask?.errorMessage}\\n${errorTask?.errorStack}`, {\n cause: errorTask?.error,\n });\n }\n }\n\n async callActionInActionSpace<T = any>(\n type: string,\n opt?: T, // and all other action params\n ) {\n debug('callActionInActionSpace', type, ',', opt, ',', opt);\n\n const actionPlan: PlanningAction<T> = {\n type: type as any,\n param: (opt as any) || {},\n thought: '',\n };\n debug('actionPlan', actionPlan); // , ', in which the locateParam is', locateParam);\n\n const plans: PlanningAction[] = [actionPlan].filter(\n Boolean,\n ) as PlanningAction[];\n\n const title = taskTitleStr(\n type as any,\n locateParamStr((opt as any)?.locate || {}),\n );\n\n const { output, executor } = await this.taskExecutor.runPlans(title, plans);\n await this.afterTaskRunning(executor);\n return output;\n }\n\n async aiTap(locatePrompt: TUserPrompt, opt?: LocateOption) {\n assert(locatePrompt, 'missing locate prompt for tap');\n\n const detailedLocateParam = buildDetailedLocateParam(locatePrompt, opt);\n\n return this.callActionInActionSpace('Tap', {\n locate: detailedLocateParam,\n });\n }\n\n async aiRightClick(locatePrompt: TUserPrompt, opt?: LocateOption) {\n assert(locatePrompt, 'missing locate prompt for right click');\n\n const detailedLocateParam = buildDetailedLocateParam(locatePrompt, opt);\n\n return this.callActionInActionSpace('RightClick', {\n locate: detailedLocateParam,\n });\n }\n\n async aiHover(locatePrompt: TUserPrompt, opt?: LocateOption) {\n assert(locatePrompt, 'missing locate prompt for hover');\n\n const detailedLocateParam = buildDetailedLocateParam(locatePrompt, opt);\n\n return this.callActionInActionSpace('Hover', {\n locate: detailedLocateParam,\n });\n }\n\n // New signature, always use locatePrompt as the first param\n async aiInput(\n locatePrompt: TUserPrompt,\n opt: LocateOption & { value: string }, // AndroidDeviceInputOpt &\n ): Promise<any>;\n\n // Legacy signature - deprecated\n /**\n * @deprecated Use aiInput(locatePrompt, opt) instead where opt contains the value\n */\n async aiInput(\n value: string,\n locatePrompt: TUserPrompt,\n opt?: LocateOption, // AndroidDeviceInputOpt &\n ): Promise<any>;\n\n // Implementation\n async aiInput(\n locatePromptOrValue: TUserPrompt | string,\n locatePromptOrOpt:\n | TUserPrompt\n | (LocateOption & { value: string }) // AndroidDeviceInputOpt &\n | undefined,\n optOrUndefined?: LocateOption, // AndroidDeviceInputOpt &\n ) {\n let value: string;\n let locatePrompt: TUserPrompt;\n let opt:\n | (LocateOption & { value: string }) // AndroidDeviceInputOpt &\n | undefined;\n\n // Check if using new signature (first param is locatePrompt, second has value)\n if (\n typeof locatePromptOrOpt === 'object' &&\n locatePromptOrOpt !== null &&\n 'value' in locatePromptOrOpt\n ) {\n // New signature: aiInput(locatePrompt, opt)\n locatePrompt = locatePromptOrValue as TUserPrompt;\n const optWithValue = locatePromptOrOpt as LocateOption & {\n // AndroidDeviceInputOpt &\n value: string;\n };\n value = optWithValue.value;\n opt = optWithValue;\n } else {\n // Legacy signature: aiInput(value, locatePrompt, opt)\n value = locatePromptOrValue as string;\n locatePrompt = locatePromptOrOpt as TUserPrompt;\n opt = {\n ...optOrUndefined,\n value,\n };\n }\n\n assert(\n typeof value === 'string',\n 'input value must be a string, use empty string if you want to clear the input',\n );\n assert(locatePrompt, 'missing locate prompt for input');\n\n const detailedLocateParam = buildDetailedLocateParam(locatePrompt, opt);\n\n return this.callActionInActionSpace('Input', {\n ...(opt || {}),\n locate: detailedLocateParam,\n });\n }\n\n // New signature\n async aiKeyboardPress(\n locatePrompt: TUserPrompt,\n opt: LocateOption & { keyName: string },\n ): Promise<any>;\n\n // Legacy signature - deprecated\n /**\n * @deprecated Use aiKeyboardPress(locatePrompt, opt) instead where opt contains the keyName\n */\n async aiKeyboardPress(\n keyName: string,\n locatePrompt?: TUserPrompt,\n opt?: LocateOption,\n ): Promise<any>;\n\n // Implementation\n async aiKeyboardPress(\n locatePromptOrKeyName: TUserPrompt | string,\n locatePromptOrOpt:\n | TUserPrompt\n | (LocateOption & { keyName: string })\n | undefined,\n optOrUndefined?: LocateOption,\n ) {\n let keyName: string;\n let locatePrompt: TUserPrompt | undefined;\n let opt: (LocateOption & { keyName: string }) | undefined;\n\n // Check if using new signature (first param is locatePrompt, second has keyName)\n if (\n typeof locatePromptOrOpt === 'object' &&\n locatePromptOrOpt !== null &&\n 'keyName' in locatePromptOrOpt\n ) {\n // New signature: aiKeyboardPress(locatePrompt, opt)\n locatePrompt = locatePromptOrKeyName as TUserPrompt;\n opt = locatePromptOrOpt as LocateOption & {\n keyName: string;\n };\n } else {\n // Legacy signature: aiKeyboardPress(keyName, locatePrompt, opt)\n keyName = locatePromptOrKeyName as string;\n locatePrompt = locatePromptOrOpt as TUserPrompt | undefined;\n opt = {\n ...(optOrUndefined || {}),\n keyName,\n };\n }\n\n assert(opt?.keyName, 'missing keyName for keyboard press');\n\n const detailedLocateParam = locatePrompt\n ? buildDetailedLocateParam(locatePrompt, opt)\n : undefined;\n\n return this.callActionInActionSpace('KeyboardPress', {\n ...(opt || {}),\n locate: detailedLocateParam,\n });\n }\n\n // New signature\n async aiScroll(\n locatePrompt: TUserPrompt | undefined,\n opt: LocateOption & ScrollParam,\n ): Promise<any>;\n\n // Legacy signature - deprecated\n /**\n * @deprecated Use aiScroll(locatePrompt, opt) instead where opt contains the scroll parameters\n */\n async aiScroll(\n scrollParam: ScrollParam,\n locatePrompt?: TUserPrompt,\n opt?: LocateOption,\n ): Promise<any>;\n\n // Implementation\n async aiScroll(\n locatePromptOrScrollParam: TUserPrompt | ScrollParam | undefined,\n locatePromptOrOpt: TUserPrompt | (LocateOption & ScrollParam) | undefined,\n optOrUndefined?: LocateOption,\n ) {\n let scrollParam: ScrollParam;\n let locatePrompt: TUserPrompt | undefined;\n let opt: LocateOption | undefined;\n\n // Check if using new signature (first param is locatePrompt, second has scroll params)\n if (\n typeof locatePromptOrOpt === 'object' &&\n ('direction' in locatePromptOrOpt ||\n 'scrollType' in locatePromptOrOpt ||\n 'distance' in locatePromptOrOpt)\n ) {\n // New signature: aiScroll(locatePrompt, opt)\n locatePrompt = locatePromptOrScrollParam as TUserPrompt;\n opt = locatePromptOrOpt as LocateOption & ScrollParam;\n } else {\n // Legacy signature: aiScroll(scrollParam, locatePrompt, opt)\n scrollParam = locatePromptOrScrollParam as ScrollParam;\n locatePrompt = locatePromptOrOpt as TUserPrompt | undefined;\n opt = {\n ...(optOrUndefined || {}),\n ...(scrollParam || {}),\n };\n }\n\n const detailedLocateParam = buildDetailedLocateParam(\n locatePrompt || '',\n opt,\n );\n\n return this.callActionInActionSpace('Scroll', {\n ...(opt || {}),\n locate: detailedLocateParam,\n });\n }\n\n async aiAction(\n taskPrompt: string,\n opt?: {\n cacheable?: boolean;\n },\n ) {\n const modelPreferences: IModelPreferences = { intent: 'planning' };\n const cacheable = opt?.cacheable;\n // if vlm-ui-tars, plan cache is not used\n const isVlmUiTars = vlLocateMode(modelPreferences) === 'vlm-ui-tars';\n const matchedCache =\n isVlmUiTars || cacheable === false\n ? undefined\n : this.taskCache?.matchPlanCache(taskPrompt);\n if (matchedCache && this.taskCache?.isCacheResultUsed) {\n // log into report file\n const { executor } = await this.taskExecutor.loadYamlFlowAsPlanning(\n taskPrompt,\n matchedCache.cacheContent?.yamlWorkflow,\n );\n\n await await this.afterTaskRunning(executor);\n\n debug('matched cache, will call .runYaml to run the action');\n const yaml = matchedCache.cacheContent?.yamlWorkflow;\n return this.runYaml(yaml);\n }\n\n const { output, executor } = await (isVlmUiTars\n ? this.taskExecutor.actionToGoal(taskPrompt)\n : this.taskExecutor.action(taskPrompt, this.opts.aiActionContext));\n\n // update cache\n if (this.taskCache && output?.yamlFlow && cacheable !== false) {\n const yamlContent: MidsceneYamlScript = {\n tasks: [\n {\n name: taskPrompt,\n flow: output.yamlFlow,\n },\n ],\n };\n const yamlFlowStr = yaml.dump(yamlContent);\n this.taskCache.updateOrAppendCacheRecord(\n {\n type: 'plan',\n prompt: taskPrompt,\n yamlWorkflow: yamlFlowStr,\n },\n matchedCache,\n );\n }\n\n await this.afterTaskRunning(executor);\n return output;\n }\n\n async aiQuery<ReturnType = any>(\n demand: InsightExtractParam,\n opt: InsightExtractOption = defaultInsightExtractOption,\n ): Promise<ReturnType> {\n const { output, executor } =\n await this.taskExecutor.createTypeQueryExecution('Query', demand, opt);\n await this.afterTaskRunning(executor);\n return output as ReturnType;\n }\n\n async aiBoolean(\n prompt: TUserPrompt,\n opt: InsightExtractOption = defaultInsightExtractOption,\n ): Promise<boolean> {\n const { textPrompt, multimodalPrompt } = parsePrompt(prompt);\n const { output, executor } =\n await this.taskExecutor.createTypeQueryExecution(\n 'Boolean',\n textPrompt,\n opt,\n multimodalPrompt,\n );\n await this.afterTaskRunning(executor);\n return output as boolean;\n }\n\n async aiNumber(\n prompt: TUserPrompt,\n opt: InsightExtractOption = defaultInsightExtractOption,\n ): Promise<number> {\n const { textPrompt, multimodalPrompt } = parsePrompt(prompt);\n const { output, executor } =\n await this.taskExecutor.createTypeQueryExecution(\n 'Number',\n textPrompt,\n opt,\n multimodalPrompt,\n );\n await this.afterTaskRunning(executor);\n return output as number;\n }\n\n async aiString(\n prompt: TUserPrompt,\n opt: InsightExtractOption = defaultInsightExtractOption,\n ): Promise<string> {\n const { textPrompt, multimodalPrompt } = parsePrompt(prompt);\n const { output, executor } =\n await this.taskExecutor.createTypeQueryExecution(\n 'String',\n textPrompt,\n opt,\n multimodalPrompt,\n );\n await this.afterTaskRunning(executor);\n return output as string;\n }\n\n async aiAsk(\n prompt: TUserPrompt,\n opt: InsightExtractOption = defaultInsightExtractOption,\n ): Promise<string> {\n return this.aiString(prompt, opt);\n }\n\n async describeElementAtPoint(\n center: [number, number],\n opt?: {\n verifyPrompt?: boolean;\n retryLimit?: number;\n deepThink?: boolean;\n } & LocatorValidatorOption,\n ): Promise<AgentDescribeElementAtPointResult> {\n const { verifyPrompt = true, retryLimit = 3 } = opt || {};\n\n let success = false;\n let retryCount = 0;\n let resultPrompt = '';\n let deepThink = opt?.deepThink || false;\n let verifyResult: LocateValidatorResult | undefined;\n\n while (!success && retryCount < retryLimit) {\n if (retryCount >= 2) {\n deepThink = true;\n }\n debug(\n 'aiDescribe',\n center,\n 'verifyPrompt',\n verifyPrompt,\n 'retryCount',\n retryCount,\n 'deepThink',\n deepThink,\n );\n const text = await this.insight.describe(center, { deepThink });\n debug('aiDescribe text', text);\n assert(text.description, `failed to describe element at [${center}]`);\n resultPrompt = text.description;\n\n verifyResult = await this.verifyLocator(\n resultPrompt,\n deepThink ? { deepThink: true } : undefined,\n center,\n opt,\n );\n if (verifyResult.pass) {\n success = true;\n } else {\n retryCount++;\n }\n }\n\n return {\n prompt: resultPrompt,\n deepThink,\n verifyResult,\n };\n }\n\n async verifyLocator(\n prompt: string,\n locateOpt: LocateOption | undefined,\n expectCenter: [number, number],\n verifyLocateOption?: LocatorValidatorOption,\n ): Promise<LocateValidatorResult> {\n debug('verifyLocator', prompt, locateOpt, expectCenter, verifyLocateOption);\n\n const { center: verifyCenter, rect: verifyRect } = await this.aiLocate(\n prompt,\n locateOpt,\n );\n const distance = distanceOfTwoPoints(expectCenter, verifyCenter);\n const included = includedInRect(expectCenter, verifyRect);\n const pass =\n distance <= (verifyLocateOption?.centerDistanceThreshold || 20) ||\n included;\n const verifyResult = {\n pass,\n rect: verifyRect,\n center: verifyCenter,\n centerDistance: distance,\n };\n debug('aiDescribe verifyResult', verifyResult);\n return verifyResult;\n }\n\n async aiLocate(prompt: TUserPrompt, opt?: LocateOption) {\n const locateParam = buildDetailedLocateParam(prompt, opt);\n assert(locateParam, 'cannot get locate param for aiLocate');\n const locatePlan = locatePlanForLocate(locateParam);\n const plans = [locatePlan];\n const { executor, output } = await this.taskExecutor.runPlans(\n taskTitleStr('Locate', locateParamStr(locateParam)),\n plans,\n );\n await this.afterTaskRunning(executor);\n\n const { element } = output;\n\n return {\n rect: element?.rect,\n center: element?.center,\n scale: (await this.page.size()).dpr,\n } as Pick<LocateResultElement, 'rect' | 'center'> & {\n scale: number;\n };\n }\n\n async aiAssert(\n assertion: TUserPrompt,\n msg?: string,\n opt?: AgentAssertOpt & InsightExtractOption,\n ) {\n const insightOpt: InsightExtractOption = {\n domIncluded: opt?.domIncluded ?? defaultInsightExtractOption.domIncluded,\n screenshotIncluded:\n opt?.screenshotIncluded ??\n defaultInsightExtractOption.screenshotIncluded,\n returnThought: opt?.returnThought ?? true,\n isWaitForAssert: opt?.isWaitForAssert,\n doNotThrowError: opt?.doNotThrowError,\n };\n\n const { output, executor, thought } = await this.taskExecutor.assert(\n assertion,\n insightOpt,\n );\n await this.afterTaskRunning(executor, true);\n\n const message = output\n ? undefined\n : `Assertion failed: ${msg || assertion}\\nReason: ${\n thought || executor.latestErrorTask()?.error || '(no_reason)'\n }`;\n\n if (opt?.keepRawResponse) {\n return {\n pass: output,\n thought,\n message,\n };\n }\n\n if (!output) {\n throw new Error(message);\n }\n }\n\n async aiWaitFor(assertion: TUserPrompt, opt?: AgentWaitForOpt) {\n const { executor } = await this.taskExecutor.waitFor(assertion, {\n timeoutMs: opt?.timeoutMs || 15 * 1000,\n checkIntervalMs: opt?.checkIntervalMs || 3 * 1000,\n });\n await this.afterTaskRunning(executor, true);\n\n if (executor.isInErrorState()) {\n const errorTask = executor.latestErrorTask();\n throw new Error(`${errorTask?.error}\\n${errorTask?.errorStack}`);\n }\n }\n\n async ai(taskPrompt: string, type = 'action') {\n if (type === 'action') {\n return this.aiAction(taskPrompt);\n }\n if (type === 'query') {\n return this.aiQuery(taskPrompt);\n }\n\n if (type === 'assert') {\n return this.aiAssert(taskPrompt);\n }\n\n if (type === 'tap') {\n return this.aiTap(taskPrompt);\n }\n\n if (type === 'rightClick') {\n return this.aiRightClick(taskPrompt);\n }\n\n throw new Error(\n `Unknown type: ${type}, only support 'action', 'query', 'assert', 'tap', 'rightClick'`,\n );\n }\n\n async runYaml(yamlScriptContent: string): Promise<{\n result: Record<string, any>;\n }> {\n const script = parseYamlScript(yamlScriptContent, 'yaml', true);\n const player = new ScriptPlayer(script, async (target) => {\n return { agent: this, freeFn: [] };\n });\n await player.run();\n\n if (player.status === 'error') {\n const errors = player.taskStatusList\n .filter((task) => task.status === 'error')\n .map((task) => {\n return `task - ${task.name}: ${task.error?.message}`;\n })\n .join('\\n');\n throw new Error(`Error(s) occurred in running yaml script:\\n${errors}`);\n }\n\n return {\n result: player.result,\n };\n }\n\n async evaluateJavaScript(script: string) {\n assert(\n this.page.evaluateJavaScript,\n 'evaluateJavaScript is not supported in current agent',\n );\n return this.page.evaluateJavaScript(script);\n }\n\n async destroy() {\n await this.page.destroy();\n this.resetDump(); // reset dump to release memory\n this.destroyed = true;\n }\n\n async logScreenshot(\n title?: string,\n opt?: {\n content: string;\n },\n ) {\n // 1. screenshot\n const base64 = await this.page.screenshotBase64();\n const now = Date.now();\n // 2. build recorder\n const recorder: ExecutionRecorderItem[] = [\n {\n type: 'screenshot',\n ts: now,\n screenshot: base64,\n },\n ];\n // 3. build ExecutionTaskLog\n const task: ExecutionTaskLog = {\n type: 'Log',\n subType: 'Screenshot',\n status: 'finished',\n recorder,\n timing: {\n start: now,\n end: now,\n cost: 0,\n },\n param: {\n content: opt?.content || '',\n },\n executor: async () => {},\n };\n // 4. build ExecutionDump\n const executionDump: ExecutionDump = {\n sdkVersion: '',\n logTime: now,\n name: `Log - ${title || 'untitled'}`,\n description: opt?.content || '',\n tasks: [task],\n };\n // 5. append to execution dump\n this.appendExecutionDump(executionDump);\n\n try {\n this.onDumpUpdate?.(this.dumpDataString());\n } catch (error) {\n console.error('Failed to update dump', error);\n }\n\n this.writeOutActionDumps();\n }\n\n _unstableLogContent() {\n const { groupName, groupDescription, executions } = this.dump;\n const newExecutions = Array.isArray(executions)\n ? executions.map((execution: any) => {\n const { tasks, ...restExecution } = execution;\n let newTasks = tasks;\n if (Array.isArray(tasks)) {\n newTasks = tasks.map((task: any) => {\n // only remove pageContext and log from task\n const { pageContext, log, ...restTask } = task;\n return restTask;\n });\n }\n return { ...restExecution, ...(newTasks ? { tasks: newTasks } : {}) };\n })\n : [];\n return {\n groupName,\n groupDescription,\n executions: newExecutions,\n };\n }\n\n /**\n * Freezes the current page context to be reused in subsequent AI operations\n * This avoids recalculating page context for each operation\n */\n async freezePageContext(): Promise<void> {\n debug('Freezing page context');\n const context = await this._snapshotContext();\n // Mark the context as frozen\n context._isFrozen = true;\n this.frozenPageContext = context;\n debug('Page context frozen successfully');\n }\n\n /**\n * Unfreezes the page context, allowing AI operations to calculate context dynamically\n */\n async unfreezePageContext(): Promise<void> {\n debug('Unfreezing page context');\n this.frozenPageContext = undefined;\n debug('Page context unfrozen successfully');\n }\n}\n"],"names":["debug","getDebug","distanceOfTwoPoints","p1","p2","x1","y1","x2","y2","Math","includedInRect","point","rect","x","y","left","top","width","height","defaultInsightExtractOption","Agent","action","commonContextParser","prompt","execution","trimmedExecution","trimContextByViewport","currentDump","stringifyDumpData","reportHTMLContent","Error","generateReport","autoPrintReportMsg","writeLogFile","groupedActionDumpFileExt","printReportMsg","task","param","paramStr","tip","typeStr","executor","doNotThrowError","_this","error","console","errorTask","type","opt","actionPlan","plans","Boolean","title","taskTitleStr","locateParamStr","output","locatePrompt","assert","detailedLocateParam","buildDetailedLocateParam","locatePromptOrValue","locatePromptOrOpt","optOrUndefined","value","optWithValue","locatePromptOrKeyName","keyName","undefined","locatePromptOrScrollParam","scrollParam","taskPrompt","_this_taskCache","_this_taskCache1","modelPreferences","cacheable","isVlmUiTars","vlLocateMode","matchedCache","_matchedCache_cacheContent","_matchedCache_cacheContent1","yaml","yamlContent","yamlFlowStr","demand","textPrompt","multimodalPrompt","parsePrompt","center","verifyPrompt","retryLimit","success","retryCount","resultPrompt","deepThink","verifyResult","text","locateOpt","expectCenter","verifyLocateOption","verifyCenter","verifyRect","distance","included","pass","locateParam","locatePlan","locatePlanForLocate","element","assertion","msg","_executor_latestErrorTask","insightOpt","thought","message","yamlScriptContent","script","parseYamlScript","player","ScriptPlayer","target","errors","_task_error","base64","now","Date","recorder","executionDump","groupName","groupDescription","executions","newExecutions","Array","tasks","restExecution","newTasks","pageContext","log","restTask","context","page","opts","Object","globalConfigManager","Insight","TaskCache","MIDSCENE_CACHE","PageTaskExecutor","getReportFileName"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAgEA,MAAMA,QAAQC,SAAS;AAEvB,MAAMC,sBAAsB,CAACC,IAAsBC;IACjD,MAAM,CAACC,IAAIC,GAAG,GAAGH;IACjB,MAAM,CAACI,IAAIC,GAAG,GAAGJ;IACjB,OAAOK,KAAK,KAAK,CAACA,KAAK,IAAI,CAAEJ,AAAAA,CAAAA,KAAKE,EAAC,KAAM,IAAKD,AAAAA,CAAAA,KAAKE,EAAC,KAAM;AAC5D;AAEA,MAAME,iBAAiB,CAACC,OAAyBC;IAC/C,MAAM,CAACC,GAAGC,EAAE,GAAGH;IACf,MAAM,EAAEI,IAAI,EAAEC,GAAG,EAAEC,KAAK,EAAEC,MAAM,EAAE,GAAGN;IACrC,OAAOC,KAAKE,QAAQF,KAAKE,OAAOE,SAASH,KAAKE,OAAOF,KAAKE,MAAME;AAClE;AAEA,MAAMC,8BAAoD;IACxD,aAAa;IACb,oBAAoB;AACtB;AAkBO,MAAMC;IA6EX,MAAM,iBAA0C;QAC9C,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW;IAC9B;IAEA,MAAM,aAAaC,MAAsB,EAAsB;QAE7D,IAAI,IAAI,CAAC,iBAAiB,EAAE;YAC1BrB,MAAM,yCAAyCqB;YAC/C,OAAO,IAAI,CAAC,iBAAiB;QAC/B;QAEA,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YACxBrB,MAAM,qCAAqCqB;YAC3C,OAAO,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU;QACnC;QACErB,MAAM,yCAAyCqB;QAC/C,OAAO,MAAMC,oBAAoB,IAAI,CAAC,IAAI;IAE9C;IAEA,MAAM,mBAAuC;QAC3C,OAAO,MAAM,IAAI,CAAC,YAAY,CAAC;IACjC;IAEA,MAAM,mBAAmBC,MAAc,EAAE;QACvC,IAAI,CAAC,IAAI,CAAC,eAAe,GAAGA;IAC9B;IAEA,YAAY;QACV,IAAI,CAAC,IAAI,GAAG;YACV,WAAW,IAAI,CAAC,IAAI,CAAC,SAAS;YAC9B,kBAAkB,IAAI,CAAC,IAAI,CAAC,gBAAgB;YAC5C,YAAY,EAAE;YACd,aAAa,EAAE;QACjB;QAEA,OAAO,IAAI,CAAC,IAAI;IAClB;IAEA,oBAAoBC,SAAwB,EAAE;QAE5C,MAAMC,mBAAmBC,sBAAsBF;QAC/C,MAAMG,cAAc,IAAI,CAAC,IAAI;QAC7BA,YAAY,UAAU,CAAC,IAAI,CAACF;IAC9B;IAEA,iBAAiB;QAEf,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS;QACzC,IAAI,CAAC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB;QACvD,OAAOG,kBAAkB,IAAI,CAAC,IAAI;IACpC;IAEA,mBAAmB;QACjB,OAAOC,kBAAkB,IAAI,CAAC,cAAc;IAC9C;IAEA,sBAAsB;QACpB,IAAI,IAAI,CAAC,SAAS,EAChB,MAAM,IAAIC,MACR;QAGJ,MAAM,EAAEC,cAAc,EAAEC,kBAAkB,EAAE,GAAG,IAAI,CAAC,IAAI;QACxD,IAAI,CAAC,UAAU,GAAGC,aAAa;YAC7B,UAAU,IAAI,CAAC,cAAc;YAC7B,SAASC;YACT,aAAa,IAAI,CAAC,cAAc;YAChC,MAAM;YACNH;QACF;QACA/B,MAAM,uBAAuB,IAAI,CAAC,UAAU;QAC5C,IAAI+B,kBAAkBC,sBAAsB,IAAI,CAAC,UAAU,EACzDG,eAAe,IAAI,CAAC,UAAU;IAElC;IAEA,MAAc,uBAAuBC,IAAmB,EAAE;QACxD,MAAMC,QAAQC,SAASF;QACvB,MAAMG,MAAMF,QAAQ,GAAGG,QAAQJ,MAAM,GAAG,EAAEC,OAAO,GAAGG,QAAQJ;QAE5D,IAAI,IAAI,CAAC,cAAc,EACrB,MAAM,IAAI,CAAC,cAAc,CAACG;IAE9B;IAEA,MAAc,iBAAiBE,QAAkB,EAAEC,kBAAkB,KAAK,EAAE;QAC1E,IAAI,CAAC,mBAAmB,CAACD,SAAS,IAAI;QAEtC,IAAI;gBACIE,oBAAAA;YAAN,eAAMA,CAAAA,qBAAAA,AAAAA,CAAAA,QAAAA,IAAI,AAAD,EAAE,YAAY,AAAD,IAAhBA,KAAAA,IAAAA,mBAAAA,IAAAA,CAAAA,OAAoB,IAAI,CAAC,cAAc,GAAE;QACjD,EAAE,OAAOC,OAAO;YACdC,QAAQ,KAAK,CAAC,yBAAyBD;QACzC;QAEA,IAAI,CAAC,mBAAmB;QAExB,IAAIH,SAAS,cAAc,MAAM,CAACC,iBAAiB;YACjD,MAAMI,YAAYL,SAAS,eAAe;YAC1C,MAAM,IAAIX,MAAM,GAAGgB,QAAAA,YAAAA,KAAAA,IAAAA,UAAW,YAAY,CAAC,EAAE,EAAEA,QAAAA,YAAAA,KAAAA,IAAAA,UAAW,UAAU,EAAE,EAAE;gBACtE,OAAOA,QAAAA,YAAAA,KAAAA,IAAAA,UAAW,KAAK;YACzB;QACF;IACF;IAEA,MAAM,wBACJC,IAAY,EACZC,GAAO,EACP;QACAhD,MAAM,2BAA2B+C,MAAM,KAAKC,KAAK,KAAKA;QAEtD,MAAMC,aAAgC;YACpC,MAAMF;YACN,OAAQC,OAAe,CAAC;YACxB,SAAS;QACX;QACAhD,MAAM,cAAciD;QAEpB,MAAMC,QAA0B;YAACD;SAAW,CAAC,MAAM,CACjDE;QAGF,MAAMC,QAAQC,aACZN,MACAO,eAAe,AAACN,CAAAA,QAAAA,MAAAA,KAAAA,IAAAA,IAAa,MAAM,AAAD,KAAK,CAAC;QAG1C,MAAM,EAAEO,MAAM,EAAEd,QAAQ,EAAE,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAACW,OAAOF;QACrE,MAAM,IAAI,CAAC,gBAAgB,CAACT;QAC5B,OAAOc;IACT;IAEA,MAAM,MAAMC,YAAyB,EAAER,GAAkB,EAAE;QACzDS,OAAOD,cAAc;QAErB,MAAME,sBAAsBC,yBAAyBH,cAAcR;QAEnE,OAAO,IAAI,CAAC,uBAAuB,CAAC,OAAO;YACzC,QAAQU;QACV;IACF;IAEA,MAAM,aAAaF,YAAyB,EAAER,GAAkB,EAAE;QAChES,OAAOD,cAAc;QAErB,MAAME,sBAAsBC,yBAAyBH,cAAcR;QAEnE,OAAO,IAAI,CAAC,uBAAuB,CAAC,cAAc;YAChD,QAAQU;QACV;IACF;IAEA,MAAM,QAAQF,YAAyB,EAAER,GAAkB,EAAE;QAC3DS,OAAOD,cAAc;QAErB,MAAME,sBAAsBC,yBAAyBH,cAAcR;QAEnE,OAAO,IAAI,CAAC,uBAAuB,CAAC,SAAS;YAC3C,QAAQU;QACV;IACF;IAmBA,MAAM,QACJE,mBAAyC,EACzCC,iBAGa,EACbC,cAA6B,EAC7B;QACA,IAAIC;QACJ,IAAIP;QACJ,IAAIR;QAKJ,IACE,AAA6B,YAA7B,OAAOa,qBACPA,AAAsB,SAAtBA,qBACA,WAAWA,mBACX;YAEAL,eAAeI;YACf,MAAMI,eAAeH;YAIrBE,QAAQC,aAAa,KAAK;YAC1BhB,MAAMgB;QACR,OAAO;YAELD,QAAQH;YACRJ,eAAeK;YACfb,MAAM;gBACJ,GAAGc,cAAc;gBACjBC;YACF;QACF;QAEAN,OACE,AAAiB,YAAjB,OAAOM,OACP;QAEFN,OAAOD,cAAc;QAErB,MAAME,sBAAsBC,yBAAyBH,cAAcR;QAEnE,OAAO,IAAI,CAAC,uBAAuB,CAAC,SAAS;YAC3C,GAAIA,OAAO,CAAC,CAAC;YACb,QAAQU;QACV;IACF;IAmBA,MAAM,gBACJO,qBAA2C,EAC3CJ,iBAGa,EACbC,cAA6B,EAC7B;QACA,IAAII;QACJ,IAAIV;QACJ,IAAIR;QAGJ,IACE,AAA6B,YAA7B,OAAOa,qBACPA,AAAsB,SAAtBA,qBACA,aAAaA,mBACb;YAEAL,eAAeS;YACfjB,MAAMa;QAGR,OAAO;YAELK,UAAUD;YACVT,eAAeK;YACfb,MAAM;gBACJ,GAAIc,kBAAkB,CAAC,CAAC;gBACxBI;YACF;QACF;QAEAT,OAAOT,QAAAA,MAAAA,KAAAA,IAAAA,IAAK,OAAO,EAAE;QAErB,MAAMU,sBAAsBF,eACxBG,yBAAyBH,cAAcR,OACvCmB;QAEJ,OAAO,IAAI,CAAC,uBAAuB,CAAC,iBAAiB;YACnD,GAAInB,OAAO,CAAC,CAAC;YACb,QAAQU;QACV;IACF;IAmBA,MAAM,SACJU,yBAAgE,EAChEP,iBAAyE,EACzEC,cAA6B,EAC7B;QACA,IAAIO;QACJ,IAAIb;QACJ,IAAIR;QAGJ,IACE,AAA6B,YAA7B,OAAOa,qBACN,gBAAeA,qBACd,gBAAgBA,qBAChB,cAAcA,iBAAgB,GAChC;YAEAL,eAAeY;YACfpB,MAAMa;QACR,OAAO;YAELQ,cAAcD;YACdZ,eAAeK;YACfb,MAAM;gBACJ,GAAIc,kBAAkB,CAAC,CAAC;gBACxB,GAAIO,eAAe,CAAC,CAAC;YACvB;QACF;QAEA,MAAMX,sBAAsBC,yBAC1BH,gBAAgB,IAChBR;QAGF,OAAO,IAAI,CAAC,uBAAuB,CAAC,UAAU;YAC5C,GAAIA,OAAO,CAAC,CAAC;YACb,QAAQU;QACV;IACF;IAEA,MAAM,SACJY,UAAkB,EAClBtB,GAEC,EACD;YAQMuB,iBACcC;QARpB,MAAMC,mBAAsC;YAAE,QAAQ;QAAW;QACjE,MAAMC,YAAY1B,QAAAA,MAAAA,KAAAA,IAAAA,IAAK,SAAS;QAEhC,MAAM2B,cAAcC,AAAmC,kBAAnCA,aAAaH;QACjC,MAAMI,eACJF,eAAeD,AAAc,UAAdA,YACXP,SAAAA,QACAI,CAAAA,kBAAAA,IAAI,CAAC,SAAS,AAAD,IAAbA,KAAAA,IAAAA,gBAAgB,cAAc,CAACD;QACrC,IAAIO,gBAAAA,SAAgBL,CAAAA,mBAAAA,IAAI,CAAC,SAAS,AAAD,IAAbA,KAAAA,IAAAA,iBAAgB,iBAAiB,AAAD,GAAG;gBAInDM,4BAMWC;YARb,MAAM,EAAEtC,QAAQ,EAAE,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,sBAAsB,CACjE6B,YAAAA,QACAQ,CAAAA,6BAAAA,aAAa,YAAY,AAAD,IAAxBA,KAAAA,IAAAA,2BAA2B,YAAY;YAGzC,MAAM,MAAM,IAAI,CAAC,gBAAgB,CAACrC;YAElCzC,MAAM;YACN,MAAMgF,OAAO,QAAAD,CAAAA,8BAAAA,aAAa,YAAY,AAAD,IAAxBA,KAAAA,IAAAA,4BAA2B,YAAY;YACpD,OAAO,IAAI,CAAC,OAAO,CAACC;QACtB;QAEA,MAAM,EAAEzB,MAAM,EAAEd,QAAQ,EAAE,GAAG,MAAOkC,CAAAA,cAChC,IAAI,CAAC,YAAY,CAAC,YAAY,CAACL,cAC/B,IAAI,CAAC,YAAY,CAAC,MAAM,CAACA,YAAY,IAAI,CAAC,IAAI,CAAC,eAAe;QAGlE,IAAI,IAAI,CAAC,SAAS,IAAIf,CAAAA,QAAAA,SAAAA,KAAAA,IAAAA,OAAQ,QAAQ,AAAD,KAAKmB,AAAc,UAAdA,WAAqB;YAC7D,MAAMO,cAAkC;gBACtC,OAAO;oBACL;wBACE,MAAMX;wBACN,MAAMf,OAAO,QAAQ;oBACvB;iBACD;YACH;YACA,MAAM2B,cAAcF,QAAAA,IAAS,CAACC;YAC9B,IAAI,CAAC,SAAS,CAAC,yBAAyB,CACtC;gBACE,MAAM;gBACN,QAAQX;gBACR,cAAcY;YAChB,GACAL;QAEJ;QAEA,MAAM,IAAI,CAAC,gBAAgB,CAACpC;QAC5B,OAAOc;IACT;IAEA,MAAM,QACJ4B,MAA2B,EAC3BnC,MAA4B7B,2BAA2B,EAClC;QACrB,MAAM,EAAEoC,MAAM,EAAEd,QAAQ,EAAE,GACxB,MAAM,IAAI,CAAC,YAAY,CAAC,wBAAwB,CAAC,SAAS0C,QAAQnC;QACpE,MAAM,IAAI,CAAC,gBAAgB,CAACP;QAC5B,OAAOc;IACT;IAEA,MAAM,UACJhC,MAAmB,EACnByB,MAA4B7B,2BAA2B,EACrC;QAClB,MAAM,EAAEiE,UAAU,EAAEC,gBAAgB,EAAE,GAAGC,YAAY/D;QACrD,MAAM,EAAEgC,MAAM,EAAEd,QAAQ,EAAE,GACxB,MAAM,IAAI,CAAC,YAAY,CAAC,wBAAwB,CAC9C,WACA2C,YACApC,KACAqC;QAEJ,MAAM,IAAI,CAAC,gBAAgB,CAAC5C;QAC5B,OAAOc;IACT;IAEA,MAAM,SACJhC,MAAmB,EACnByB,MAA4B7B,2BAA2B,EACtC;QACjB,MAAM,EAAEiE,UAAU,EAAEC,gBAAgB,EAAE,GAAGC,YAAY/D;QACrD,MAAM,EAAEgC,MAAM,EAAEd,QAAQ,EAAE,GACxB,MAAM,IAAI,CAAC,YAAY,CAAC,wBAAwB,CAC9C,UACA2C,YACApC,KACAqC;QAEJ,MAAM,IAAI,CAAC,gBAAgB,CAAC5C;QAC5B,OAAOc;IACT;IAEA,MAAM,SACJhC,MAAmB,EACnByB,MAA4B7B,2BAA2B,EACtC;QACjB,MAAM,EAAEiE,UAAU,EAAEC,gBAAgB,EAAE,GAAGC,YAAY/D;QACrD,MAAM,EAAEgC,MAAM,EAAEd,QAAQ,EAAE,GACxB,MAAM,IAAI,CAAC,YAAY,CAAC,wBAAwB,CAC9C,UACA2C,YACApC,KACAqC;QAEJ,MAAM,IAAI,CAAC,gBAAgB,CAAC5C;QAC5B,OAAOc;IACT;IAEA,MAAM,MACJhC,MAAmB,EACnByB,MAA4B7B,2BAA2B,EACtC;QACjB,OAAO,IAAI,CAAC,QAAQ,CAACI,QAAQyB;IAC/B;IAEA,MAAM,uBACJuC,MAAwB,EACxBvC,GAI0B,EACkB;QAC5C,MAAM,EAAEwC,eAAe,IAAI,EAAEC,aAAa,CAAC,EAAE,GAAGzC,OAAO,CAAC;QAExD,IAAI0C,UAAU;QACd,IAAIC,aAAa;QACjB,IAAIC,eAAe;QACnB,IAAIC,YAAY7C,AAAAA,CAAAA,QAAAA,MAAAA,KAAAA,IAAAA,IAAK,SAAS,AAAD,KAAK;QAClC,IAAI8C;QAEJ,MAAO,CAACJ,WAAWC,aAAaF,WAAY;YAC1C,IAAIE,cAAc,GAChBE,YAAY;YAEd7F,MACE,cACAuF,QACA,gBACAC,cACA,cACAG,YACA,aACAE;YAEF,MAAME,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAACR,QAAQ;gBAAEM;YAAU;YAC7D7F,MAAM,mBAAmB+F;YACzBtC,OAAOsC,KAAK,WAAW,EAAE,CAAC,+BAA+B,EAAER,OAAO,CAAC,CAAC;YACpEK,eAAeG,KAAK,WAAW;YAE/BD,eAAe,MAAM,IAAI,CAAC,aAAa,CACrCF,cACAC,YAAY;gBAAE,WAAW;YAAK,IAAI1B,QAClCoB,QACAvC;YAEF,IAAI8C,aAAa,IAAI,EACnBJ,UAAU;iBAEVC;QAEJ;QAEA,OAAO;YACL,QAAQC;YACRC;YACAC;QACF;IACF;IAEA,MAAM,cACJvE,MAAc,EACdyE,SAAmC,EACnCC,YAA8B,EAC9BC,kBAA2C,EACX;QAChClG,MAAM,iBAAiBuB,QAAQyE,WAAWC,cAAcC;QAExD,MAAM,EAAE,QAAQC,YAAY,EAAE,MAAMC,UAAU,EAAE,GAAG,MAAM,IAAI,CAAC,QAAQ,CACpE7E,QACAyE;QAEF,MAAMK,WAAWnG,oBAAoB+F,cAAcE;QACnD,MAAMG,WAAW5F,eAAeuF,cAAcG;QAC9C,MAAMG,OACJF,YAAaH,CAAAA,CAAAA,QAAAA,qBAAAA,KAAAA,IAAAA,mBAAoB,uBAAuB,AAAD,KAAK,EAAC,KAC7DI;QACF,MAAMR,eAAe;YACnBS;YACA,MAAMH;YACN,QAAQD;YACR,gBAAgBE;QAClB;QACArG,MAAM,2BAA2B8F;QACjC,OAAOA;IACT;IAEA,MAAM,SAASvE,MAAmB,EAAEyB,GAAkB,EAAE;QACtD,MAAMwD,cAAc7C,yBAAyBpC,QAAQyB;QACrDS,OAAO+C,aAAa;QACpB,MAAMC,aAAaC,oBAAoBF;QACvC,MAAMtD,QAAQ;YAACuD;SAAW;QAC1B,MAAM,EAAEhE,QAAQ,EAAEc,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAC3DF,aAAa,UAAUC,eAAekD,eACtCtD;QAEF,MAAM,IAAI,CAAC,gBAAgB,CAACT;QAE5B,MAAM,EAAEkE,OAAO,EAAE,GAAGpD;QAEpB,OAAO;YACL,MAAMoD,QAAAA,UAAAA,KAAAA,IAAAA,QAAS,IAAI;YACnB,QAAQA,QAAAA,UAAAA,KAAAA,IAAAA,QAAS,MAAM;YACvB,OAAQ,OAAM,IAAI,CAAC,IAAI,CAAC,IAAI,EAAC,EAAG,GAAG;QACrC;IAGF;IAEA,MAAM,SACJC,SAAsB,EACtBC,GAAY,EACZ7D,GAA2C,EAC3C;YAoBiB8D;QAnBjB,MAAMC,aAAmC;YACvC,aAAa/D,AAAAA,CAAAA,QAAAA,MAAAA,KAAAA,IAAAA,IAAK,WAAW,AAAD,KAAK7B,4BAA4B,WAAW;YACxE,oBACE6B,AAAAA,CAAAA,QAAAA,MAAAA,KAAAA,IAAAA,IAAK,kBAAkB,AAAD,KACtB7B,4BAA4B,kBAAkB;YAChD,eAAe6B,AAAAA,CAAAA,QAAAA,MAAAA,KAAAA,IAAAA,IAAK,aAAa,AAAD,KAAK;YACrC,iBAAiBA,QAAAA,MAAAA,KAAAA,IAAAA,IAAK,eAAe;YACrC,iBAAiBA,QAAAA,MAAAA,KAAAA,IAAAA,IAAK,eAAe;QACvC;QAEA,MAAM,EAAEO,MAAM,EAAEd,QAAQ,EAAEuE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAClEJ,WACAG;QAEF,MAAM,IAAI,CAAC,gBAAgB,CAACtE,UAAU;QAEtC,MAAMwE,UAAU1D,SACZY,SACA,CAAC,kBAAkB,EAAE0C,OAAOD,UAAU,UAAU,EAC9CI,WAAAA,SAAWF,CAAAA,4BAAAA,SAAS,eAAe,EAAC,IAAzBA,KAAAA,IAAAA,0BAA4B,KAAK,AAAD,KAAK,eAChD;QAEN,IAAI9D,QAAAA,MAAAA,KAAAA,IAAAA,IAAK,eAAe,EACtB,OAAO;YACL,MAAMO;YACNyD;YACAC;QACF;QAGF,IAAI,CAAC1D,QACH,MAAM,IAAIzB,MAAMmF;IAEpB;IAEA,MAAM,UAAUL,SAAsB,EAAE5D,GAAqB,EAAE;QAC7D,MAAM,EAAEP,QAAQ,EAAE,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAACmE,WAAW;YAC9D,WAAW5D,AAAAA,CAAAA,QAAAA,MAAAA,KAAAA,IAAAA,IAAK,SAAS,AAAD,KAAK;YAC7B,iBAAiBA,AAAAA,CAAAA,QAAAA,MAAAA,KAAAA,IAAAA,IAAK,eAAe,AAAD,KAAK;QAC3C;QACA,MAAM,IAAI,CAAC,gBAAgB,CAACP,UAAU;QAEtC,IAAIA,SAAS,cAAc,IAAI;YAC7B,MAAMK,YAAYL,SAAS,eAAe;YAC1C,MAAM,IAAIX,MAAM,GAAGgB,QAAAA,YAAAA,KAAAA,IAAAA,UAAW,KAAK,CAAC,EAAE,EAAEA,QAAAA,YAAAA,KAAAA,IAAAA,UAAW,UAAU,EAAE;QACjE;IACF;IAEA,MAAM,GAAGwB,UAAkB,EAAEvB,OAAO,QAAQ,EAAE;QAC5C,IAAIA,AAAS,aAATA,MACF,OAAO,IAAI,CAAC,QAAQ,CAACuB;QAEvB,IAAIvB,AAAS,YAATA,MACF,OAAO,IAAI,CAAC,OAAO,CAACuB;QAGtB,IAAIvB,AAAS,aAATA,MACF,OAAO,IAAI,CAAC,QAAQ,CAACuB;QAGvB,IAAIvB,AAAS,UAATA,MACF,OAAO,IAAI,CAAC,KAAK,CAACuB;QAGpB,IAAIvB,AAAS,iBAATA,MACF,OAAO,IAAI,CAAC,YAAY,CAACuB;QAG3B,MAAM,IAAIxC,MACR,CAAC,cAAc,EAAEiB,KAAK,+DAA+D,CAAC;IAE1F;IAEA,MAAM,QAAQmE,iBAAyB,EAEpC;QACD,MAAMC,SAASC,gBAAgBF,mBAAmB,QAAQ;QAC1D,MAAMG,SAAS,IAAIC,aAAaH,QAAQ,OAAOI,SACtC;gBAAE,OAAO,IAAI;gBAAE,QAAQ,EAAE;YAAC;QAEnC,MAAMF,OAAO,GAAG;QAEhB,IAAIA,AAAkB,YAAlBA,OAAO,MAAM,EAAc;YAC7B,MAAMG,SAASH,OAAO,cAAc,CACjC,MAAM,CAAC,CAACjF,OAASA,AAAgB,YAAhBA,KAAK,MAAM,EAC5B,GAAG,CAAC,CAACA;oBAC2BqF;gBAA/B,OAAO,CAAC,OAAO,EAAErF,KAAK,IAAI,CAAC,EAAE,EAAE,QAAAqF,CAAAA,cAAAA,KAAK,KAAK,AAAD,IAATA,KAAAA,IAAAA,YAAY,OAAO,EAAE;YACtD,GACC,IAAI,CAAC;YACR,MAAM,IAAI3F,MAAM,CAAC,2CAA2C,EAAE0F,QAAQ;QACxE;QAEA,OAAO;YACL,QAAQH,OAAO,MAAM;QACvB;IACF;IAEA,MAAM,mBAAmBF,MAAc,EAAE;QACvC1D,OACE,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAC5B;QAEF,OAAO,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC0D;IACtC;IAEA,MAAM,UAAU;QACd,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO;QACvB,IAAI,CAAC,SAAS;QACd,IAAI,CAAC,SAAS,GAAG;IACnB;IAEA,MAAM,cACJ/D,KAAc,EACdJ,GAEC,EACD;QAEA,MAAM0E,SAAS,MAAM,IAAI,CAAC,IAAI,CAAC,gBAAgB;QAC/C,MAAMC,MAAMC,KAAK,GAAG;QAEpB,MAAMC,WAAoC;YACxC;gBACE,MAAM;gBACN,IAAIF;gBACJ,YAAYD;YACd;SACD;QAED,MAAMtF,OAAyB;YAC7B,MAAM;YACN,SAAS;YACT,QAAQ;YACRyF;YACA,QAAQ;gBACN,OAAOF;gBACP,KAAKA;gBACL,MAAM;YACR;YACA,OAAO;gBACL,SAAS3E,AAAAA,CAAAA,QAAAA,MAAAA,KAAAA,IAAAA,IAAK,OAAO,AAAD,KAAK;YAC3B;YACA,UAAU,WAAa;QACzB;QAEA,MAAM8E,gBAA+B;YACnC,YAAY;YACZ,SAASH;YACT,MAAM,CAAC,MAAM,EAAEvE,SAAS,YAAY;YACpC,aAAaJ,AAAAA,CAAAA,QAAAA,MAAAA,KAAAA,IAAAA,IAAK,OAAO,AAAD,KAAK;YAC7B,OAAO;gBAACZ;aAAK;QACf;QAEA,IAAI,CAAC,mBAAmB,CAAC0F;QAEzB,IAAI;gBACFnF,oBAAAA;oBAAAA,CAAAA,qBAAAA,AAAAA,CAAAA,QAAAA,IAAI,AAAD,EAAE,YAAY,AAAD,KAAhBA,mBAAAA,IAAAA,CAAAA,OAAoB,IAAI,CAAC,cAAc;QACzC,EAAE,OAAOC,OAAO;YACdC,QAAQ,KAAK,CAAC,yBAAyBD;QACzC;QAEA,IAAI,CAAC,mBAAmB;IAC1B;IAEA,sBAAsB;QACpB,MAAM,EAAEmF,SAAS,EAAEC,gBAAgB,EAAEC,UAAU,EAAE,GAAG,IAAI,CAAC,IAAI;QAC7D,MAAMC,gBAAgBC,MAAM,OAAO,CAACF,cAChCA,WAAW,GAAG,CAAC,CAACzG;YACd,MAAM,EAAE4G,KAAK,EAAE,GAAGC,eAAe,GAAG7G;YACpC,IAAI8G,WAAWF;YACf,IAAID,MAAM,OAAO,CAACC,QAChBE,WAAWF,MAAM,GAAG,CAAC,CAAChG;gBAEpB,MAAM,EAAEmG,WAAW,EAAEC,GAAG,EAAE,GAAGC,UAAU,GAAGrG;gBAC1C,OAAOqG;YACT;YAEF,OAAO;gBAAE,GAAGJ,aAAa;gBAAE,GAAIC,WAAW;oBAAE,OAAOA;gBAAS,IAAI,CAAC,CAAC;YAAE;QACtE,KACA,EAAE;QACN,OAAO;YACLP;YACAC;YACA,YAAYE;QACd;IACF;IAMA,MAAM,oBAAmC;QACvClI,MAAM;QACN,MAAM0I,UAAU,MAAM,IAAI,CAAC,gBAAgB;QAE3CA,QAAQ,SAAS,GAAG;QACpB,IAAI,CAAC,iBAAiB,GAAGA;QACzB1I,MAAM;IACR;IAKA,MAAM,sBAAqC;QACzCA,MAAM;QACN,IAAI,CAAC,iBAAiB,GAAGmE;QACzBnE,MAAM;IACR;IAh0BA,YAAY2I,IAAc,EAAEC,IAAmB,CAAE;QAhCjD;QAEA;QAEA;QAEA;QAEA;QAEA;QAEA;QAKA,kCAAU;QAEV;QAEA;QAEA;QAEA,oCAAY;QAKZ,uBAAQ,qBAAR;QAGE,IAAI,CAAC,IAAI,GAAGD;QACZ,IAAI,CAAC,IAAI,GAAGE,OAAO,MAAM,CACvB;YACE,gBAAgB;YAChB,oBAAoB;YACpB,WAAW;YACX,kBAAkB;QACpB,GACAD,QAAQ,CAAC;QAEX,IAAIA,AAAAA,CAAAA,QAAAA,OAAAA,KAAAA,IAAAA,KAAM,WAAW,AAAD,KAAK,AAA6B,cAA7B,OAAOA,CAAAA,QAAAA,OAAAA,KAAAA,IAAAA,KAAM,WAAW,AAAD,GAC9C,MAAM,IAAI9G,MACR,CAAC,+DAA+D,EAAE,OAAO8G,CAAAA,QAAAA,OAAAA,KAAAA,IAAAA,KAAM,WAAW,AAAD,GAAG;QAIhGE,oBAAoB,IAAI,CAACF,QAAAA,OAAAA,KAAAA,IAAAA,KAAM,WAAW;QAE1C,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc;QAI9C,IAAI,CAAC,OAAO,GAAG,IAAIG,QAAQ,OAAO1H,SACzB,IAAI,CAAC,YAAY,CAACA;QAG3B,IAAIuH,AAAAA,CAAAA,QAAAA,OAAAA,KAAAA,IAAAA,KAAM,OAAO,AAAD,KAAK,AAAuB,cAAvB,IAAI,CAAC,IAAI,CAAC,QAAQ,EACrC,IAAI,CAAC,SAAS,GAAG,IAAII,UACnBJ,KAAK,OAAO,EACZE,oBAAoB,qBAAqB,CAACG;QAI9C,IAAI,CAAC,YAAY,GAAG,IAAIC,iBAAiB,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE;YAChE,WAAW,IAAI,CAAC,SAAS;YACzB,aAAa,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI;QACpD;QACA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS;QAC1B,IAAI,CAAC,cAAc,GACjBN,AAAAA,CAAAA,QAAAA,OAAAA,KAAAA,IAAAA,KAAM,cAAc,AAAD,KACnBO,kBAAkBP,AAAAA,CAAAA,QAAAA,OAAAA,KAAAA,IAAAA,KAAM,MAAM,AAAD,KAAK,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI;IAC5D;AAuxBF"}
|
|
1
|
+
{"version":3,"file":"agent/agent.mjs","sources":["webpack://@midscene/core/./src/agent/agent.ts"],"sourcesContent":["import {\n type AgentAssertOpt,\n type AgentDescribeElementAtPointResult,\n type AgentWaitForOpt,\n type DeviceAction,\n type ExecutionDump,\n type ExecutionRecorderItem,\n type ExecutionTask,\n type ExecutionTaskLog,\n type Executor,\n type GroupedActionDump,\n Insight,\n type InsightAction,\n type InsightExtractOption,\n type InsightExtractParam,\n type LocateOption,\n type LocateResultElement,\n type LocateValidatorResult,\n type LocatorValidatorOption,\n type MidsceneYamlScript,\n type OnTaskStartTip,\n type PlanningAction,\n type Rect,\n type ScrollParam,\n type TUserPrompt,\n type UIContext,\n} from '../index';\n\nimport yaml from 'js-yaml';\n\nimport {\n groupedActionDumpFileExt,\n reportHTMLContent,\n stringifyDumpData,\n writeLogFile,\n} from '@/utils';\nimport {\n ScriptPlayer,\n buildDetailedLocateParam,\n parseYamlScript,\n} from '../yaml/index';\n\nimport type { AbstractInterface } from '@/device';\nimport {\n type IModelPreferences,\n MIDSCENE_CACHE,\n type TModelConfigFn,\n globalConfigManager,\n vlLocateMode,\n} from '@midscene/shared/env';\nimport { getDebug } from '@midscene/shared/logger';\nimport { assert } from '@midscene/shared/utils';\n// import type { AndroidDeviceInputOpt } from '../device';\nimport { TaskCache } from './task-cache';\nimport { TaskExecutor, locatePlanForLocate } from './tasks';\nimport { locateParamStr, paramStr, taskTitleStr, typeStr } from './ui-utils';\nimport {\n commonContextParser,\n getReportFileName,\n parsePrompt,\n printReportMsg,\n} from './utils';\nimport { trimContextByViewport } from './utils';\n\nconst debug = getDebug('agent');\n\nconst distanceOfTwoPoints = (p1: [number, number], p2: [number, number]) => {\n const [x1, y1] = p1;\n const [x2, y2] = p2;\n return Math.round(Math.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2));\n};\n\nconst includedInRect = (point: [number, number], rect: Rect) => {\n const [x, y] = point;\n const { left, top, width, height } = rect;\n return x >= left && x <= left + width && y >= top && y <= top + height;\n};\n\nconst defaultInsightExtractOption: InsightExtractOption = {\n domIncluded: false,\n screenshotIncluded: true,\n};\n\nexport interface AgentOpt {\n testId?: string;\n cacheId?: string;\n groupName?: string;\n groupDescription?: string;\n /* if auto generate report, default true */\n generateReport?: boolean;\n /* if auto print report msg, default true */\n autoPrintReportMsg?: boolean;\n onTaskStartTip?: OnTaskStartTip;\n aiActionContext?: string;\n /* custom report file name */\n reportFileName?: string;\n modelConfig?: TModelConfigFn;\n}\n\nexport class Agent<\n InterfaceType extends AbstractInterface = AbstractInterface,\n> {\n interface: InterfaceType;\n\n insight: Insight;\n\n dump: GroupedActionDump;\n\n reportFile?: string | null;\n\n reportFileName?: string;\n\n taskExecutor: TaskExecutor;\n\n opts: AgentOpt;\n\n /**\n * If true, the agent will not perform any actions\n */\n dryMode = false;\n\n onTaskStartTip?: OnTaskStartTip;\n\n taskCache?: TaskCache;\n\n onDumpUpdate?: (dump: string) => void;\n\n destroyed = false;\n\n /**\n * Frozen page context for consistent AI operations\n */\n private frozenUIContext?: UIContext;\n\n // @deprecated use .interface instead\n get page() {\n return this.interface;\n }\n\n constructor(interfaceInstance: InterfaceType, opts?: AgentOpt) {\n this.interface = interfaceInstance;\n this.opts = Object.assign(\n {\n generateReport: true,\n autoPrintReportMsg: true,\n groupName: 'Midscene Report',\n groupDescription: '',\n },\n opts || {},\n );\n if (opts?.modelConfig && typeof opts?.modelConfig !== 'function') {\n throw new Error(\n `opts.modelConfig must be one of function or undefined, but got ${typeof opts?.modelConfig}`,\n );\n }\n\n globalConfigManager.init(opts?.modelConfig);\n\n this.onTaskStartTip = this.opts.onTaskStartTip;\n\n this.insight = new Insight(async (action: InsightAction) => {\n return this.getUIContext(action);\n });\n\n if (opts?.cacheId && this.interface.interfaceType !== 'android') {\n this.taskCache = new TaskCache(\n opts.cacheId,\n globalConfigManager.getEnvConfigInBoolean(MIDSCENE_CACHE), // if we should use cache to match the element\n );\n }\n\n this.taskExecutor = new TaskExecutor(this.interface, this.insight, {\n taskCache: this.taskCache,\n onTaskStart: this.callbackOnTaskStartTip.bind(this),\n });\n this.dump = this.resetDump();\n this.reportFileName =\n opts?.reportFileName ||\n getReportFileName(opts?.testId || this.interface.interfaceType || 'web');\n }\n\n async getActionSpace(): Promise<DeviceAction[]> {\n return this.interface.actionSpace();\n }\n\n async getUIContext(action?: InsightAction): Promise<UIContext> {\n // If page context is frozen, return the frozen context for all actions\n if (this.frozenUIContext) {\n debug('Using frozen page context for action:', action);\n return this.frozenUIContext;\n }\n\n if (this.interface.getContext) {\n debug('Using page.getContext for action:', action);\n return await this.interface.getContext();\n } else {\n debug('Using commonContextParser for action:', action);\n return await commonContextParser(this.interface);\n }\n }\n\n async _snapshotContext(): Promise<UIContext> {\n return await this.getUIContext('locate');\n }\n\n async setAIActionContext(prompt: string) {\n this.opts.aiActionContext = prompt;\n }\n\n resetDump() {\n this.dump = {\n groupName: this.opts.groupName!,\n groupDescription: this.opts.groupDescription,\n executions: [],\n modelBriefs: [],\n };\n\n return this.dump;\n }\n\n appendExecutionDump(execution: ExecutionDump) {\n // use trimContextByViewport to process execution\n const trimmedExecution = trimContextByViewport(execution);\n const currentDump = this.dump;\n currentDump.executions.push(trimmedExecution);\n }\n\n dumpDataString() {\n // update dump info\n this.dump.groupName = this.opts.groupName!;\n this.dump.groupDescription = this.opts.groupDescription;\n return stringifyDumpData(this.dump);\n }\n\n reportHTMLString() {\n return reportHTMLContent(this.dumpDataString());\n }\n\n writeOutActionDumps() {\n if (this.destroyed) {\n throw new Error(\n 'PageAgent has been destroyed. Cannot update report file.',\n );\n }\n const { generateReport, autoPrintReportMsg } = this.opts;\n this.reportFile = writeLogFile({\n fileName: this.reportFileName!,\n fileExt: groupedActionDumpFileExt,\n fileContent: this.dumpDataString(),\n type: 'dump',\n generateReport,\n });\n debug('writeOutActionDumps', this.reportFile);\n if (generateReport && autoPrintReportMsg && this.reportFile) {\n printReportMsg(this.reportFile);\n }\n }\n\n private async callbackOnTaskStartTip(task: ExecutionTask) {\n const param = paramStr(task);\n const tip = param ? `${typeStr(task)} - ${param}` : typeStr(task);\n\n if (this.onTaskStartTip) {\n await this.onTaskStartTip(tip);\n }\n }\n\n private async afterTaskRunning(executor: Executor, doNotThrowError = false) {\n this.appendExecutionDump(executor.dump());\n\n try {\n await this.onDumpUpdate?.(this.dumpDataString());\n } catch (error) {\n console.error('Error in onDumpUpdate', error);\n }\n\n this.writeOutActionDumps();\n\n if (executor.isInErrorState() && !doNotThrowError) {\n const errorTask = executor.latestErrorTask();\n throw new Error(`${errorTask?.errorMessage}\\n${errorTask?.errorStack}`, {\n cause: errorTask?.error,\n });\n }\n }\n\n async callActionInActionSpace<T = any>(\n type: string,\n opt?: T, // and all other action params\n ) {\n debug('callActionInActionSpace', type, ',', opt, ',', opt);\n\n const actionPlan: PlanningAction<T> = {\n type: type as any,\n param: (opt as any) || {},\n thought: '',\n };\n debug('actionPlan', actionPlan); // , ', in which the locateParam is', locateParam);\n\n const plans: PlanningAction[] = [actionPlan].filter(\n Boolean,\n ) as PlanningAction[];\n\n const title = taskTitleStr(\n type as any,\n locateParamStr((opt as any)?.locate || {}),\n );\n\n const { output, executor } = await this.taskExecutor.runPlans(title, plans);\n await this.afterTaskRunning(executor);\n return output;\n }\n\n async aiTap(locatePrompt: TUserPrompt, opt?: LocateOption) {\n assert(locatePrompt, 'missing locate prompt for tap');\n\n const detailedLocateParam = buildDetailedLocateParam(locatePrompt, opt);\n\n return this.callActionInActionSpace('Tap', {\n locate: detailedLocateParam,\n });\n }\n\n async aiRightClick(locatePrompt: TUserPrompt, opt?: LocateOption) {\n assert(locatePrompt, 'missing locate prompt for right click');\n\n const detailedLocateParam = buildDetailedLocateParam(locatePrompt, opt);\n\n return this.callActionInActionSpace('RightClick', {\n locate: detailedLocateParam,\n });\n }\n\n async aiHover(locatePrompt: TUserPrompt, opt?: LocateOption) {\n assert(locatePrompt, 'missing locate prompt for hover');\n\n const detailedLocateParam = buildDetailedLocateParam(locatePrompt, opt);\n\n return this.callActionInActionSpace('Hover', {\n locate: detailedLocateParam,\n });\n }\n\n // New signature, always use locatePrompt as the first param\n async aiInput(\n locatePrompt: TUserPrompt,\n opt: LocateOption & { value: string }, // AndroidDeviceInputOpt &\n ): Promise<any>;\n\n // Legacy signature - deprecated\n /**\n * @deprecated Use aiInput(locatePrompt, opt) instead where opt contains the value\n */\n async aiInput(\n value: string,\n locatePrompt: TUserPrompt,\n opt?: LocateOption, // AndroidDeviceInputOpt &\n ): Promise<any>;\n\n // Implementation\n async aiInput(\n locatePromptOrValue: TUserPrompt | string,\n locatePromptOrOpt:\n | TUserPrompt\n | (LocateOption & { value: string }) // AndroidDeviceInputOpt &\n | undefined,\n optOrUndefined?: LocateOption, // AndroidDeviceInputOpt &\n ) {\n let value: string;\n let locatePrompt: TUserPrompt;\n let opt:\n | (LocateOption & { value: string }) // AndroidDeviceInputOpt &\n | undefined;\n\n // Check if using new signature (first param is locatePrompt, second has value)\n if (\n typeof locatePromptOrOpt === 'object' &&\n locatePromptOrOpt !== null &&\n 'value' in locatePromptOrOpt\n ) {\n // New signature: aiInput(locatePrompt, opt)\n locatePrompt = locatePromptOrValue as TUserPrompt;\n const optWithValue = locatePromptOrOpt as LocateOption & {\n // AndroidDeviceInputOpt &\n value: string;\n };\n value = optWithValue.value;\n opt = optWithValue;\n } else {\n // Legacy signature: aiInput(value, locatePrompt, opt)\n value = locatePromptOrValue as string;\n locatePrompt = locatePromptOrOpt as TUserPrompt;\n opt = {\n ...optOrUndefined,\n value,\n };\n }\n\n assert(\n typeof value === 'string',\n 'input value must be a string, use empty string if you want to clear the input',\n );\n assert(locatePrompt, 'missing locate prompt for input');\n\n const detailedLocateParam = buildDetailedLocateParam(locatePrompt, opt);\n\n return this.callActionInActionSpace('Input', {\n ...(opt || {}),\n locate: detailedLocateParam,\n });\n }\n\n // New signature\n async aiKeyboardPress(\n locatePrompt: TUserPrompt,\n opt: LocateOption & { keyName: string },\n ): Promise<any>;\n\n // Legacy signature - deprecated\n /**\n * @deprecated Use aiKeyboardPress(locatePrompt, opt) instead where opt contains the keyName\n */\n async aiKeyboardPress(\n keyName: string,\n locatePrompt?: TUserPrompt,\n opt?: LocateOption,\n ): Promise<any>;\n\n // Implementation\n async aiKeyboardPress(\n locatePromptOrKeyName: TUserPrompt | string,\n locatePromptOrOpt:\n | TUserPrompt\n | (LocateOption & { keyName: string })\n | undefined,\n optOrUndefined?: LocateOption,\n ) {\n let keyName: string;\n let locatePrompt: TUserPrompt | undefined;\n let opt: (LocateOption & { keyName: string }) | undefined;\n\n // Check if using new signature (first param is locatePrompt, second has keyName)\n if (\n typeof locatePromptOrOpt === 'object' &&\n locatePromptOrOpt !== null &&\n 'keyName' in locatePromptOrOpt\n ) {\n // New signature: aiKeyboardPress(locatePrompt, opt)\n locatePrompt = locatePromptOrKeyName as TUserPrompt;\n opt = locatePromptOrOpt as LocateOption & {\n keyName: string;\n };\n } else {\n // Legacy signature: aiKeyboardPress(keyName, locatePrompt, opt)\n keyName = locatePromptOrKeyName as string;\n locatePrompt = locatePromptOrOpt as TUserPrompt | undefined;\n opt = {\n ...(optOrUndefined || {}),\n keyName,\n };\n }\n\n assert(opt?.keyName, 'missing keyName for keyboard press');\n\n const detailedLocateParam = locatePrompt\n ? buildDetailedLocateParam(locatePrompt, opt)\n : undefined;\n\n return this.callActionInActionSpace('KeyboardPress', {\n ...(opt || {}),\n locate: detailedLocateParam,\n });\n }\n\n // New signature\n async aiScroll(\n locatePrompt: TUserPrompt | undefined,\n opt: LocateOption & ScrollParam,\n ): Promise<any>;\n\n // Legacy signature - deprecated\n /**\n * @deprecated Use aiScroll(locatePrompt, opt) instead where opt contains the scroll parameters\n */\n async aiScroll(\n scrollParam: ScrollParam,\n locatePrompt?: TUserPrompt,\n opt?: LocateOption,\n ): Promise<any>;\n\n // Implementation\n async aiScroll(\n locatePromptOrScrollParam: TUserPrompt | ScrollParam | undefined,\n locatePromptOrOpt: TUserPrompt | (LocateOption & ScrollParam) | undefined,\n optOrUndefined?: LocateOption,\n ) {\n let scrollParam: ScrollParam;\n let locatePrompt: TUserPrompt | undefined;\n let opt: LocateOption | undefined;\n\n // Check if using new signature (first param is locatePrompt, second has scroll params)\n if (\n typeof locatePromptOrOpt === 'object' &&\n ('direction' in locatePromptOrOpt ||\n 'scrollType' in locatePromptOrOpt ||\n 'distance' in locatePromptOrOpt)\n ) {\n // New signature: aiScroll(locatePrompt, opt)\n locatePrompt = locatePromptOrScrollParam as TUserPrompt;\n opt = locatePromptOrOpt as LocateOption & ScrollParam;\n } else {\n // Legacy signature: aiScroll(scrollParam, locatePrompt, opt)\n scrollParam = locatePromptOrScrollParam as ScrollParam;\n locatePrompt = locatePromptOrOpt as TUserPrompt | undefined;\n opt = {\n ...(optOrUndefined || {}),\n ...(scrollParam || {}),\n };\n }\n\n const detailedLocateParam = buildDetailedLocateParam(\n locatePrompt || '',\n opt,\n );\n\n return this.callActionInActionSpace('Scroll', {\n ...(opt || {}),\n locate: detailedLocateParam,\n });\n }\n\n async aiAction(\n taskPrompt: string,\n opt?: {\n cacheable?: boolean;\n },\n ) {\n const modelPreferences: IModelPreferences = { intent: 'planning' };\n const cacheable = opt?.cacheable;\n // if vlm-ui-tars, plan cache is not used\n const isVlmUiTars = vlLocateMode(modelPreferences) === 'vlm-ui-tars';\n const matchedCache =\n isVlmUiTars || cacheable === false\n ? undefined\n : this.taskCache?.matchPlanCache(taskPrompt);\n if (matchedCache && this.taskCache?.isCacheResultUsed) {\n // log into report file\n const { executor } = await this.taskExecutor.loadYamlFlowAsPlanning(\n taskPrompt,\n matchedCache.cacheContent?.yamlWorkflow,\n );\n\n await await this.afterTaskRunning(executor);\n\n debug('matched cache, will call .runYaml to run the action');\n const yaml = matchedCache.cacheContent?.yamlWorkflow;\n return this.runYaml(yaml);\n }\n\n const { output, executor } = await (isVlmUiTars\n ? this.taskExecutor.actionToGoal(taskPrompt)\n : this.taskExecutor.action(taskPrompt, this.opts.aiActionContext));\n\n // update cache\n if (this.taskCache && output?.yamlFlow && cacheable !== false) {\n const yamlContent: MidsceneYamlScript = {\n tasks: [\n {\n name: taskPrompt,\n flow: output.yamlFlow,\n },\n ],\n };\n const yamlFlowStr = yaml.dump(yamlContent);\n this.taskCache.updateOrAppendCacheRecord(\n {\n type: 'plan',\n prompt: taskPrompt,\n yamlWorkflow: yamlFlowStr,\n },\n matchedCache,\n );\n }\n\n await this.afterTaskRunning(executor);\n return output;\n }\n\n async aiQuery<ReturnType = any>(\n demand: InsightExtractParam,\n opt: InsightExtractOption = defaultInsightExtractOption,\n ): Promise<ReturnType> {\n const { output, executor } =\n await this.taskExecutor.createTypeQueryExecution('Query', demand, opt);\n await this.afterTaskRunning(executor);\n return output as ReturnType;\n }\n\n async aiBoolean(\n prompt: TUserPrompt,\n opt: InsightExtractOption = defaultInsightExtractOption,\n ): Promise<boolean> {\n const { textPrompt, multimodalPrompt } = parsePrompt(prompt);\n const { output, executor } =\n await this.taskExecutor.createTypeQueryExecution(\n 'Boolean',\n textPrompt,\n opt,\n multimodalPrompt,\n );\n await this.afterTaskRunning(executor);\n return output as boolean;\n }\n\n async aiNumber(\n prompt: TUserPrompt,\n opt: InsightExtractOption = defaultInsightExtractOption,\n ): Promise<number> {\n const { textPrompt, multimodalPrompt } = parsePrompt(prompt);\n const { output, executor } =\n await this.taskExecutor.createTypeQueryExecution(\n 'Number',\n textPrompt,\n opt,\n multimodalPrompt,\n );\n await this.afterTaskRunning(executor);\n return output as number;\n }\n\n async aiString(\n prompt: TUserPrompt,\n opt: InsightExtractOption = defaultInsightExtractOption,\n ): Promise<string> {\n const { textPrompt, multimodalPrompt } = parsePrompt(prompt);\n const { output, executor } =\n await this.taskExecutor.createTypeQueryExecution(\n 'String',\n textPrompt,\n opt,\n multimodalPrompt,\n );\n await this.afterTaskRunning(executor);\n return output as string;\n }\n\n async aiAsk(\n prompt: TUserPrompt,\n opt: InsightExtractOption = defaultInsightExtractOption,\n ): Promise<string> {\n return this.aiString(prompt, opt);\n }\n\n async describeElementAtPoint(\n center: [number, number],\n opt?: {\n verifyPrompt?: boolean;\n retryLimit?: number;\n deepThink?: boolean;\n } & LocatorValidatorOption,\n ): Promise<AgentDescribeElementAtPointResult> {\n const { verifyPrompt = true, retryLimit = 3 } = opt || {};\n\n let success = false;\n let retryCount = 0;\n let resultPrompt = '';\n let deepThink = opt?.deepThink || false;\n let verifyResult: LocateValidatorResult | undefined;\n\n while (!success && retryCount < retryLimit) {\n if (retryCount >= 2) {\n deepThink = true;\n }\n debug(\n 'aiDescribe',\n center,\n 'verifyPrompt',\n verifyPrompt,\n 'retryCount',\n retryCount,\n 'deepThink',\n deepThink,\n );\n const text = await this.insight.describe(center, { deepThink });\n debug('aiDescribe text', text);\n assert(text.description, `failed to describe element at [${center}]`);\n resultPrompt = text.description;\n\n verifyResult = await this.verifyLocator(\n resultPrompt,\n deepThink ? { deepThink: true } : undefined,\n center,\n opt,\n );\n if (verifyResult.pass) {\n success = true;\n } else {\n retryCount++;\n }\n }\n\n return {\n prompt: resultPrompt,\n deepThink,\n verifyResult,\n };\n }\n\n async verifyLocator(\n prompt: string,\n locateOpt: LocateOption | undefined,\n expectCenter: [number, number],\n verifyLocateOption?: LocatorValidatorOption,\n ): Promise<LocateValidatorResult> {\n debug('verifyLocator', prompt, locateOpt, expectCenter, verifyLocateOption);\n\n const { center: verifyCenter, rect: verifyRect } = await this.aiLocate(\n prompt,\n locateOpt,\n );\n const distance = distanceOfTwoPoints(expectCenter, verifyCenter);\n const included = includedInRect(expectCenter, verifyRect);\n const pass =\n distance <= (verifyLocateOption?.centerDistanceThreshold || 20) ||\n included;\n const verifyResult = {\n pass,\n rect: verifyRect,\n center: verifyCenter,\n centerDistance: distance,\n };\n debug('aiDescribe verifyResult', verifyResult);\n return verifyResult;\n }\n\n async aiLocate(prompt: TUserPrompt, opt?: LocateOption) {\n const locateParam = buildDetailedLocateParam(prompt, opt);\n assert(locateParam, 'cannot get locate param for aiLocate');\n const locatePlan = locatePlanForLocate(locateParam);\n const plans = [locatePlan];\n const { executor, output } = await this.taskExecutor.runPlans(\n taskTitleStr('Locate', locateParamStr(locateParam)),\n plans,\n );\n await this.afterTaskRunning(executor);\n\n const { element } = output;\n\n return {\n rect: element?.rect,\n center: element?.center,\n scale: (await this.interface.size()).dpr,\n } as Pick<LocateResultElement, 'rect' | 'center'> & {\n scale: number;\n };\n }\n\n async aiAssert(\n assertion: TUserPrompt,\n msg?: string,\n opt?: AgentAssertOpt & InsightExtractOption,\n ) {\n const insightOpt: InsightExtractOption = {\n domIncluded: opt?.domIncluded ?? defaultInsightExtractOption.domIncluded,\n screenshotIncluded:\n opt?.screenshotIncluded ??\n defaultInsightExtractOption.screenshotIncluded,\n returnThought: opt?.returnThought ?? true,\n isWaitForAssert: opt?.isWaitForAssert,\n doNotThrowError: opt?.doNotThrowError,\n };\n\n const { output, executor, thought } = await this.taskExecutor.assert(\n assertion,\n insightOpt,\n );\n await this.afterTaskRunning(executor, true);\n\n const message = output\n ? undefined\n : `Assertion failed: ${msg || assertion}\\nReason: ${\n thought || executor.latestErrorTask()?.error || '(no_reason)'\n }`;\n\n if (opt?.keepRawResponse) {\n return {\n pass: output,\n thought,\n message,\n };\n }\n\n if (!output) {\n throw new Error(message);\n }\n }\n\n async aiWaitFor(assertion: TUserPrompt, opt?: AgentWaitForOpt) {\n const { executor } = await this.taskExecutor.waitFor(assertion, {\n timeoutMs: opt?.timeoutMs || 15 * 1000,\n checkIntervalMs: opt?.checkIntervalMs || 3 * 1000,\n });\n await this.afterTaskRunning(executor, true);\n\n if (executor.isInErrorState()) {\n const errorTask = executor.latestErrorTask();\n throw new Error(`${errorTask?.error}\\n${errorTask?.errorStack}`);\n }\n }\n\n async ai(taskPrompt: string, type = 'action') {\n if (type === 'action') {\n return this.aiAction(taskPrompt);\n }\n if (type === 'query') {\n return this.aiQuery(taskPrompt);\n }\n\n if (type === 'assert') {\n return this.aiAssert(taskPrompt);\n }\n\n if (type === 'tap') {\n return this.aiTap(taskPrompt);\n }\n\n if (type === 'rightClick') {\n return this.aiRightClick(taskPrompt);\n }\n\n throw new Error(\n `Unknown type: ${type}, only support 'action', 'query', 'assert', 'tap', 'rightClick'`,\n );\n }\n\n async runYaml(yamlScriptContent: string): Promise<{\n result: Record<string, any>;\n }> {\n const script = parseYamlScript(yamlScriptContent, 'yaml', true);\n const player = new ScriptPlayer(script, async (target) => {\n return { agent: this, freeFn: [] };\n });\n await player.run();\n\n if (player.status === 'error') {\n const errors = player.taskStatusList\n .filter((task) => task.status === 'error')\n .map((task) => {\n return `task - ${task.name}: ${task.error?.message}`;\n })\n .join('\\n');\n throw new Error(`Error(s) occurred in running yaml script:\\n${errors}`);\n }\n\n return {\n result: player.result,\n };\n }\n\n async evaluateJavaScript(script: string) {\n assert(\n this.interface.evaluateJavaScript,\n 'evaluateJavaScript is not supported in current agent',\n );\n return this.interface.evaluateJavaScript(script);\n }\n\n async destroy() {\n await this.interface.destroy();\n this.resetDump(); // reset dump to release memory\n this.destroyed = true;\n }\n\n async logScreenshot(\n title?: string,\n opt?: {\n content: string;\n },\n ) {\n // 1. screenshot\n const base64 = await this.interface.screenshotBase64();\n const now = Date.now();\n // 2. build recorder\n const recorder: ExecutionRecorderItem[] = [\n {\n type: 'screenshot',\n ts: now,\n screenshot: base64,\n },\n ];\n // 3. build ExecutionTaskLog\n const task: ExecutionTaskLog = {\n type: 'Log',\n subType: 'Screenshot',\n status: 'finished',\n recorder,\n timing: {\n start: now,\n end: now,\n cost: 0,\n },\n param: {\n content: opt?.content || '',\n },\n executor: async () => {},\n };\n // 4. build ExecutionDump\n const executionDump: ExecutionDump = {\n sdkVersion: '',\n logTime: now,\n name: `Log - ${title || 'untitled'}`,\n description: opt?.content || '',\n tasks: [task],\n };\n // 5. append to execution dump\n this.appendExecutionDump(executionDump);\n\n try {\n this.onDumpUpdate?.(this.dumpDataString());\n } catch (error) {\n console.error('Failed to update dump', error);\n }\n\n this.writeOutActionDumps();\n }\n\n _unstableLogContent() {\n const { groupName, groupDescription, executions } = this.dump;\n const newExecutions = Array.isArray(executions)\n ? executions.map((execution: any) => {\n const { tasks, ...restExecution } = execution;\n let newTasks = tasks;\n if (Array.isArray(tasks)) {\n newTasks = tasks.map((task: any) => {\n // only remove uiContext and log from task\n const { uiContext, log, ...restTask } = task;\n return restTask;\n });\n }\n return { ...restExecution, ...(newTasks ? { tasks: newTasks } : {}) };\n })\n : [];\n return {\n groupName,\n groupDescription,\n executions: newExecutions,\n };\n }\n\n /**\n * Freezes the current page context to be reused in subsequent AI operations\n * This avoids recalculating page context for each operation\n */\n async freezePageContext(): Promise<void> {\n debug('Freezing page context');\n const context = await this._snapshotContext();\n // Mark the context as frozen\n context._isFrozen = true;\n this.frozenUIContext = context;\n debug('Page context frozen successfully');\n }\n\n /**\n * Unfreezes the page context, allowing AI operations to calculate context dynamically\n */\n async unfreezePageContext(): Promise<void> {\n debug('Unfreezing page context');\n this.frozenUIContext = undefined;\n debug('Page context unfrozen successfully');\n }\n}\n"],"names":["debug","getDebug","distanceOfTwoPoints","p1","p2","x1","y1","x2","y2","Math","includedInRect","point","rect","x","y","left","top","width","height","defaultInsightExtractOption","Agent","action","commonContextParser","prompt","execution","trimmedExecution","trimContextByViewport","currentDump","stringifyDumpData","reportHTMLContent","Error","generateReport","autoPrintReportMsg","writeLogFile","groupedActionDumpFileExt","printReportMsg","task","param","paramStr","tip","typeStr","executor","doNotThrowError","_this","error","console","errorTask","type","opt","actionPlan","plans","Boolean","title","taskTitleStr","locateParamStr","output","locatePrompt","assert","detailedLocateParam","buildDetailedLocateParam","locatePromptOrValue","locatePromptOrOpt","optOrUndefined","value","optWithValue","locatePromptOrKeyName","keyName","undefined","locatePromptOrScrollParam","scrollParam","taskPrompt","_this_taskCache","_this_taskCache1","modelPreferences","cacheable","isVlmUiTars","vlLocateMode","matchedCache","_matchedCache_cacheContent","_matchedCache_cacheContent1","yaml","yamlContent","yamlFlowStr","demand","textPrompt","multimodalPrompt","parsePrompt","center","verifyPrompt","retryLimit","success","retryCount","resultPrompt","deepThink","verifyResult","text","locateOpt","expectCenter","verifyLocateOption","verifyCenter","verifyRect","distance","included","pass","locateParam","locatePlan","locatePlanForLocate","element","assertion","msg","_executor_latestErrorTask","insightOpt","thought","message","yamlScriptContent","script","parseYamlScript","player","ScriptPlayer","target","errors","_task_error","base64","now","Date","recorder","executionDump","groupName","groupDescription","executions","newExecutions","Array","tasks","restExecution","newTasks","uiContext","log","restTask","context","interfaceInstance","opts","Object","globalConfigManager","Insight","TaskCache","MIDSCENE_CACHE","TaskExecutor","getReportFileName"],"mappings":"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"}
|
package/dist/es/agent/index.mjs
CHANGED
|
@@ -2,5 +2,5 @@ import { Agent } from "./agent.mjs";
|
|
|
2
2
|
import { commonContextParser, getCurrentExecutionFile, getReportFileName, printReportMsg, trimContextByViewport } from "./utils.mjs";
|
|
3
3
|
import { locateParamStr, paramStr, taskTitleStr, typeStr } from "./ui-utils.mjs";
|
|
4
4
|
import { TaskCache, cacheFileExt } from "./task-cache.mjs";
|
|
5
|
-
import {
|
|
6
|
-
export { Agent,
|
|
5
|
+
import { TaskExecutor } from "./tasks.mjs";
|
|
6
|
+
export { Agent, TaskCache, TaskExecutor, cacheFileExt, commonContextParser, getCurrentExecutionFile, getReportFileName, locateParamStr, paramStr, printReportMsg, taskTitleStr, trimContextByViewport, typeStr };
|
package/dist/es/agent/tasks.mjs
CHANGED
|
@@ -31,9 +31,12 @@ function locatePlanForLocate(param) {
|
|
|
31
31
|
};
|
|
32
32
|
return locatePlan;
|
|
33
33
|
}
|
|
34
|
-
class
|
|
34
|
+
class TaskExecutor {
|
|
35
|
+
get page() {
|
|
36
|
+
return this.interface;
|
|
37
|
+
}
|
|
35
38
|
async recordScreenshot(timing) {
|
|
36
|
-
const base64 = await this.
|
|
39
|
+
const base64 = await this.interface.screenshotBase64();
|
|
37
40
|
const item = {
|
|
38
41
|
type: 'screenshot',
|
|
39
42
|
ts: Date.now(),
|
|
@@ -42,12 +45,12 @@ class PageTaskExecutor {
|
|
|
42
45
|
};
|
|
43
46
|
return item;
|
|
44
47
|
}
|
|
45
|
-
async getElementXpath(
|
|
48
|
+
async getElementXpath(uiContext, element) {
|
|
46
49
|
var _element_attributes;
|
|
47
|
-
if (!this.
|
|
50
|
+
if (!this.interface.getXpathsByPoint) return void debug('getXpathsByPoint is not supported for this interface');
|
|
48
51
|
let elementId = null == element ? void 0 : element.id;
|
|
49
52
|
if ((null == element ? void 0 : element.isOrderSensitive) !== void 0) {
|
|
50
|
-
const xpaths = await this.
|
|
53
|
+
const xpaths = await this.interface.getXpathsByPoint({
|
|
51
54
|
left: element.center[0],
|
|
52
55
|
top: element.center[1]
|
|
53
56
|
}, null == element ? void 0 : element.isOrderSensitive);
|
|
@@ -55,7 +58,7 @@ class PageTaskExecutor {
|
|
|
55
58
|
}
|
|
56
59
|
if ((null == element ? void 0 : null == (_element_attributes = element.attributes) ? void 0 : _element_attributes.nodeType) === NodeType.POSITION) {
|
|
57
60
|
await this.insight.contextRetrieverFn('locate');
|
|
58
|
-
const info = elementByPositionWithElementInfo(
|
|
61
|
+
const info = elementByPositionWithElementInfo(uiContext.tree, {
|
|
59
62
|
x: element.center[0],
|
|
60
63
|
y: element.center[1]
|
|
61
64
|
}, {
|
|
@@ -67,7 +70,7 @@ class PageTaskExecutor {
|
|
|
67
70
|
}
|
|
68
71
|
if (!elementId) return;
|
|
69
72
|
try {
|
|
70
|
-
const result = await this.
|
|
73
|
+
const result = await this.interface.getXpathsById(elementId);
|
|
71
74
|
return result;
|
|
72
75
|
} catch (error) {
|
|
73
76
|
debug('getXpathsById error: ', error);
|
|
@@ -86,9 +89,9 @@ class PageTaskExecutor {
|
|
|
86
89
|
if ('Action' === taskApply.type) await Promise.all([
|
|
87
90
|
(async ()=>{
|
|
88
91
|
await external_utils_mjs_sleep(100);
|
|
89
|
-
if (this.
|
|
90
|
-
debug('will call "beforeAction" for
|
|
91
|
-
await this.
|
|
92
|
+
if (this.interface.beforeAction) {
|
|
93
|
+
debug('will call "beforeAction" for interface');
|
|
94
|
+
await this.interface.beforeAction();
|
|
92
95
|
}
|
|
93
96
|
})(),
|
|
94
97
|
external_utils_mjs_sleep(200)
|
|
@@ -130,34 +133,34 @@ class PageTaskExecutor {
|
|
|
130
133
|
};
|
|
131
134
|
this.insight.onceDumpUpdatedFn = dumpCollector;
|
|
132
135
|
const shotTime = Date.now();
|
|
133
|
-
const
|
|
134
|
-
task.
|
|
136
|
+
const uiContext = await this.insight.contextRetrieverFn('locate');
|
|
137
|
+
task.uiContext = uiContext;
|
|
135
138
|
const recordItem = {
|
|
136
139
|
type: 'screenshot',
|
|
137
140
|
ts: shotTime,
|
|
138
|
-
screenshot:
|
|
141
|
+
screenshot: uiContext.screenshotBase64,
|
|
139
142
|
timing: 'before Insight'
|
|
140
143
|
};
|
|
141
144
|
task.recorder = [
|
|
142
145
|
recordItem
|
|
143
146
|
];
|
|
144
|
-
const elementFromXpath = param.xpath && this.
|
|
147
|
+
const elementFromXpath = param.xpath && this.interface.getElementInfoByXpath ? await this.interface.getElementInfoByXpath(param.xpath) : void 0;
|
|
145
148
|
const userExpectedPathHitFlag = !!elementFromXpath;
|
|
146
149
|
const cachePrompt = param.prompt;
|
|
147
150
|
const locateCacheRecord = null == (_this_taskCache = this.taskCache) ? void 0 : _this_taskCache.matchLocateCache(cachePrompt);
|
|
148
151
|
const xpaths = null == locateCacheRecord ? void 0 : null == (_locateCacheRecord_cacheContent = locateCacheRecord.cacheContent) ? void 0 : _locateCacheRecord_cacheContent.xpaths;
|
|
149
152
|
const elementFromCache = userExpectedPathHitFlag ? null : await matchElementFromCache(this, xpaths, cachePrompt, param.cacheable);
|
|
150
153
|
const cacheHitFlag = !!elementFromCache;
|
|
151
|
-
const elementFromPlan = userExpectedPathHitFlag || cacheHitFlag ? void 0 : matchElementFromPlan(param,
|
|
154
|
+
const elementFromPlan = userExpectedPathHitFlag || cacheHitFlag ? void 0 : matchElementFromPlan(param, uiContext.tree);
|
|
152
155
|
const planHitFlag = !!elementFromPlan;
|
|
153
156
|
const elementFromAiLocate = userExpectedPathHitFlag || cacheHitFlag || planHitFlag ? void 0 : (await this.insight.locate(param, {
|
|
154
|
-
context:
|
|
157
|
+
context: uiContext
|
|
155
158
|
})).element;
|
|
156
159
|
const aiLocateHitFlag = !!elementFromAiLocate;
|
|
157
160
|
const element = elementFromXpath || elementFromCache || elementFromPlan || elementFromAiLocate;
|
|
158
161
|
let currentXpaths;
|
|
159
162
|
if (element && this.taskCache && !cacheHitFlag && (null == param ? void 0 : param.cacheable) !== false) {
|
|
160
|
-
const elementXpaths = await this.getElementXpath(
|
|
163
|
+
const elementXpaths = await this.getElementXpath(uiContext, element);
|
|
161
164
|
if (null == elementXpaths ? void 0 : elementXpaths.length) {
|
|
162
165
|
currentXpaths = elementXpaths;
|
|
163
166
|
this.taskCache.updateOrAppendCacheRecord({
|
|
@@ -200,7 +203,7 @@ class PageTaskExecutor {
|
|
|
200
203
|
output: {
|
|
201
204
|
element
|
|
202
205
|
},
|
|
203
|
-
|
|
206
|
+
uiContext,
|
|
204
207
|
hitBy
|
|
205
208
|
};
|
|
206
209
|
}
|
|
@@ -253,7 +256,7 @@ class PageTaskExecutor {
|
|
|
253
256
|
tasks.push(taskActionSleep);
|
|
254
257
|
} else {
|
|
255
258
|
const planType = plan.type;
|
|
256
|
-
const actionSpace = await this.
|
|
259
|
+
const actionSpace = await this.interface.actionSpace();
|
|
257
260
|
const action = actionSpace.find((action)=>action.name === planType);
|
|
258
261
|
const param = plan.param;
|
|
259
262
|
if (!action) throw new Error(`Action type '${planType}' not found`);
|
|
@@ -280,12 +283,12 @@ class PageTaskExecutor {
|
|
|
280
283
|
executor: async (param, context)=>{
|
|
281
284
|
var _context_element;
|
|
282
285
|
debug('executing action', planType, param, `context.element.center: ${null == (_context_element = context.element) ? void 0 : _context_element.center}`);
|
|
283
|
-
const
|
|
284
|
-
context.task.
|
|
286
|
+
const uiContext = await this.insight.contextRetrieverFn('locate');
|
|
287
|
+
context.task.uiContext = uiContext;
|
|
285
288
|
requiredLocateFields.forEach((field)=>{
|
|
286
289
|
assert(param[field], `field '${field}' is required for action ${planType} but not provided. Cannot execute action ${planType}.`);
|
|
287
290
|
});
|
|
288
|
-
const actionFn = action.call.bind(this.
|
|
291
|
+
const actionFn = action.call.bind(this.interface);
|
|
289
292
|
await actionFn(param, context);
|
|
290
293
|
return {
|
|
291
294
|
output: {
|
|
@@ -308,19 +311,19 @@ class PageTaskExecutor {
|
|
|
308
311
|
}
|
|
309
312
|
async setupPlanningContext(executorContext) {
|
|
310
313
|
const shotTime = Date.now();
|
|
311
|
-
const
|
|
314
|
+
const uiContext = await this.insight.contextRetrieverFn('locate');
|
|
312
315
|
const recordItem = {
|
|
313
316
|
type: 'screenshot',
|
|
314
317
|
ts: shotTime,
|
|
315
|
-
screenshot:
|
|
318
|
+
screenshot: uiContext.screenshotBase64,
|
|
316
319
|
timing: 'before Planning'
|
|
317
320
|
};
|
|
318
321
|
executorContext.task.recorder = [
|
|
319
322
|
recordItem
|
|
320
323
|
];
|
|
321
|
-
executorContext.task.
|
|
324
|
+
executorContext.task.uiContext = uiContext;
|
|
322
325
|
return {
|
|
323
|
-
|
|
326
|
+
uiContext
|
|
324
327
|
};
|
|
325
328
|
}
|
|
326
329
|
async loadYamlFlowAsPlanning(userInstruction, yamlString) {
|
|
@@ -372,17 +375,17 @@ class PageTaskExecutor {
|
|
|
372
375
|
},
|
|
373
376
|
executor: async (param, executorContext)=>{
|
|
374
377
|
const startTime = Date.now();
|
|
375
|
-
const {
|
|
376
|
-
assert(this.
|
|
377
|
-
const actionSpace = await this.
|
|
378
|
-
debug('actionSpace for
|
|
378
|
+
const { uiContext } = await this.setupPlanningContext(executorContext);
|
|
379
|
+
assert(this.interface.actionSpace, 'actionSpace for device is not implemented');
|
|
380
|
+
const actionSpace = await this.interface.actionSpace();
|
|
381
|
+
debug('actionSpace for this interface is:', actionSpace.map((action)=>action.name).join(', '));
|
|
379
382
|
assert(Array.isArray(actionSpace), 'actionSpace must be an array');
|
|
380
|
-
if (0 === actionSpace.length) console.warn(`ActionSpace for ${this.
|
|
383
|
+
if (0 === actionSpace.length) console.warn(`ActionSpace for ${this.interface.interfaceType} is empty. This may lead to unexpected behavior.`);
|
|
381
384
|
const planResult = await external_index_mjs_plan(param.userInstruction, {
|
|
382
|
-
context:
|
|
385
|
+
context: uiContext,
|
|
383
386
|
log: param.log,
|
|
384
387
|
actionContext,
|
|
385
|
-
|
|
388
|
+
interfaceType: this.interface.interfaceType,
|
|
386
389
|
actionSpace
|
|
387
390
|
});
|
|
388
391
|
const { actions, log, more_actions_needed_by_instruction, error, usage, rawResponse, sleep } = planResult;
|
|
@@ -414,7 +417,7 @@ class PageTaskExecutor {
|
|
|
414
417
|
cache: {
|
|
415
418
|
hit: false
|
|
416
419
|
},
|
|
417
|
-
|
|
420
|
+
uiContext
|
|
418
421
|
};
|
|
419
422
|
}
|
|
420
423
|
};
|
|
@@ -430,8 +433,8 @@ class PageTaskExecutor {
|
|
|
430
433
|
},
|
|
431
434
|
executor: async (param, executorContext)=>{
|
|
432
435
|
var _actions_;
|
|
433
|
-
const {
|
|
434
|
-
const imagePayload = await resizeImageForUiTars(
|
|
436
|
+
const { uiContext } = await this.setupPlanningContext(executorContext);
|
|
437
|
+
const imagePayload = await resizeImageForUiTars(uiContext.screenshotBase64, uiContext.size, modelPreferences);
|
|
435
438
|
this.appendConversationHistory({
|
|
436
439
|
role: 'user',
|
|
437
440
|
content: [
|
|
@@ -446,7 +449,7 @@ class PageTaskExecutor {
|
|
|
446
449
|
const planResult = await vlmPlanning({
|
|
447
450
|
userInstruction: param.userInstruction,
|
|
448
451
|
conversationHistory: this.conversationHistory,
|
|
449
|
-
size:
|
|
452
|
+
size: uiContext.size,
|
|
450
453
|
modelPreferences
|
|
451
454
|
});
|
|
452
455
|
const { actions, action_summary, usage } = planResult;
|
|
@@ -604,12 +607,12 @@ class PageTaskExecutor {
|
|
|
604
607
|
};
|
|
605
608
|
this.insight.onceDumpUpdatedFn = dumpCollector;
|
|
606
609
|
const shotTime = Date.now();
|
|
607
|
-
const
|
|
608
|
-
task.
|
|
610
|
+
const uiContext = await this.insight.contextRetrieverFn('extract');
|
|
611
|
+
task.uiContext = uiContext;
|
|
609
612
|
const recordItem = {
|
|
610
613
|
type: 'screenshot',
|
|
611
614
|
ts: shotTime,
|
|
612
|
-
screenshot:
|
|
615
|
+
screenshot: uiContext.screenshotBase64,
|
|
613
616
|
timing: 'before Extract'
|
|
614
617
|
};
|
|
615
618
|
task.recorder = [
|
|
@@ -737,18 +740,18 @@ class PageTaskExecutor {
|
|
|
737
740
|
}
|
|
738
741
|
return this.appendErrorPlan(taskExecutor, `waitFor timeout: ${errorThought}`);
|
|
739
742
|
}
|
|
740
|
-
constructor(
|
|
741
|
-
_define_property(this, "
|
|
743
|
+
constructor(interfaceInstance, insight, opts){
|
|
744
|
+
_define_property(this, "interface", void 0);
|
|
742
745
|
_define_property(this, "insight", void 0);
|
|
743
746
|
_define_property(this, "taskCache", void 0);
|
|
744
747
|
_define_property(this, "conversationHistory", []);
|
|
745
748
|
_define_property(this, "onTaskStartCallback", void 0);
|
|
746
|
-
this.
|
|
749
|
+
this.interface = interfaceInstance;
|
|
747
750
|
this.insight = insight;
|
|
748
751
|
this.taskCache = opts.taskCache;
|
|
749
752
|
this.onTaskStartCallback = null == opts ? void 0 : opts.onTaskStart;
|
|
750
753
|
}
|
|
751
754
|
}
|
|
752
|
-
export {
|
|
755
|
+
export { TaskExecutor, locatePlanForLocate };
|
|
753
756
|
|
|
754
757
|
//# sourceMappingURL=tasks.mjs.map
|