@midscene/web 0.26.3 → 0.26.4
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/bridge-mode/io-client.mjs +1 -1
- package/dist/es/bridge-mode/io-server.mjs +2 -2
- package/dist/es/bridge-mode/page-browser-side.mjs +1 -1
- package/dist/es/chrome-extension/page.mjs +1 -1
- package/dist/es/common/tasks.mjs +6 -3
- package/dist/es/common/tasks.mjs.map +1 -1
- package/dist/es/common/utils.mjs +1 -1
- package/dist/lib/bridge-mode/io-client.js +1 -1
- package/dist/lib/bridge-mode/io-server.js +2 -2
- package/dist/lib/bridge-mode/page-browser-side.js +1 -1
- package/dist/lib/chrome-extension/page.js +1 -1
- package/dist/lib/common/tasks.js +6 -3
- package/dist/lib/common/tasks.js.map +1 -1
- package/dist/lib/common/utils.js +1 -1
- package/package.json +3 -3
|
@@ -71,7 +71,7 @@ class BridgeServer {
|
|
|
71
71
|
logMsg('one client connected');
|
|
72
72
|
this.socket = socket;
|
|
73
73
|
const clientVersion = socket.handshake.query.version;
|
|
74
|
-
logMsg(`Bridge connected, cli-side version v0.26.
|
|
74
|
+
logMsg(`Bridge connected, cli-side version v0.26.4, browser-side version v${clientVersion}`);
|
|
75
75
|
socket.on(BridgeEvent.CallResponse, (params)=>{
|
|
76
76
|
const id = params.id;
|
|
77
77
|
const response = params.response;
|
|
@@ -99,7 +99,7 @@ class BridgeServer {
|
|
|
99
99
|
var _this_onConnect, _this;
|
|
100
100
|
null == (_this_onConnect = (_this = this).onConnect) || _this_onConnect.call(_this);
|
|
101
101
|
const payload = {
|
|
102
|
-
version: "0.26.
|
|
102
|
+
version: "0.26.4"
|
|
103
103
|
};
|
|
104
104
|
socket.emit(BridgeEvent.Connected, payload);
|
|
105
105
|
Promise.resolve().then(()=>{
|
|
@@ -44,7 +44,7 @@ class ExtensionBridgePageBrowserSide extends page {
|
|
|
44
44
|
}
|
|
45
45
|
}, ()=>this.destroy());
|
|
46
46
|
await this.bridgeClient.connect();
|
|
47
|
-
this.onLogMessage(`Bridge connected, cli-side version v${this.bridgeClient.serverVersion}, browser-side version v0.26.
|
|
47
|
+
this.onLogMessage(`Bridge connected, cli-side version v${this.bridgeClient.serverVersion}, browser-side version v0.26.4`, 'log');
|
|
48
48
|
}
|
|
49
49
|
async connect() {
|
|
50
50
|
return await this.setupBridgeClient();
|
|
@@ -339,7 +339,7 @@ class ChromeExtensionProxyPage {
|
|
|
339
339
|
constructor(forceSameTabNavigation){
|
|
340
340
|
_define_property(this, "pageType", 'chrome-extension-proxy');
|
|
341
341
|
_define_property(this, "forceSameTabNavigation", void 0);
|
|
342
|
-
_define_property(this, "version", "0.26.
|
|
342
|
+
_define_property(this, "version", "0.26.4");
|
|
343
343
|
_define_property(this, "viewportSize", void 0);
|
|
344
344
|
_define_property(this, "activeTabId", null);
|
|
345
345
|
_define_property(this, "tabIdOfDebuggerAttached", null);
|
package/dist/es/common/tasks.mjs
CHANGED
|
@@ -648,9 +648,12 @@ class PageTaskExecutor {
|
|
|
648
648
|
];
|
|
649
649
|
const ifTypeRestricted = 'Query' !== type;
|
|
650
650
|
let demandInput = demand;
|
|
651
|
-
if (ifTypeRestricted)
|
|
652
|
-
|
|
653
|
-
|
|
651
|
+
if (ifTypeRestricted) {
|
|
652
|
+
const returnType = 'Assert' === type ? 'Boolean' : type;
|
|
653
|
+
demandInput = {
|
|
654
|
+
result: `${returnType}, ${demand}`
|
|
655
|
+
};
|
|
656
|
+
}
|
|
654
657
|
const { data, usage, thought } = await this.insight.extract(demandInput, opt, multimodalPrompt);
|
|
655
658
|
let outputResult = data;
|
|
656
659
|
if (ifTypeRestricted) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common/tasks.mjs","sources":["webpack://@midscene/web/./src/common/tasks.ts"],"sourcesContent":["import type { AndroidDevicePage, WebPage } from '@/common/page';\nimport type { PuppeteerWebPage } from '@/puppeteer';\nimport {\n type AIUsageInfo,\n type BaseElement,\n type DeviceAction,\n type DumpSubscriber,\n type ExecutionRecorderItem,\n type ExecutionTaskActionApply,\n type ExecutionTaskApply,\n type ExecutionTaskHitBy,\n type ExecutionTaskInsightLocateApply,\n type ExecutionTaskInsightQueryApply,\n type ExecutionTaskPlanning,\n type ExecutionTaskPlanningApply,\n type ExecutionTaskProgressOptions,\n Executor,\n type ExecutorContext,\n type Insight,\n type InsightAssertionResponse,\n type InsightDump,\n type InsightExtractOption,\n type InsightExtractParam,\n type LocateResultElement,\n type MidsceneYamlFlowItem,\n type PageType,\n type PlanningAIResponse,\n type PlanningAction,\n type PlanningActionParamAssert,\n type PlanningActionParamError,\n type PlanningActionParamSleep,\n type PlanningActionParamWaitFor,\n type TMultimodalPrompt,\n type TUserPrompt,\n type UIContext,\n plan,\n} from '@midscene/core';\nimport {\n type ChatCompletionMessageParam,\n elementByPositionWithElementInfo,\n resizeImageForUiTars,\n vlmPlanning,\n} from '@midscene/core/ai-model';\nimport { sleep } from '@midscene/core/utils';\nimport { NodeType } from '@midscene/shared/constants';\nimport {\n MIDSCENE_REPLANNING_CYCLE_LIMIT,\n getAIConfigInNumber,\n} from '@midscene/shared/env';\nimport { getDebug } from '@midscene/shared/logger';\nimport { assert } from '@midscene/shared/utils';\nimport type { WebElementInfo, WebUIContext } from '../web-element';\nimport type { TaskCache } from './task-cache';\nimport { taskTitleStr } from './ui-utils';\nimport {\n matchElementFromCache,\n matchElementFromPlan,\n parsePrompt,\n} from './utils';\n\ninterface ExecutionResult<OutputType = any> {\n output: OutputType;\n thought?: string;\n executor: Executor;\n}\n\nconst debug = getDebug('device-task-executor');\nconst defaultReplanningCycleLimit = 10;\n\nexport class PageTaskExecutor {\n page: WebPage;\n\n insight: Insight<WebElementInfo, WebUIContext>;\n\n taskCache?: TaskCache;\n\n conversationHistory: ChatCompletionMessageParam[] = [];\n\n onTaskStartCallback?: ExecutionTaskProgressOptions['onTaskStart'];\n\n constructor(\n page: WebPage,\n insight: Insight<WebElementInfo, WebUIContext>,\n opts: {\n taskCache?: TaskCache;\n onTaskStart?: ExecutionTaskProgressOptions['onTaskStart'];\n },\n ) {\n this.page = page;\n this.insight = insight;\n\n this.taskCache = opts.taskCache;\n\n this.onTaskStartCallback = opts?.onTaskStart;\n }\n\n private async recordScreenshot(timing: ExecutionRecorderItem['timing']) {\n const base64 = await this.page.screenshotBase64();\n const item: ExecutionRecorderItem = {\n type: 'screenshot',\n ts: Date.now(),\n screenshot: base64,\n timing,\n };\n return item;\n }\n\n private async getElementXpath(\n pageContext: UIContext<BaseElement>,\n element: LocateResultElement,\n ): Promise<string[] | undefined> {\n let elementId = element?.id;\n if (element?.isOrderSensitive !== undefined) {\n const xpaths = await this.page.getXpathsByPoint(\n {\n left: element.center[0],\n top: element.center[1],\n },\n element?.isOrderSensitive,\n );\n\n return xpaths;\n }\n\n // find the nearest xpath for the element\n if (element?.attributes?.nodeType === NodeType.POSITION) {\n await this.insight.contextRetrieverFn('locate');\n const info = elementByPositionWithElementInfo(\n pageContext.tree,\n {\n x: element.center[0],\n y: element.center[1],\n },\n {\n requireStrictDistance: false,\n filterPositionElements: true,\n },\n );\n if (info?.id) {\n elementId = info.id;\n } else {\n debug(\n 'no element id found for position node, will not update cache',\n element,\n );\n }\n }\n\n if (!elementId) {\n return undefined;\n }\n try {\n const result = await this.page.getXpathsById(elementId);\n return result;\n } catch (error) {\n debug('getXpathsById error: ', error);\n }\n }\n\n private prependExecutorWithScreenshot(\n taskApply: ExecutionTaskApply,\n appendAfterExecution = false,\n ): ExecutionTaskApply {\n const taskWithScreenshot: ExecutionTaskApply = {\n ...taskApply,\n executor: async (param, context, ...args) => {\n const recorder: ExecutionRecorderItem[] = [];\n const { task } = context;\n // set the recorder before executor in case of error\n task.recorder = recorder;\n const shot = await this.recordScreenshot(`before ${task.type}`);\n recorder.push(shot);\n const result = await taskApply.executor(param, context, ...args);\n if (taskApply.type === 'Action') {\n await Promise.all([\n (async () => {\n await sleep(100);\n if ((this.page as PuppeteerWebPage).waitUntilNetworkIdle) {\n try {\n await (this.page as PuppeteerWebPage).waitUntilNetworkIdle();\n } catch (error) {\n // console.error('waitUntilNetworkIdle error', error);\n }\n }\n })(),\n sleep(200),\n ]);\n }\n if (appendAfterExecution) {\n const shot2 = await this.recordScreenshot('after Action');\n recorder.push(shot2);\n }\n return result;\n },\n };\n return taskWithScreenshot;\n }\n\n public async convertPlanToExecutable(\n plans: PlanningAction[],\n opts?: {\n cacheable?: boolean;\n },\n ) {\n const tasks: ExecutionTaskApply[] = [];\n for (const plan of plans) {\n if (plan.type === 'Locate') {\n if (\n plan.locate === null ||\n plan.locate?.id === null ||\n plan.locate?.id === 'null'\n ) {\n // console.warn('Locate action with id is null, will be ignored');\n continue;\n }\n const taskFind: ExecutionTaskInsightLocateApply = {\n type: 'Insight',\n subType: 'Locate',\n param: plan.locate\n ? {\n ...plan.locate,\n cacheable: opts?.cacheable,\n }\n : undefined,\n thought: plan.thought,\n locate: plan.locate,\n executor: async (param, taskContext) => {\n const { task } = taskContext;\n assert(\n param?.prompt || param?.id || param?.bbox,\n 'No prompt or id or position or bbox to locate',\n );\n let insightDump: InsightDump | undefined;\n let usage: AIUsageInfo | undefined;\n const dumpCollector: DumpSubscriber = (dump) => {\n insightDump = dump;\n usage = dump?.taskInfo?.usage;\n\n task.log = {\n dump: insightDump,\n };\n\n task.usage = usage;\n };\n this.insight.onceDumpUpdatedFn = dumpCollector;\n const shotTime = Date.now();\n\n // Get context through contextRetrieverFn which handles frozen context\n const pageContext = await this.insight.contextRetrieverFn('locate');\n task.pageContext = pageContext;\n\n const recordItem: ExecutionRecorderItem = {\n type: 'screenshot',\n ts: shotTime,\n screenshot: pageContext.screenshotBase64,\n timing: 'before Insight',\n };\n task.recorder = [recordItem];\n\n // try matching xpath\n const elementFromXpath = param.xpath\n ? await this.page.getElementInfoByXpath(param.xpath)\n : undefined;\n const userExpectedPathHitFlag = !!elementFromXpath;\n\n // try matching cache\n const cachePrompt = param.prompt;\n const locateCacheRecord =\n this.taskCache?.matchLocateCache(cachePrompt);\n const xpaths = locateCacheRecord?.cacheContent?.xpaths;\n const elementFromCache = userExpectedPathHitFlag\n ? null\n : await matchElementFromCache(\n this,\n xpaths,\n cachePrompt,\n param.cacheable,\n );\n const cacheHitFlag = !!elementFromCache;\n\n // try matching plan\n const elementFromPlan =\n !userExpectedPathHitFlag && !cacheHitFlag\n ? matchElementFromPlan(param, pageContext.tree)\n : undefined;\n const planHitFlag = !!elementFromPlan;\n\n // try ai locate\n const elementFromAiLocate =\n !userExpectedPathHitFlag && !cacheHitFlag && !planHitFlag\n ? (\n await this.insight.locate(param, {\n // fallback to ai locate\n context: pageContext,\n })\n ).element\n : undefined;\n const aiLocateHitFlag = !!elementFromAiLocate;\n\n const element =\n elementFromXpath || // highest priority\n elementFromCache || // second priority\n elementFromPlan || // third priority\n elementFromAiLocate;\n\n // update cache\n let currentXpaths: string[] | undefined;\n if (\n element &&\n this.taskCache &&\n !cacheHitFlag &&\n param?.cacheable !== false\n ) {\n const elementXpaths = await this.getElementXpath(\n pageContext,\n element,\n );\n if (elementXpaths?.length) {\n currentXpaths = elementXpaths;\n this.taskCache.updateOrAppendCacheRecord(\n {\n type: 'locate',\n prompt: cachePrompt,\n xpaths: elementXpaths,\n },\n locateCacheRecord,\n );\n } else {\n debug(\n 'no xpaths found, will not update cache',\n cachePrompt,\n elementXpaths,\n );\n }\n }\n if (!element) {\n throw new Error(`Element not found: ${param.prompt}`);\n }\n\n let hitBy: ExecutionTaskHitBy | undefined;\n\n if (userExpectedPathHitFlag) {\n hitBy = {\n from: 'User expected path',\n context: {\n xpath: param.xpath,\n },\n };\n } else if (cacheHitFlag) {\n hitBy = {\n from: 'Cache',\n context: {\n xpathsFromCache: xpaths,\n xpathsToSave: currentXpaths,\n },\n };\n } else if (planHitFlag) {\n hitBy = {\n from: 'Planning',\n context: {\n id: elementFromPlan?.id,\n bbox: elementFromPlan?.bbox,\n },\n };\n } else if (aiLocateHitFlag) {\n hitBy = {\n from: 'AI model',\n context: {\n prompt: param.prompt,\n },\n };\n }\n\n return {\n output: {\n element,\n },\n pageContext,\n hitBy,\n };\n },\n };\n tasks.push(taskFind);\n } else if (plan.type === 'Assert' || plan.type === 'AssertWithoutThrow') {\n const assertPlan = plan as PlanningAction<PlanningActionParamAssert>;\n const taskAssert: ExecutionTaskApply = {\n type: 'Insight',\n subType: 'Assert',\n param: assertPlan.param,\n thought: assertPlan.thought,\n locate: assertPlan.locate,\n executor: async (param, taskContext) => {\n const { task } = taskContext;\n let insightDump: InsightDump | undefined;\n const dumpCollector: DumpSubscriber = (dump) => {\n insightDump = dump;\n };\n this.insight.onceDumpUpdatedFn = dumpCollector;\n const shotTime = Date.now();\n const pageContext = await this.insight.contextRetrieverFn('assert');\n task.pageContext = pageContext;\n\n const recordItem: ExecutionRecorderItem = {\n type: 'screenshot',\n ts: shotTime,\n screenshot: pageContext.screenshotBase64,\n timing: 'before Insight',\n };\n task.recorder = [recordItem];\n\n const assertion = await this.insight.assert(\n assertPlan.param.assertion,\n );\n\n if (!assertion.pass) {\n if (plan.type === 'Assert') {\n task.output = assertion;\n task.log = {\n dump: insightDump,\n };\n throw new Error(\n assertion.thought || 'Assertion failed without reason',\n );\n }\n\n task.error = new Error(assertion.thought);\n }\n\n return {\n output: assertion,\n pageContext,\n log: {\n dump: insightDump,\n },\n usage: assertion.usage,\n };\n },\n };\n tasks.push(taskAssert);\n } else if (plan.type === 'Error') {\n const taskActionError: ExecutionTaskActionApply<PlanningActionParamError> =\n {\n type: 'Action',\n subType: 'Error',\n param: plan.param,\n thought: plan.thought || plan.param?.thought,\n locate: plan.locate,\n executor: async () => {\n throw new Error(\n plan?.thought || plan.param?.thought || 'error without thought',\n );\n },\n };\n tasks.push(taskActionError);\n } else if (plan.type === 'Finished') {\n const taskActionFinished: ExecutionTaskActionApply<null> = {\n type: 'Action',\n subType: 'Finished',\n param: null,\n thought: plan.thought,\n locate: plan.locate,\n executor: async (param) => {},\n };\n tasks.push(taskActionFinished);\n } else if (plan.type === 'Sleep') {\n const taskActionSleep: ExecutionTaskActionApply<PlanningActionParamSleep> =\n {\n type: 'Action',\n subType: 'Sleep',\n param: plan.param,\n thought: plan.thought,\n locate: plan.locate,\n executor: async (taskParam) => {\n await sleep(taskParam?.timeMs || 3000);\n },\n };\n tasks.push(taskActionSleep);\n } else if (plan.type === 'Drag') {\n const taskActionDrag: ExecutionTaskActionApply<{\n start_box: { x: number; y: number };\n end_box: { x: number; y: number };\n }> = {\n type: 'Action',\n subType: 'Drag',\n param: plan.param,\n thought: plan.thought,\n locate: plan.locate,\n executor: async (taskParam) => {\n assert(\n taskParam?.start_box && taskParam?.end_box,\n 'No start_box or end_box to drag',\n );\n await this.page.mouse.drag(taskParam.start_box, taskParam.end_box);\n },\n };\n tasks.push(taskActionDrag);\n } else {\n const planType = plan.type;\n const task: ExecutionTaskActionApply = {\n type: 'Action',\n subType: planType,\n thought: plan.thought,\n param: plan.param,\n executor: async (param, context) => {\n debug(\n 'executing action',\n planType,\n param,\n `context.element.center: ${context.element?.center}`,\n );\n const actionSpace = await this.page.actionSpace();\n const action = actionSpace.find(\n (action) => action.name === planType,\n );\n if (!action) {\n throw new Error(`Action type '${planType}' not found`);\n }\n const actionFn = action.call.bind(this.page);\n return await actionFn(context, param);\n },\n };\n tasks.push(task);\n }\n }\n\n const wrappedTasks = tasks.map(\n (task: ExecutionTaskApply, index: number) => {\n if (task.type === 'Action') {\n return this.prependExecutorWithScreenshot(\n task,\n index === tasks.length - 1,\n );\n }\n return task;\n },\n );\n\n return {\n tasks: wrappedTasks,\n };\n }\n\n private async setupPlanningContext(executorContext: ExecutorContext) {\n const shotTime = Date.now();\n const pageContext = await this.insight.contextRetrieverFn('locate');\n const recordItem: ExecutionRecorderItem = {\n type: 'screenshot',\n ts: shotTime,\n screenshot: pageContext.screenshotBase64,\n timing: 'before Planning',\n };\n\n executorContext.task.recorder = [recordItem];\n (executorContext.task as ExecutionTaskPlanning).pageContext = pageContext;\n\n return {\n pageContext,\n };\n }\n\n async loadYamlFlowAsPlanning(userInstruction: string, yamlString: string) {\n const taskExecutor = new Executor(taskTitleStr('Action', userInstruction), {\n onTaskStart: this.onTaskStartCallback,\n });\n\n const task: ExecutionTaskPlanningApply = {\n type: 'Planning',\n subType: 'LoadYaml',\n locate: null,\n param: {\n userInstruction,\n },\n executor: async (param, executorContext) => {\n await this.setupPlanningContext(executorContext);\n return {\n output: {\n actions: [],\n more_actions_needed_by_instruction: false,\n log: '',\n yamlString,\n },\n cache: {\n hit: true,\n },\n };\n },\n };\n\n await taskExecutor.append(task);\n await taskExecutor.flush();\n\n return {\n executor: taskExecutor,\n };\n }\n\n private planningTaskFromPrompt(\n userInstruction: string,\n log?: string,\n actionContext?: string,\n ) {\n const task: ExecutionTaskPlanningApply = {\n type: 'Planning',\n subType: 'Plan',\n locate: null,\n param: {\n userInstruction,\n log,\n },\n executor: async (param, executorContext) => {\n const startTime = Date.now();\n const { pageContext } =\n await this.setupPlanningContext(executorContext);\n\n assert(\n this.page.actionSpace,\n 'actionSpace for device is not implemented',\n );\n const actionSpace = await this.page.actionSpace();\n debug(\n 'actionSpace for page is:',\n actionSpace.map((action) => action.name).join(', '),\n );\n assert(Array.isArray(actionSpace), 'actionSpace must be an array');\n if (actionSpace.length === 0) {\n console.warn(\n `ActionSpace for ${this.page.pageType} is empty. This may lead to unexpected behavior.`,\n );\n }\n\n const planResult = await plan(param.userInstruction, {\n context: pageContext,\n log: param.log,\n actionContext,\n pageType: this.page.pageType as PageType,\n actionSpace,\n });\n\n const {\n actions,\n log,\n more_actions_needed_by_instruction,\n error,\n usage,\n rawResponse,\n sleep,\n } = planResult;\n\n executorContext.task.log = {\n ...(executorContext.task.log || {}),\n rawResponse,\n };\n executorContext.task.usage = usage;\n\n let stopCollecting = false;\n let bboxCollected = false;\n let planParsingError = '';\n const finalActions = (actions || []).reduce<PlanningAction[]>(\n (acc, planningAction) => {\n if (stopCollecting) {\n return acc;\n }\n\n if (planningAction.locate) {\n // we only collect bbox once, let qwen re-locate in the following steps\n if (bboxCollected && planningAction.locate.bbox) {\n // biome-ignore lint/performance/noDelete: <explanation>\n delete planningAction.locate.bbox;\n }\n\n if (planningAction.locate.bbox) {\n bboxCollected = true;\n }\n\n acc.push({\n type: 'Locate',\n locate: planningAction.locate,\n param: null,\n // thought is prompt created by ai, always a string\n thought: planningAction.locate.prompt as string,\n });\n } else if (\n ['Tap', 'Hover', 'Input'].includes(planningAction.type)\n ) {\n planParsingError = `invalid planning response: ${JSON.stringify(planningAction)}`;\n // should include locate but get null\n stopCollecting = true;\n return acc;\n }\n acc.push(planningAction);\n return acc;\n },\n [],\n );\n\n if (sleep) {\n const timeNow = Date.now();\n const timeRemaining = sleep - (timeNow - startTime);\n if (timeRemaining > 0) {\n finalActions.push({\n type: 'Sleep',\n param: {\n timeMs: timeRemaining,\n },\n locate: null,\n } as PlanningAction<PlanningActionParamSleep>);\n }\n }\n\n if (finalActions.length === 0) {\n assert(\n !more_actions_needed_by_instruction || sleep,\n error\n ? `Failed to plan: ${error}`\n : planParsingError || 'No plan found',\n );\n }\n\n return {\n output: {\n actions: finalActions,\n more_actions_needed_by_instruction,\n log,\n yamlFlow: planResult.yamlFlow,\n },\n cache: {\n hit: false,\n },\n pageContext,\n };\n },\n };\n\n return task;\n }\n\n private planningTaskToGoal(userInstruction: string) {\n const task: ExecutionTaskPlanningApply = {\n type: 'Planning',\n subType: 'Plan',\n locate: null,\n param: {\n userInstruction,\n },\n executor: async (param, executorContext) => {\n const { pageContext } =\n await this.setupPlanningContext(executorContext);\n\n const imagePayload = await resizeImageForUiTars(\n pageContext.screenshotBase64,\n pageContext.size,\n );\n\n this.appendConversationHistory({\n role: 'user',\n content: [\n {\n type: 'image_url',\n image_url: {\n url: imagePayload,\n },\n },\n ],\n });\n const planResult: {\n actions: PlanningAction<any>[];\n action_summary: string;\n usage?: AIUsageInfo;\n yamlFlow?: MidsceneYamlFlowItem[];\n rawResponse?: string;\n } = await vlmPlanning({\n userInstruction: param.userInstruction,\n conversationHistory: this.conversationHistory,\n size: pageContext.size,\n });\n\n const { actions, action_summary, usage } = planResult;\n executorContext.task.log = {\n ...(executorContext.task.log || {}),\n rawResponse: planResult.rawResponse,\n };\n executorContext.task.usage = usage;\n this.appendConversationHistory({\n role: 'assistant',\n content: action_summary,\n });\n return {\n output: {\n actions,\n thought: actions[0]?.thought,\n actionType: actions[0].type,\n more_actions_needed_by_instruction: true,\n log: '',\n yamlFlow: planResult.yamlFlow,\n },\n cache: {\n hit: false,\n },\n };\n },\n };\n\n return task;\n }\n\n async runPlans(\n title: string,\n plans: PlanningAction[],\n opts?: {\n cacheable?: boolean;\n },\n ): Promise<ExecutionResult> {\n const taskExecutor = new Executor(title, {\n onTaskStart: this.onTaskStartCallback,\n });\n const { tasks } = await this.convertPlanToExecutable(plans, opts);\n await taskExecutor.append(tasks);\n const result = await taskExecutor.flush();\n const { output } = result!;\n return {\n output,\n executor: taskExecutor,\n };\n }\n\n async action(\n userPrompt: string,\n actionContext?: string,\n opts?: {\n cacheable?: boolean;\n },\n ): Promise<\n ExecutionResult<\n | {\n yamlFlow?: MidsceneYamlFlowItem[]; // for cache use\n }\n | undefined\n >\n > {\n const taskExecutor = new Executor(taskTitleStr('Action', userPrompt), {\n onTaskStart: this.onTaskStartCallback,\n });\n\n let planningTask: ExecutionTaskPlanningApply | null =\n this.planningTaskFromPrompt(userPrompt, undefined, actionContext);\n let replanCount = 0;\n const logList: string[] = [];\n\n const yamlFlow: MidsceneYamlFlowItem[] = [];\n const replanningCycleLimit =\n getAIConfigInNumber(MIDSCENE_REPLANNING_CYCLE_LIMIT) ||\n defaultReplanningCycleLimit;\n while (planningTask) {\n if (replanCount > replanningCycleLimit) {\n const errorMsg =\n 'Replanning too many times, please split the task into multiple steps';\n\n return this.appendErrorPlan(taskExecutor, errorMsg);\n }\n\n // plan\n await taskExecutor.append(planningTask);\n const result = await taskExecutor.flush();\n const planResult: PlanningAIResponse = result?.output;\n if (taskExecutor.isInErrorState()) {\n return {\n output: planResult,\n executor: taskExecutor,\n };\n }\n\n const plans = planResult.actions || [];\n yamlFlow.push(...(planResult.yamlFlow || []));\n\n let executables: Awaited<ReturnType<typeof this.convertPlanToExecutable>>;\n try {\n executables = await this.convertPlanToExecutable(plans, opts);\n taskExecutor.append(executables.tasks);\n } catch (error) {\n return this.appendErrorPlan(\n taskExecutor,\n `Error converting plans to executable tasks: ${error}, plans: ${JSON.stringify(\n plans,\n )}`,\n );\n }\n\n await taskExecutor.flush();\n if (taskExecutor.isInErrorState()) {\n return {\n output: undefined,\n executor: taskExecutor,\n };\n }\n if (planResult?.log) {\n logList.push(planResult.log);\n }\n\n if (!planResult.more_actions_needed_by_instruction) {\n planningTask = null;\n break;\n }\n planningTask = this.planningTaskFromPrompt(\n userPrompt,\n logList.length > 0 ? `- ${logList.join('\\n- ')}` : undefined,\n actionContext,\n );\n replanCount++;\n }\n\n return {\n output: {\n yamlFlow,\n },\n executor: taskExecutor,\n };\n }\n\n async actionToGoal(\n userPrompt: string,\n opts?: {\n cacheable?: boolean;\n },\n ): Promise<\n ExecutionResult<\n | {\n yamlFlow?: MidsceneYamlFlowItem[]; // for cache use\n }\n | undefined\n >\n > {\n const taskExecutor = new Executor(taskTitleStr('Action', userPrompt), {\n onTaskStart: this.onTaskStartCallback,\n });\n this.conversationHistory = [];\n const isCompleted = false;\n let currentActionNumber = 0;\n const maxActionNumber = 40;\n\n const yamlFlow: MidsceneYamlFlowItem[] = [];\n while (!isCompleted && currentActionNumber < maxActionNumber) {\n currentActionNumber++;\n const planningTask: ExecutionTaskPlanningApply =\n this.planningTaskToGoal(userPrompt);\n await taskExecutor.append(planningTask);\n const result = await taskExecutor.flush();\n if (taskExecutor.isInErrorState()) {\n return {\n output: undefined,\n executor: taskExecutor,\n };\n }\n if (!result) {\n throw new Error(\n 'result of taskExecutor.flush() is undefined in function actionToGoal',\n );\n }\n const { output } = result;\n const plans = output.actions;\n yamlFlow.push(...(output.yamlFlow || []));\n let executables: Awaited<ReturnType<typeof this.convertPlanToExecutable>>;\n try {\n executables = await this.convertPlanToExecutable(plans, opts);\n taskExecutor.append(executables.tasks);\n } catch (error) {\n return this.appendErrorPlan(\n taskExecutor,\n `Error converting plans to executable tasks: ${error}, plans: ${JSON.stringify(\n plans,\n )}`,\n );\n }\n\n await taskExecutor.flush();\n\n if (taskExecutor.isInErrorState()) {\n return {\n output: undefined,\n executor: taskExecutor,\n };\n }\n\n if (plans[0].type === 'Finished') {\n break;\n }\n }\n return {\n output: {\n yamlFlow,\n },\n executor: taskExecutor,\n };\n }\n\n private async createTypeQueryTask<T>(\n type: 'Query' | 'Boolean' | 'Number' | 'String' | 'Assert',\n demand: InsightExtractParam,\n opt?: InsightExtractOption,\n multimodalPrompt?: TMultimodalPrompt,\n ): Promise<ExecutionResult<T>> {\n const taskExecutor = new Executor(\n taskTitleStr(\n type,\n typeof demand === 'string' ? demand : JSON.stringify(demand),\n ),\n {\n onTaskStart: this.onTaskStartCallback,\n },\n );\n\n const queryTask: ExecutionTaskInsightQueryApply = {\n type: 'Insight',\n subType: type,\n locate: null,\n param: {\n // TODO: display image thumbnail in report\n dataDemand: multimodalPrompt\n ? ({\n demand,\n multimodalPrompt,\n } as never)\n : demand, // for user param presentation in report right sidebar\n },\n executor: async (param, taskContext) => {\n const { task } = taskContext;\n let insightDump: InsightDump | undefined;\n const dumpCollector: DumpSubscriber = (dump) => {\n insightDump = dump;\n };\n this.insight.onceDumpUpdatedFn = dumpCollector;\n\n // Get page context for query operations\n const shotTime = Date.now();\n const pageContext = await this.insight.contextRetrieverFn('extract');\n task.pageContext = pageContext;\n\n const recordItem: ExecutionRecorderItem = {\n type: 'screenshot',\n ts: shotTime,\n screenshot: pageContext.screenshotBase64,\n timing: 'before Extract',\n };\n task.recorder = [recordItem];\n\n const ifTypeRestricted = type !== 'Query';\n let demandInput = demand;\n if (ifTypeRestricted) {\n demandInput = {\n result: `${type}, ${demand}`,\n };\n }\n\n const { data, usage, thought } = await this.insight.extract<any>(\n demandInput,\n opt,\n multimodalPrompt,\n );\n\n let outputResult = data;\n if (ifTypeRestricted) {\n assert(data?.result !== undefined, 'No result in query data');\n outputResult = (data as any).result;\n }\n\n return {\n output: outputResult,\n log: { dump: insightDump },\n usage,\n thought,\n };\n },\n };\n\n await taskExecutor.append(this.prependExecutorWithScreenshot(queryTask));\n const result = await taskExecutor.flush();\n\n if (!result) {\n throw new Error(\n 'result of taskExecutor.flush() is undefined in function createTypeQueryTask',\n );\n }\n\n const { output, thought } = result;\n\n return {\n output,\n thought,\n executor: taskExecutor,\n };\n }\n\n async query(\n demand: InsightExtractParam,\n opt?: InsightExtractOption,\n ): Promise<ExecutionResult> {\n return this.createTypeQueryTask('Query', demand, opt);\n }\n\n async boolean(\n prompt: TUserPrompt,\n opt?: InsightExtractOption,\n ): Promise<ExecutionResult<boolean>> {\n const { textPrompt, multimodalPrompt } = parsePrompt(prompt);\n return this.createTypeQueryTask<boolean>(\n 'Boolean',\n textPrompt,\n opt,\n multimodalPrompt,\n );\n }\n\n async number(\n prompt: TUserPrompt,\n opt?: InsightExtractOption,\n ): Promise<ExecutionResult<number>> {\n const { textPrompt, multimodalPrompt } = parsePrompt(prompt);\n return this.createTypeQueryTask<number>(\n 'Number',\n textPrompt,\n opt,\n multimodalPrompt,\n );\n }\n\n async string(\n prompt: TUserPrompt,\n opt?: InsightExtractOption,\n ): Promise<ExecutionResult<string>> {\n const { textPrompt, multimodalPrompt } = parsePrompt(prompt);\n return this.createTypeQueryTask<string>(\n 'String',\n textPrompt,\n opt,\n multimodalPrompt,\n );\n }\n\n async assert(\n assertion: TUserPrompt,\n opt?: InsightExtractOption,\n ): Promise<ExecutionResult<boolean>> {\n const { textPrompt, multimodalPrompt } = parsePrompt(assertion);\n return await this.createTypeQueryTask<boolean>(\n 'Assert',\n textPrompt,\n opt,\n multimodalPrompt,\n );\n }\n\n /**\n * Append a message to the conversation history\n * For user messages with images:\n * - Keep max 4 user image messages in history\n * - Remove oldest user image message when limit reached\n * For assistant messages:\n * - Simply append to history\n * @param conversationHistory Message to append\n */\n private appendConversationHistory(\n conversationHistory: ChatCompletionMessageParam,\n ) {\n if (conversationHistory.role === 'user') {\n // Get all existing user messages with images\n const userImgItems = this.conversationHistory.filter(\n (item) => item.role === 'user',\n );\n\n // If we already have 4 user image messages\n if (userImgItems.length >= 4 && conversationHistory.role === 'user') {\n // Remove first user image message when we already have 4, before adding new one\n const firstUserImgIndex = this.conversationHistory.findIndex(\n (item) => item.role === 'user',\n );\n if (firstUserImgIndex >= 0) {\n this.conversationHistory.splice(firstUserImgIndex, 1);\n }\n }\n }\n // For non-user messages, simply append to history\n this.conversationHistory.push(conversationHistory);\n }\n\n private async appendErrorPlan(taskExecutor: Executor, errorMsg: string) {\n const errorPlan: PlanningAction<PlanningActionParamError> = {\n type: 'Error',\n param: {\n thought: errorMsg,\n },\n locate: null,\n };\n const { tasks } = await this.convertPlanToExecutable([errorPlan]);\n await taskExecutor.append(this.prependExecutorWithScreenshot(tasks[0]));\n await taskExecutor.flush();\n\n return {\n output: undefined,\n executor: taskExecutor,\n };\n }\n\n async waitFor(\n assertion: string,\n opt: PlanningActionParamWaitFor,\n ): Promise<ExecutionResult<void>> {\n const description = `waitFor: ${assertion}`;\n const taskExecutor = new Executor(taskTitleStr('WaitFor', description), {\n onTaskStart: this.onTaskStartCallback,\n });\n const { timeoutMs, checkIntervalMs } = opt;\n\n assert(assertion, 'No assertion for waitFor');\n assert(timeoutMs, 'No timeoutMs for waitFor');\n assert(checkIntervalMs, 'No checkIntervalMs for waitFor');\n\n const overallStartTime = Date.now();\n let startTime = Date.now();\n let errorThought = '';\n while (Date.now() - overallStartTime < timeoutMs) {\n startTime = Date.now();\n const assertPlan: PlanningAction<PlanningActionParamAssert> = {\n type: 'AssertWithoutThrow',\n param: {\n assertion,\n },\n locate: null,\n };\n const { tasks: assertTasks } = await this.convertPlanToExecutable([\n assertPlan,\n ]);\n await taskExecutor.append(\n this.prependExecutorWithScreenshot(assertTasks[0]),\n );\n const result = await taskExecutor.flush();\n\n if (!result) {\n throw new Error(\n 'result of taskExecutor.flush() is undefined in function waitFor',\n );\n }\n\n const { output } = result as { output: InsightAssertionResponse };\n\n if (output?.pass) {\n return {\n output: undefined,\n executor: taskExecutor,\n };\n }\n\n errorThought =\n output?.thought ||\n `unknown error when waiting for assertion: ${assertion}`;\n const now = Date.now();\n if (now - startTime < checkIntervalMs) {\n const timeRemaining = checkIntervalMs - (now - startTime);\n const sleepPlan: PlanningAction<PlanningActionParamSleep> = {\n type: 'Sleep',\n param: {\n timeMs: timeRemaining,\n },\n locate: null,\n };\n const { tasks: sleepTasks } = await this.convertPlanToExecutable([\n sleepPlan,\n ]);\n await taskExecutor.append(\n this.prependExecutorWithScreenshot(sleepTasks[0]),\n );\n await taskExecutor.flush();\n }\n }\n\n return this.appendErrorPlan(\n taskExecutor,\n `waitFor timeout: ${errorThought}`,\n );\n }\n}\n"],"names":["debug","getDebug","defaultReplanningCycleLimit","PageTaskExecutor","timing","base64","item","Date","pageContext","element","_element_attributes","elementId","undefined","xpaths","NodeType","info","elementByPositionWithElementInfo","result","error","taskApply","appendAfterExecution","taskWithScreenshot","param","context","args","recorder","task","shot","Promise","sleep","shot2","plans","opts","tasks","plan","_plan_locate","_plan_locate1","taskFind","taskContext","_this_taskCache","_locateCacheRecord_cacheContent","assert","insightDump","usage","dumpCollector","dump","_dump_taskInfo","shotTime","recordItem","elementFromXpath","userExpectedPathHitFlag","cachePrompt","locateCacheRecord","elementFromCache","matchElementFromCache","cacheHitFlag","elementFromPlan","matchElementFromPlan","planHitFlag","elementFromAiLocate","aiLocateHitFlag","currentXpaths","elementXpaths","Error","hitBy","assertPlan","taskAssert","assertion","_plan_param","taskActionError","taskActionFinished","taskActionSleep","taskParam","taskActionDrag","planType","_context_element","actionSpace","action","actionFn","wrappedTasks","index","executorContext","userInstruction","yamlString","taskExecutor","Executor","taskTitleStr","log","actionContext","startTime","Array","console","planResult","actions","more_actions_needed_by_instruction","rawResponse","stopCollecting","bboxCollected","planParsingError","finalActions","acc","planningAction","JSON","timeNow","timeRemaining","_actions_","imagePayload","resizeImageForUiTars","vlmPlanning","action_summary","title","output","userPrompt","planningTask","replanCount","logList","yamlFlow","replanningCycleLimit","getAIConfigInNumber","MIDSCENE_REPLANNING_CYCLE_LIMIT","errorMsg","executables","isCompleted","currentActionNumber","maxActionNumber","type","demand","opt","multimodalPrompt","queryTask","ifTypeRestricted","demandInput","data","thought","outputResult","prompt","textPrompt","parsePrompt","conversationHistory","userImgItems","firstUserImgIndex","errorPlan","description","timeoutMs","checkIntervalMs","overallStartTime","errorThought","assertTasks","now","sleepPlan","sleepTasks","page","insight"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"common/tasks.mjs","sources":["webpack://@midscene/web/./src/common/tasks.ts"],"sourcesContent":["import type { AndroidDevicePage, WebPage } from '@/common/page';\nimport type { PuppeteerWebPage } from '@/puppeteer';\nimport {\n type AIUsageInfo,\n type BaseElement,\n type DeviceAction,\n type DumpSubscriber,\n type ExecutionRecorderItem,\n type ExecutionTaskActionApply,\n type ExecutionTaskApply,\n type ExecutionTaskHitBy,\n type ExecutionTaskInsightLocateApply,\n type ExecutionTaskInsightQueryApply,\n type ExecutionTaskPlanning,\n type ExecutionTaskPlanningApply,\n type ExecutionTaskProgressOptions,\n Executor,\n type ExecutorContext,\n type Insight,\n type InsightAssertionResponse,\n type InsightDump,\n type InsightExtractOption,\n type InsightExtractParam,\n type LocateResultElement,\n type MidsceneYamlFlowItem,\n type PageType,\n type PlanningAIResponse,\n type PlanningAction,\n type PlanningActionParamAssert,\n type PlanningActionParamError,\n type PlanningActionParamSleep,\n type PlanningActionParamWaitFor,\n type TMultimodalPrompt,\n type TUserPrompt,\n type UIContext,\n plan,\n} from '@midscene/core';\nimport {\n type ChatCompletionMessageParam,\n elementByPositionWithElementInfo,\n resizeImageForUiTars,\n vlmPlanning,\n} from '@midscene/core/ai-model';\nimport { sleep } from '@midscene/core/utils';\nimport { NodeType } from '@midscene/shared/constants';\nimport {\n MIDSCENE_REPLANNING_CYCLE_LIMIT,\n getAIConfigInNumber,\n} from '@midscene/shared/env';\nimport { getDebug } from '@midscene/shared/logger';\nimport { assert } from '@midscene/shared/utils';\nimport type { WebElementInfo, WebUIContext } from '../web-element';\nimport type { TaskCache } from './task-cache';\nimport { taskTitleStr } from './ui-utils';\nimport {\n matchElementFromCache,\n matchElementFromPlan,\n parsePrompt,\n} from './utils';\n\ninterface ExecutionResult<OutputType = any> {\n output: OutputType;\n thought?: string;\n executor: Executor;\n}\n\nconst debug = getDebug('device-task-executor');\nconst defaultReplanningCycleLimit = 10;\n\nexport class PageTaskExecutor {\n page: WebPage;\n\n insight: Insight<WebElementInfo, WebUIContext>;\n\n taskCache?: TaskCache;\n\n conversationHistory: ChatCompletionMessageParam[] = [];\n\n onTaskStartCallback?: ExecutionTaskProgressOptions['onTaskStart'];\n\n constructor(\n page: WebPage,\n insight: Insight<WebElementInfo, WebUIContext>,\n opts: {\n taskCache?: TaskCache;\n onTaskStart?: ExecutionTaskProgressOptions['onTaskStart'];\n },\n ) {\n this.page = page;\n this.insight = insight;\n\n this.taskCache = opts.taskCache;\n\n this.onTaskStartCallback = opts?.onTaskStart;\n }\n\n private async recordScreenshot(timing: ExecutionRecorderItem['timing']) {\n const base64 = await this.page.screenshotBase64();\n const item: ExecutionRecorderItem = {\n type: 'screenshot',\n ts: Date.now(),\n screenshot: base64,\n timing,\n };\n return item;\n }\n\n private async getElementXpath(\n pageContext: UIContext<BaseElement>,\n element: LocateResultElement,\n ): Promise<string[] | undefined> {\n let elementId = element?.id;\n if (element?.isOrderSensitive !== undefined) {\n const xpaths = await this.page.getXpathsByPoint(\n {\n left: element.center[0],\n top: element.center[1],\n },\n element?.isOrderSensitive,\n );\n\n return xpaths;\n }\n\n // find the nearest xpath for the element\n if (element?.attributes?.nodeType === NodeType.POSITION) {\n await this.insight.contextRetrieverFn('locate');\n const info = elementByPositionWithElementInfo(\n pageContext.tree,\n {\n x: element.center[0],\n y: element.center[1],\n },\n {\n requireStrictDistance: false,\n filterPositionElements: true,\n },\n );\n if (info?.id) {\n elementId = info.id;\n } else {\n debug(\n 'no element id found for position node, will not update cache',\n element,\n );\n }\n }\n\n if (!elementId) {\n return undefined;\n }\n try {\n const result = await this.page.getXpathsById(elementId);\n return result;\n } catch (error) {\n debug('getXpathsById error: ', error);\n }\n }\n\n private prependExecutorWithScreenshot(\n taskApply: ExecutionTaskApply,\n appendAfterExecution = false,\n ): ExecutionTaskApply {\n const taskWithScreenshot: ExecutionTaskApply = {\n ...taskApply,\n executor: async (param, context, ...args) => {\n const recorder: ExecutionRecorderItem[] = [];\n const { task } = context;\n // set the recorder before executor in case of error\n task.recorder = recorder;\n const shot = await this.recordScreenshot(`before ${task.type}`);\n recorder.push(shot);\n const result = await taskApply.executor(param, context, ...args);\n if (taskApply.type === 'Action') {\n await Promise.all([\n (async () => {\n await sleep(100);\n if ((this.page as PuppeteerWebPage).waitUntilNetworkIdle) {\n try {\n await (this.page as PuppeteerWebPage).waitUntilNetworkIdle();\n } catch (error) {\n // console.error('waitUntilNetworkIdle error', error);\n }\n }\n })(),\n sleep(200),\n ]);\n }\n if (appendAfterExecution) {\n const shot2 = await this.recordScreenshot('after Action');\n recorder.push(shot2);\n }\n return result;\n },\n };\n return taskWithScreenshot;\n }\n\n public async convertPlanToExecutable(\n plans: PlanningAction[],\n opts?: {\n cacheable?: boolean;\n },\n ) {\n const tasks: ExecutionTaskApply[] = [];\n for (const plan of plans) {\n if (plan.type === 'Locate') {\n if (\n plan.locate === null ||\n plan.locate?.id === null ||\n plan.locate?.id === 'null'\n ) {\n // console.warn('Locate action with id is null, will be ignored');\n continue;\n }\n const taskFind: ExecutionTaskInsightLocateApply = {\n type: 'Insight',\n subType: 'Locate',\n param: plan.locate\n ? {\n ...plan.locate,\n cacheable: opts?.cacheable,\n }\n : undefined,\n thought: plan.thought,\n locate: plan.locate,\n executor: async (param, taskContext) => {\n const { task } = taskContext;\n assert(\n param?.prompt || param?.id || param?.bbox,\n 'No prompt or id or position or bbox to locate',\n );\n let insightDump: InsightDump | undefined;\n let usage: AIUsageInfo | undefined;\n const dumpCollector: DumpSubscriber = (dump) => {\n insightDump = dump;\n usage = dump?.taskInfo?.usage;\n\n task.log = {\n dump: insightDump,\n };\n\n task.usage = usage;\n };\n this.insight.onceDumpUpdatedFn = dumpCollector;\n const shotTime = Date.now();\n\n // Get context through contextRetrieverFn which handles frozen context\n const pageContext = await this.insight.contextRetrieverFn('locate');\n task.pageContext = pageContext;\n\n const recordItem: ExecutionRecorderItem = {\n type: 'screenshot',\n ts: shotTime,\n screenshot: pageContext.screenshotBase64,\n timing: 'before Insight',\n };\n task.recorder = [recordItem];\n\n // try matching xpath\n const elementFromXpath = param.xpath\n ? await this.page.getElementInfoByXpath(param.xpath)\n : undefined;\n const userExpectedPathHitFlag = !!elementFromXpath;\n\n // try matching cache\n const cachePrompt = param.prompt;\n const locateCacheRecord =\n this.taskCache?.matchLocateCache(cachePrompt);\n const xpaths = locateCacheRecord?.cacheContent?.xpaths;\n const elementFromCache = userExpectedPathHitFlag\n ? null\n : await matchElementFromCache(\n this,\n xpaths,\n cachePrompt,\n param.cacheable,\n );\n const cacheHitFlag = !!elementFromCache;\n\n // try matching plan\n const elementFromPlan =\n !userExpectedPathHitFlag && !cacheHitFlag\n ? matchElementFromPlan(param, pageContext.tree)\n : undefined;\n const planHitFlag = !!elementFromPlan;\n\n // try ai locate\n const elementFromAiLocate =\n !userExpectedPathHitFlag && !cacheHitFlag && !planHitFlag\n ? (\n await this.insight.locate(param, {\n // fallback to ai locate\n context: pageContext,\n })\n ).element\n : undefined;\n const aiLocateHitFlag = !!elementFromAiLocate;\n\n const element =\n elementFromXpath || // highest priority\n elementFromCache || // second priority\n elementFromPlan || // third priority\n elementFromAiLocate;\n\n // update cache\n let currentXpaths: string[] | undefined;\n if (\n element &&\n this.taskCache &&\n !cacheHitFlag &&\n param?.cacheable !== false\n ) {\n const elementXpaths = await this.getElementXpath(\n pageContext,\n element,\n );\n if (elementXpaths?.length) {\n currentXpaths = elementXpaths;\n this.taskCache.updateOrAppendCacheRecord(\n {\n type: 'locate',\n prompt: cachePrompt,\n xpaths: elementXpaths,\n },\n locateCacheRecord,\n );\n } else {\n debug(\n 'no xpaths found, will not update cache',\n cachePrompt,\n elementXpaths,\n );\n }\n }\n if (!element) {\n throw new Error(`Element not found: ${param.prompt}`);\n }\n\n let hitBy: ExecutionTaskHitBy | undefined;\n\n if (userExpectedPathHitFlag) {\n hitBy = {\n from: 'User expected path',\n context: {\n xpath: param.xpath,\n },\n };\n } else if (cacheHitFlag) {\n hitBy = {\n from: 'Cache',\n context: {\n xpathsFromCache: xpaths,\n xpathsToSave: currentXpaths,\n },\n };\n } else if (planHitFlag) {\n hitBy = {\n from: 'Planning',\n context: {\n id: elementFromPlan?.id,\n bbox: elementFromPlan?.bbox,\n },\n };\n } else if (aiLocateHitFlag) {\n hitBy = {\n from: 'AI model',\n context: {\n prompt: param.prompt,\n },\n };\n }\n\n return {\n output: {\n element,\n },\n pageContext,\n hitBy,\n };\n },\n };\n tasks.push(taskFind);\n } else if (plan.type === 'Assert' || plan.type === 'AssertWithoutThrow') {\n const assertPlan = plan as PlanningAction<PlanningActionParamAssert>;\n const taskAssert: ExecutionTaskApply = {\n type: 'Insight',\n subType: 'Assert',\n param: assertPlan.param,\n thought: assertPlan.thought,\n locate: assertPlan.locate,\n executor: async (param, taskContext) => {\n const { task } = taskContext;\n let insightDump: InsightDump | undefined;\n const dumpCollector: DumpSubscriber = (dump) => {\n insightDump = dump;\n };\n this.insight.onceDumpUpdatedFn = dumpCollector;\n const shotTime = Date.now();\n const pageContext = await this.insight.contextRetrieverFn('assert');\n task.pageContext = pageContext;\n\n const recordItem: ExecutionRecorderItem = {\n type: 'screenshot',\n ts: shotTime,\n screenshot: pageContext.screenshotBase64,\n timing: 'before Insight',\n };\n task.recorder = [recordItem];\n\n const assertion = await this.insight.assert(\n assertPlan.param.assertion,\n );\n\n if (!assertion.pass) {\n if (plan.type === 'Assert') {\n task.output = assertion;\n task.log = {\n dump: insightDump,\n };\n throw new Error(\n assertion.thought || 'Assertion failed without reason',\n );\n }\n\n task.error = new Error(assertion.thought);\n }\n\n return {\n output: assertion,\n pageContext,\n log: {\n dump: insightDump,\n },\n usage: assertion.usage,\n };\n },\n };\n tasks.push(taskAssert);\n } else if (plan.type === 'Error') {\n const taskActionError: ExecutionTaskActionApply<PlanningActionParamError> =\n {\n type: 'Action',\n subType: 'Error',\n param: plan.param,\n thought: plan.thought || plan.param?.thought,\n locate: plan.locate,\n executor: async () => {\n throw new Error(\n plan?.thought || plan.param?.thought || 'error without thought',\n );\n },\n };\n tasks.push(taskActionError);\n } else if (plan.type === 'Finished') {\n const taskActionFinished: ExecutionTaskActionApply<null> = {\n type: 'Action',\n subType: 'Finished',\n param: null,\n thought: plan.thought,\n locate: plan.locate,\n executor: async (param) => {},\n };\n tasks.push(taskActionFinished);\n } else if (plan.type === 'Sleep') {\n const taskActionSleep: ExecutionTaskActionApply<PlanningActionParamSleep> =\n {\n type: 'Action',\n subType: 'Sleep',\n param: plan.param,\n thought: plan.thought,\n locate: plan.locate,\n executor: async (taskParam) => {\n await sleep(taskParam?.timeMs || 3000);\n },\n };\n tasks.push(taskActionSleep);\n } else if (plan.type === 'Drag') {\n const taskActionDrag: ExecutionTaskActionApply<{\n start_box: { x: number; y: number };\n end_box: { x: number; y: number };\n }> = {\n type: 'Action',\n subType: 'Drag',\n param: plan.param,\n thought: plan.thought,\n locate: plan.locate,\n executor: async (taskParam) => {\n assert(\n taskParam?.start_box && taskParam?.end_box,\n 'No start_box or end_box to drag',\n );\n await this.page.mouse.drag(taskParam.start_box, taskParam.end_box);\n },\n };\n tasks.push(taskActionDrag);\n } else {\n const planType = plan.type;\n const task: ExecutionTaskActionApply = {\n type: 'Action',\n subType: planType,\n thought: plan.thought,\n param: plan.param,\n executor: async (param, context) => {\n debug(\n 'executing action',\n planType,\n param,\n `context.element.center: ${context.element?.center}`,\n );\n const actionSpace = await this.page.actionSpace();\n const action = actionSpace.find(\n (action) => action.name === planType,\n );\n if (!action) {\n throw new Error(`Action type '${planType}' not found`);\n }\n const actionFn = action.call.bind(this.page);\n return await actionFn(context, param);\n },\n };\n tasks.push(task);\n }\n }\n\n const wrappedTasks = tasks.map(\n (task: ExecutionTaskApply, index: number) => {\n if (task.type === 'Action') {\n return this.prependExecutorWithScreenshot(\n task,\n index === tasks.length - 1,\n );\n }\n return task;\n },\n );\n\n return {\n tasks: wrappedTasks,\n };\n }\n\n private async setupPlanningContext(executorContext: ExecutorContext) {\n const shotTime = Date.now();\n const pageContext = await this.insight.contextRetrieverFn('locate');\n const recordItem: ExecutionRecorderItem = {\n type: 'screenshot',\n ts: shotTime,\n screenshot: pageContext.screenshotBase64,\n timing: 'before Planning',\n };\n\n executorContext.task.recorder = [recordItem];\n (executorContext.task as ExecutionTaskPlanning).pageContext = pageContext;\n\n return {\n pageContext,\n };\n }\n\n async loadYamlFlowAsPlanning(userInstruction: string, yamlString: string) {\n const taskExecutor = new Executor(taskTitleStr('Action', userInstruction), {\n onTaskStart: this.onTaskStartCallback,\n });\n\n const task: ExecutionTaskPlanningApply = {\n type: 'Planning',\n subType: 'LoadYaml',\n locate: null,\n param: {\n userInstruction,\n },\n executor: async (param, executorContext) => {\n await this.setupPlanningContext(executorContext);\n return {\n output: {\n actions: [],\n more_actions_needed_by_instruction: false,\n log: '',\n yamlString,\n },\n cache: {\n hit: true,\n },\n };\n },\n };\n\n await taskExecutor.append(task);\n await taskExecutor.flush();\n\n return {\n executor: taskExecutor,\n };\n }\n\n private planningTaskFromPrompt(\n userInstruction: string,\n log?: string,\n actionContext?: string,\n ) {\n const task: ExecutionTaskPlanningApply = {\n type: 'Planning',\n subType: 'Plan',\n locate: null,\n param: {\n userInstruction,\n log,\n },\n executor: async (param, executorContext) => {\n const startTime = Date.now();\n const { pageContext } =\n await this.setupPlanningContext(executorContext);\n\n assert(\n this.page.actionSpace,\n 'actionSpace for device is not implemented',\n );\n const actionSpace = await this.page.actionSpace();\n debug(\n 'actionSpace for page is:',\n actionSpace.map((action) => action.name).join(', '),\n );\n assert(Array.isArray(actionSpace), 'actionSpace must be an array');\n if (actionSpace.length === 0) {\n console.warn(\n `ActionSpace for ${this.page.pageType} is empty. This may lead to unexpected behavior.`,\n );\n }\n\n const planResult = await plan(param.userInstruction, {\n context: pageContext,\n log: param.log,\n actionContext,\n pageType: this.page.pageType as PageType,\n actionSpace,\n });\n\n const {\n actions,\n log,\n more_actions_needed_by_instruction,\n error,\n usage,\n rawResponse,\n sleep,\n } = planResult;\n\n executorContext.task.log = {\n ...(executorContext.task.log || {}),\n rawResponse,\n };\n executorContext.task.usage = usage;\n\n let stopCollecting = false;\n let bboxCollected = false;\n let planParsingError = '';\n const finalActions = (actions || []).reduce<PlanningAction[]>(\n (acc, planningAction) => {\n if (stopCollecting) {\n return acc;\n }\n\n if (planningAction.locate) {\n // we only collect bbox once, let qwen re-locate in the following steps\n if (bboxCollected && planningAction.locate.bbox) {\n // biome-ignore lint/performance/noDelete: <explanation>\n delete planningAction.locate.bbox;\n }\n\n if (planningAction.locate.bbox) {\n bboxCollected = true;\n }\n\n acc.push({\n type: 'Locate',\n locate: planningAction.locate,\n param: null,\n // thought is prompt created by ai, always a string\n thought: planningAction.locate.prompt as string,\n });\n } else if (\n ['Tap', 'Hover', 'Input'].includes(planningAction.type)\n ) {\n planParsingError = `invalid planning response: ${JSON.stringify(planningAction)}`;\n // should include locate but get null\n stopCollecting = true;\n return acc;\n }\n acc.push(planningAction);\n return acc;\n },\n [],\n );\n\n if (sleep) {\n const timeNow = Date.now();\n const timeRemaining = sleep - (timeNow - startTime);\n if (timeRemaining > 0) {\n finalActions.push({\n type: 'Sleep',\n param: {\n timeMs: timeRemaining,\n },\n locate: null,\n } as PlanningAction<PlanningActionParamSleep>);\n }\n }\n\n if (finalActions.length === 0) {\n assert(\n !more_actions_needed_by_instruction || sleep,\n error\n ? `Failed to plan: ${error}`\n : planParsingError || 'No plan found',\n );\n }\n\n return {\n output: {\n actions: finalActions,\n more_actions_needed_by_instruction,\n log,\n yamlFlow: planResult.yamlFlow,\n },\n cache: {\n hit: false,\n },\n pageContext,\n };\n },\n };\n\n return task;\n }\n\n private planningTaskToGoal(userInstruction: string) {\n const task: ExecutionTaskPlanningApply = {\n type: 'Planning',\n subType: 'Plan',\n locate: null,\n param: {\n userInstruction,\n },\n executor: async (param, executorContext) => {\n const { pageContext } =\n await this.setupPlanningContext(executorContext);\n\n const imagePayload = await resizeImageForUiTars(\n pageContext.screenshotBase64,\n pageContext.size,\n );\n\n this.appendConversationHistory({\n role: 'user',\n content: [\n {\n type: 'image_url',\n image_url: {\n url: imagePayload,\n },\n },\n ],\n });\n const planResult: {\n actions: PlanningAction<any>[];\n action_summary: string;\n usage?: AIUsageInfo;\n yamlFlow?: MidsceneYamlFlowItem[];\n rawResponse?: string;\n } = await vlmPlanning({\n userInstruction: param.userInstruction,\n conversationHistory: this.conversationHistory,\n size: pageContext.size,\n });\n\n const { actions, action_summary, usage } = planResult;\n executorContext.task.log = {\n ...(executorContext.task.log || {}),\n rawResponse: planResult.rawResponse,\n };\n executorContext.task.usage = usage;\n this.appendConversationHistory({\n role: 'assistant',\n content: action_summary,\n });\n return {\n output: {\n actions,\n thought: actions[0]?.thought,\n actionType: actions[0].type,\n more_actions_needed_by_instruction: true,\n log: '',\n yamlFlow: planResult.yamlFlow,\n },\n cache: {\n hit: false,\n },\n };\n },\n };\n\n return task;\n }\n\n async runPlans(\n title: string,\n plans: PlanningAction[],\n opts?: {\n cacheable?: boolean;\n },\n ): Promise<ExecutionResult> {\n const taskExecutor = new Executor(title, {\n onTaskStart: this.onTaskStartCallback,\n });\n const { tasks } = await this.convertPlanToExecutable(plans, opts);\n await taskExecutor.append(tasks);\n const result = await taskExecutor.flush();\n const { output } = result!;\n return {\n output,\n executor: taskExecutor,\n };\n }\n\n async action(\n userPrompt: string,\n actionContext?: string,\n opts?: {\n cacheable?: boolean;\n },\n ): Promise<\n ExecutionResult<\n | {\n yamlFlow?: MidsceneYamlFlowItem[]; // for cache use\n }\n | undefined\n >\n > {\n const taskExecutor = new Executor(taskTitleStr('Action', userPrompt), {\n onTaskStart: this.onTaskStartCallback,\n });\n\n let planningTask: ExecutionTaskPlanningApply | null =\n this.planningTaskFromPrompt(userPrompt, undefined, actionContext);\n let replanCount = 0;\n const logList: string[] = [];\n\n const yamlFlow: MidsceneYamlFlowItem[] = [];\n const replanningCycleLimit =\n getAIConfigInNumber(MIDSCENE_REPLANNING_CYCLE_LIMIT) ||\n defaultReplanningCycleLimit;\n while (planningTask) {\n if (replanCount > replanningCycleLimit) {\n const errorMsg =\n 'Replanning too many times, please split the task into multiple steps';\n\n return this.appendErrorPlan(taskExecutor, errorMsg);\n }\n\n // plan\n await taskExecutor.append(planningTask);\n const result = await taskExecutor.flush();\n const planResult: PlanningAIResponse = result?.output;\n if (taskExecutor.isInErrorState()) {\n return {\n output: planResult,\n executor: taskExecutor,\n };\n }\n\n const plans = planResult.actions || [];\n yamlFlow.push(...(planResult.yamlFlow || []));\n\n let executables: Awaited<ReturnType<typeof this.convertPlanToExecutable>>;\n try {\n executables = await this.convertPlanToExecutable(plans, opts);\n taskExecutor.append(executables.tasks);\n } catch (error) {\n return this.appendErrorPlan(\n taskExecutor,\n `Error converting plans to executable tasks: ${error}, plans: ${JSON.stringify(\n plans,\n )}`,\n );\n }\n\n await taskExecutor.flush();\n if (taskExecutor.isInErrorState()) {\n return {\n output: undefined,\n executor: taskExecutor,\n };\n }\n if (planResult?.log) {\n logList.push(planResult.log);\n }\n\n if (!planResult.more_actions_needed_by_instruction) {\n planningTask = null;\n break;\n }\n planningTask = this.planningTaskFromPrompt(\n userPrompt,\n logList.length > 0 ? `- ${logList.join('\\n- ')}` : undefined,\n actionContext,\n );\n replanCount++;\n }\n\n return {\n output: {\n yamlFlow,\n },\n executor: taskExecutor,\n };\n }\n\n async actionToGoal(\n userPrompt: string,\n opts?: {\n cacheable?: boolean;\n },\n ): Promise<\n ExecutionResult<\n | {\n yamlFlow?: MidsceneYamlFlowItem[]; // for cache use\n }\n | undefined\n >\n > {\n const taskExecutor = new Executor(taskTitleStr('Action', userPrompt), {\n onTaskStart: this.onTaskStartCallback,\n });\n this.conversationHistory = [];\n const isCompleted = false;\n let currentActionNumber = 0;\n const maxActionNumber = 40;\n\n const yamlFlow: MidsceneYamlFlowItem[] = [];\n while (!isCompleted && currentActionNumber < maxActionNumber) {\n currentActionNumber++;\n const planningTask: ExecutionTaskPlanningApply =\n this.planningTaskToGoal(userPrompt);\n await taskExecutor.append(planningTask);\n const result = await taskExecutor.flush();\n if (taskExecutor.isInErrorState()) {\n return {\n output: undefined,\n executor: taskExecutor,\n };\n }\n if (!result) {\n throw new Error(\n 'result of taskExecutor.flush() is undefined in function actionToGoal',\n );\n }\n const { output } = result;\n const plans = output.actions;\n yamlFlow.push(...(output.yamlFlow || []));\n let executables: Awaited<ReturnType<typeof this.convertPlanToExecutable>>;\n try {\n executables = await this.convertPlanToExecutable(plans, opts);\n taskExecutor.append(executables.tasks);\n } catch (error) {\n return this.appendErrorPlan(\n taskExecutor,\n `Error converting plans to executable tasks: ${error}, plans: ${JSON.stringify(\n plans,\n )}`,\n );\n }\n\n await taskExecutor.flush();\n\n if (taskExecutor.isInErrorState()) {\n return {\n output: undefined,\n executor: taskExecutor,\n };\n }\n\n if (plans[0].type === 'Finished') {\n break;\n }\n }\n return {\n output: {\n yamlFlow,\n },\n executor: taskExecutor,\n };\n }\n\n private async createTypeQueryTask<T>(\n type: 'Query' | 'Boolean' | 'Number' | 'String' | 'Assert',\n demand: InsightExtractParam,\n opt?: InsightExtractOption,\n multimodalPrompt?: TMultimodalPrompt,\n ): Promise<ExecutionResult<T>> {\n const taskExecutor = new Executor(\n taskTitleStr(\n type,\n typeof demand === 'string' ? demand : JSON.stringify(demand),\n ),\n {\n onTaskStart: this.onTaskStartCallback,\n },\n );\n\n const queryTask: ExecutionTaskInsightQueryApply = {\n type: 'Insight',\n subType: type,\n locate: null,\n param: {\n // TODO: display image thumbnail in report\n dataDemand: multimodalPrompt\n ? ({\n demand,\n multimodalPrompt,\n } as never)\n : demand, // for user param presentation in report right sidebar\n },\n executor: async (param, taskContext) => {\n const { task } = taskContext;\n let insightDump: InsightDump | undefined;\n const dumpCollector: DumpSubscriber = (dump) => {\n insightDump = dump;\n };\n this.insight.onceDumpUpdatedFn = dumpCollector;\n\n // Get page context for query operations\n const shotTime = Date.now();\n const pageContext = await this.insight.contextRetrieverFn('extract');\n task.pageContext = pageContext;\n\n const recordItem: ExecutionRecorderItem = {\n type: 'screenshot',\n ts: shotTime,\n screenshot: pageContext.screenshotBase64,\n timing: 'before Extract',\n };\n task.recorder = [recordItem];\n\n const ifTypeRestricted = type !== 'Query';\n let demandInput = demand;\n if (ifTypeRestricted) {\n const returnType = type === 'Assert' ? 'Boolean' : type;\n demandInput = {\n result: `${returnType}, ${demand}`,\n };\n }\n\n const { data, usage, thought } = await this.insight.extract<any>(\n demandInput,\n opt,\n multimodalPrompt,\n );\n\n let outputResult = data;\n if (ifTypeRestricted) {\n assert(data?.result !== undefined, 'No result in query data');\n outputResult = (data as any).result;\n }\n\n return {\n output: outputResult,\n log: { dump: insightDump },\n usage,\n thought,\n };\n },\n };\n\n await taskExecutor.append(this.prependExecutorWithScreenshot(queryTask));\n const result = await taskExecutor.flush();\n\n if (!result) {\n throw new Error(\n 'result of taskExecutor.flush() is undefined in function createTypeQueryTask',\n );\n }\n\n const { output, thought } = result;\n\n return {\n output,\n thought,\n executor: taskExecutor,\n };\n }\n\n async query(\n demand: InsightExtractParam,\n opt?: InsightExtractOption,\n ): Promise<ExecutionResult> {\n return this.createTypeQueryTask('Query', demand, opt);\n }\n\n async boolean(\n prompt: TUserPrompt,\n opt?: InsightExtractOption,\n ): Promise<ExecutionResult<boolean>> {\n const { textPrompt, multimodalPrompt } = parsePrompt(prompt);\n return this.createTypeQueryTask<boolean>(\n 'Boolean',\n textPrompt,\n opt,\n multimodalPrompt,\n );\n }\n\n async number(\n prompt: TUserPrompt,\n opt?: InsightExtractOption,\n ): Promise<ExecutionResult<number>> {\n const { textPrompt, multimodalPrompt } = parsePrompt(prompt);\n return this.createTypeQueryTask<number>(\n 'Number',\n textPrompt,\n opt,\n multimodalPrompt,\n );\n }\n\n async string(\n prompt: TUserPrompt,\n opt?: InsightExtractOption,\n ): Promise<ExecutionResult<string>> {\n const { textPrompt, multimodalPrompt } = parsePrompt(prompt);\n return this.createTypeQueryTask<string>(\n 'String',\n textPrompt,\n opt,\n multimodalPrompt,\n );\n }\n\n async assert(\n assertion: TUserPrompt,\n opt?: InsightExtractOption,\n ): Promise<ExecutionResult<boolean>> {\n const { textPrompt, multimodalPrompt } = parsePrompt(assertion);\n return await this.createTypeQueryTask<boolean>(\n 'Assert',\n textPrompt,\n opt,\n multimodalPrompt,\n );\n }\n\n /**\n * Append a message to the conversation history\n * For user messages with images:\n * - Keep max 4 user image messages in history\n * - Remove oldest user image message when limit reached\n * For assistant messages:\n * - Simply append to history\n * @param conversationHistory Message to append\n */\n private appendConversationHistory(\n conversationHistory: ChatCompletionMessageParam,\n ) {\n if (conversationHistory.role === 'user') {\n // Get all existing user messages with images\n const userImgItems = this.conversationHistory.filter(\n (item) => item.role === 'user',\n );\n\n // If we already have 4 user image messages\n if (userImgItems.length >= 4 && conversationHistory.role === 'user') {\n // Remove first user image message when we already have 4, before adding new one\n const firstUserImgIndex = this.conversationHistory.findIndex(\n (item) => item.role === 'user',\n );\n if (firstUserImgIndex >= 0) {\n this.conversationHistory.splice(firstUserImgIndex, 1);\n }\n }\n }\n // For non-user messages, simply append to history\n this.conversationHistory.push(conversationHistory);\n }\n\n private async appendErrorPlan(taskExecutor: Executor, errorMsg: string) {\n const errorPlan: PlanningAction<PlanningActionParamError> = {\n type: 'Error',\n param: {\n thought: errorMsg,\n },\n locate: null,\n };\n const { tasks } = await this.convertPlanToExecutable([errorPlan]);\n await taskExecutor.append(this.prependExecutorWithScreenshot(tasks[0]));\n await taskExecutor.flush();\n\n return {\n output: undefined,\n executor: taskExecutor,\n };\n }\n\n async waitFor(\n assertion: string,\n opt: PlanningActionParamWaitFor,\n ): Promise<ExecutionResult<void>> {\n const description = `waitFor: ${assertion}`;\n const taskExecutor = new Executor(taskTitleStr('WaitFor', description), {\n onTaskStart: this.onTaskStartCallback,\n });\n const { timeoutMs, checkIntervalMs } = opt;\n\n assert(assertion, 'No assertion for waitFor');\n assert(timeoutMs, 'No timeoutMs for waitFor');\n assert(checkIntervalMs, 'No checkIntervalMs for waitFor');\n\n const overallStartTime = Date.now();\n let startTime = Date.now();\n let errorThought = '';\n while (Date.now() - overallStartTime < timeoutMs) {\n startTime = Date.now();\n const assertPlan: PlanningAction<PlanningActionParamAssert> = {\n type: 'AssertWithoutThrow',\n param: {\n assertion,\n },\n locate: null,\n };\n const { tasks: assertTasks } = await this.convertPlanToExecutable([\n assertPlan,\n ]);\n await taskExecutor.append(\n this.prependExecutorWithScreenshot(assertTasks[0]),\n );\n const result = await taskExecutor.flush();\n\n if (!result) {\n throw new Error(\n 'result of taskExecutor.flush() is undefined in function waitFor',\n );\n }\n\n const { output } = result as { output: InsightAssertionResponse };\n\n if (output?.pass) {\n return {\n output: undefined,\n executor: taskExecutor,\n };\n }\n\n errorThought =\n output?.thought ||\n `unknown error when waiting for assertion: ${assertion}`;\n const now = Date.now();\n if (now - startTime < checkIntervalMs) {\n const timeRemaining = checkIntervalMs - (now - startTime);\n const sleepPlan: PlanningAction<PlanningActionParamSleep> = {\n type: 'Sleep',\n param: {\n timeMs: timeRemaining,\n },\n locate: null,\n };\n const { tasks: sleepTasks } = await this.convertPlanToExecutable([\n sleepPlan,\n ]);\n await taskExecutor.append(\n this.prependExecutorWithScreenshot(sleepTasks[0]),\n );\n await taskExecutor.flush();\n }\n }\n\n return this.appendErrorPlan(\n taskExecutor,\n `waitFor timeout: ${errorThought}`,\n );\n }\n}\n"],"names":["debug","getDebug","defaultReplanningCycleLimit","PageTaskExecutor","timing","base64","item","Date","pageContext","element","_element_attributes","elementId","undefined","xpaths","NodeType","info","elementByPositionWithElementInfo","result","error","taskApply","appendAfterExecution","taskWithScreenshot","param","context","args","recorder","task","shot","Promise","sleep","shot2","plans","opts","tasks","plan","_plan_locate","_plan_locate1","taskFind","taskContext","_this_taskCache","_locateCacheRecord_cacheContent","assert","insightDump","usage","dumpCollector","dump","_dump_taskInfo","shotTime","recordItem","elementFromXpath","userExpectedPathHitFlag","cachePrompt","locateCacheRecord","elementFromCache","matchElementFromCache","cacheHitFlag","elementFromPlan","matchElementFromPlan","planHitFlag","elementFromAiLocate","aiLocateHitFlag","currentXpaths","elementXpaths","Error","hitBy","assertPlan","taskAssert","assertion","_plan_param","taskActionError","taskActionFinished","taskActionSleep","taskParam","taskActionDrag","planType","_context_element","actionSpace","action","actionFn","wrappedTasks","index","executorContext","userInstruction","yamlString","taskExecutor","Executor","taskTitleStr","log","actionContext","startTime","Array","console","planResult","actions","more_actions_needed_by_instruction","rawResponse","stopCollecting","bboxCollected","planParsingError","finalActions","acc","planningAction","JSON","timeNow","timeRemaining","_actions_","imagePayload","resizeImageForUiTars","vlmPlanning","action_summary","title","output","userPrompt","planningTask","replanCount","logList","yamlFlow","replanningCycleLimit","getAIConfigInNumber","MIDSCENE_REPLANNING_CYCLE_LIMIT","errorMsg","executables","isCompleted","currentActionNumber","maxActionNumber","type","demand","opt","multimodalPrompt","queryTask","ifTypeRestricted","demandInput","returnType","data","thought","outputResult","prompt","textPrompt","parsePrompt","conversationHistory","userImgItems","firstUserImgIndex","errorPlan","description","timeoutMs","checkIntervalMs","overallStartTime","errorThought","assertTasks","now","sleepPlan","sleepTasks","page","insight"],"mappings":"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"}
|
package/dist/es/common/utils.mjs
CHANGED
|
@@ -187,7 +187,7 @@ function trimContextByViewport(execution) {
|
|
|
187
187
|
}) : execution.tasks
|
|
188
188
|
};
|
|
189
189
|
}
|
|
190
|
-
const getMidsceneVersion = ()=>"0.26.
|
|
190
|
+
const getMidsceneVersion = ()=>"0.26.4";
|
|
191
191
|
const parsePrompt = (prompt)=>{
|
|
192
192
|
if ('string' == typeof prompt) return {
|
|
193
193
|
textPrompt: prompt,
|
|
@@ -100,7 +100,7 @@ class BridgeServer {
|
|
|
100
100
|
(0, shared_utils_namespaceObject.logMsg)('one client connected');
|
|
101
101
|
this.socket = socket;
|
|
102
102
|
const clientVersion = socket.handshake.query.version;
|
|
103
|
-
(0, shared_utils_namespaceObject.logMsg)(`Bridge connected, cli-side version v0.26.
|
|
103
|
+
(0, shared_utils_namespaceObject.logMsg)(`Bridge connected, cli-side version v0.26.4, browser-side version v${clientVersion}`);
|
|
104
104
|
socket.on(external_common_js_namespaceObject.BridgeEvent.CallResponse, (params)=>{
|
|
105
105
|
const id = params.id;
|
|
106
106
|
const response = params.response;
|
|
@@ -128,7 +128,7 @@ class BridgeServer {
|
|
|
128
128
|
var _this_onConnect, _this;
|
|
129
129
|
null == (_this_onConnect = (_this = this).onConnect) || _this_onConnect.call(_this);
|
|
130
130
|
const payload = {
|
|
131
|
-
version: "0.26.
|
|
131
|
+
version: "0.26.4"
|
|
132
132
|
};
|
|
133
133
|
socket.emit(external_common_js_namespaceObject.BridgeEvent.Connected, payload);
|
|
134
134
|
Promise.resolve().then(()=>{
|
|
@@ -82,7 +82,7 @@ class ExtensionBridgePageBrowserSide extends page_js_default() {
|
|
|
82
82
|
}
|
|
83
83
|
}, ()=>this.destroy());
|
|
84
84
|
await this.bridgeClient.connect();
|
|
85
|
-
this.onLogMessage(`Bridge connected, cli-side version v${this.bridgeClient.serverVersion}, browser-side version v0.26.
|
|
85
|
+
this.onLogMessage(`Bridge connected, cli-side version v${this.bridgeClient.serverVersion}, browser-side version v0.26.4`, 'log');
|
|
86
86
|
}
|
|
87
87
|
async connect() {
|
|
88
88
|
return await this.setupBridgeClient();
|
|
@@ -367,7 +367,7 @@ class ChromeExtensionProxyPage {
|
|
|
367
367
|
constructor(forceSameTabNavigation){
|
|
368
368
|
_define_property(this, "pageType", 'chrome-extension-proxy');
|
|
369
369
|
_define_property(this, "forceSameTabNavigation", void 0);
|
|
370
|
-
_define_property(this, "version", "0.26.
|
|
370
|
+
_define_property(this, "version", "0.26.4");
|
|
371
371
|
_define_property(this, "viewportSize", void 0);
|
|
372
372
|
_define_property(this, "activeTabId", null);
|
|
373
373
|
_define_property(this, "tabIdOfDebuggerAttached", null);
|
package/dist/lib/common/tasks.js
CHANGED
|
@@ -676,9 +676,12 @@ class PageTaskExecutor {
|
|
|
676
676
|
];
|
|
677
677
|
const ifTypeRestricted = 'Query' !== type;
|
|
678
678
|
let demandInput = demand;
|
|
679
|
-
if (ifTypeRestricted)
|
|
680
|
-
|
|
681
|
-
|
|
679
|
+
if (ifTypeRestricted) {
|
|
680
|
+
const returnType = 'Assert' === type ? 'Boolean' : type;
|
|
681
|
+
demandInput = {
|
|
682
|
+
result: `${returnType}, ${demand}`
|
|
683
|
+
};
|
|
684
|
+
}
|
|
682
685
|
const { data, usage, thought } = await this.insight.extract(demandInput, opt, multimodalPrompt);
|
|
683
686
|
let outputResult = data;
|
|
684
687
|
if (ifTypeRestricted) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common/tasks.js","sources":["webpack://@midscene/web/webpack/runtime/define_property_getters","webpack://@midscene/web/webpack/runtime/has_own_property","webpack://@midscene/web/webpack/runtime/make_namespace_object","webpack://@midscene/web/./src/common/tasks.ts"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import type { AndroidDevicePage, WebPage } from '@/common/page';\nimport type { PuppeteerWebPage } from '@/puppeteer';\nimport {\n type AIUsageInfo,\n type BaseElement,\n type DeviceAction,\n type DumpSubscriber,\n type ExecutionRecorderItem,\n type ExecutionTaskActionApply,\n type ExecutionTaskApply,\n type ExecutionTaskHitBy,\n type ExecutionTaskInsightLocateApply,\n type ExecutionTaskInsightQueryApply,\n type ExecutionTaskPlanning,\n type ExecutionTaskPlanningApply,\n type ExecutionTaskProgressOptions,\n Executor,\n type ExecutorContext,\n type Insight,\n type InsightAssertionResponse,\n type InsightDump,\n type InsightExtractOption,\n type InsightExtractParam,\n type LocateResultElement,\n type MidsceneYamlFlowItem,\n type PageType,\n type PlanningAIResponse,\n type PlanningAction,\n type PlanningActionParamAssert,\n type PlanningActionParamError,\n type PlanningActionParamSleep,\n type PlanningActionParamWaitFor,\n type TMultimodalPrompt,\n type TUserPrompt,\n type UIContext,\n plan,\n} from '@midscene/core';\nimport {\n type ChatCompletionMessageParam,\n elementByPositionWithElementInfo,\n resizeImageForUiTars,\n vlmPlanning,\n} from '@midscene/core/ai-model';\nimport { sleep } from '@midscene/core/utils';\nimport { NodeType } from '@midscene/shared/constants';\nimport {\n MIDSCENE_REPLANNING_CYCLE_LIMIT,\n getAIConfigInNumber,\n} from '@midscene/shared/env';\nimport { getDebug } from '@midscene/shared/logger';\nimport { assert } from '@midscene/shared/utils';\nimport type { WebElementInfo, WebUIContext } from '../web-element';\nimport type { TaskCache } from './task-cache';\nimport { taskTitleStr } from './ui-utils';\nimport {\n matchElementFromCache,\n matchElementFromPlan,\n parsePrompt,\n} from './utils';\n\ninterface ExecutionResult<OutputType = any> {\n output: OutputType;\n thought?: string;\n executor: Executor;\n}\n\nconst debug = getDebug('device-task-executor');\nconst defaultReplanningCycleLimit = 10;\n\nexport class PageTaskExecutor {\n page: WebPage;\n\n insight: Insight<WebElementInfo, WebUIContext>;\n\n taskCache?: TaskCache;\n\n conversationHistory: ChatCompletionMessageParam[] = [];\n\n onTaskStartCallback?: ExecutionTaskProgressOptions['onTaskStart'];\n\n constructor(\n page: WebPage,\n insight: Insight<WebElementInfo, WebUIContext>,\n opts: {\n taskCache?: TaskCache;\n onTaskStart?: ExecutionTaskProgressOptions['onTaskStart'];\n },\n ) {\n this.page = page;\n this.insight = insight;\n\n this.taskCache = opts.taskCache;\n\n this.onTaskStartCallback = opts?.onTaskStart;\n }\n\n private async recordScreenshot(timing: ExecutionRecorderItem['timing']) {\n const base64 = await this.page.screenshotBase64();\n const item: ExecutionRecorderItem = {\n type: 'screenshot',\n ts: Date.now(),\n screenshot: base64,\n timing,\n };\n return item;\n }\n\n private async getElementXpath(\n pageContext: UIContext<BaseElement>,\n element: LocateResultElement,\n ): Promise<string[] | undefined> {\n let elementId = element?.id;\n if (element?.isOrderSensitive !== undefined) {\n const xpaths = await this.page.getXpathsByPoint(\n {\n left: element.center[0],\n top: element.center[1],\n },\n element?.isOrderSensitive,\n );\n\n return xpaths;\n }\n\n // find the nearest xpath for the element\n if (element?.attributes?.nodeType === NodeType.POSITION) {\n await this.insight.contextRetrieverFn('locate');\n const info = elementByPositionWithElementInfo(\n pageContext.tree,\n {\n x: element.center[0],\n y: element.center[1],\n },\n {\n requireStrictDistance: false,\n filterPositionElements: true,\n },\n );\n if (info?.id) {\n elementId = info.id;\n } else {\n debug(\n 'no element id found for position node, will not update cache',\n element,\n );\n }\n }\n\n if (!elementId) {\n return undefined;\n }\n try {\n const result = await this.page.getXpathsById(elementId);\n return result;\n } catch (error) {\n debug('getXpathsById error: ', error);\n }\n }\n\n private prependExecutorWithScreenshot(\n taskApply: ExecutionTaskApply,\n appendAfterExecution = false,\n ): ExecutionTaskApply {\n const taskWithScreenshot: ExecutionTaskApply = {\n ...taskApply,\n executor: async (param, context, ...args) => {\n const recorder: ExecutionRecorderItem[] = [];\n const { task } = context;\n // set the recorder before executor in case of error\n task.recorder = recorder;\n const shot = await this.recordScreenshot(`before ${task.type}`);\n recorder.push(shot);\n const result = await taskApply.executor(param, context, ...args);\n if (taskApply.type === 'Action') {\n await Promise.all([\n (async () => {\n await sleep(100);\n if ((this.page as PuppeteerWebPage).waitUntilNetworkIdle) {\n try {\n await (this.page as PuppeteerWebPage).waitUntilNetworkIdle();\n } catch (error) {\n // console.error('waitUntilNetworkIdle error', error);\n }\n }\n })(),\n sleep(200),\n ]);\n }\n if (appendAfterExecution) {\n const shot2 = await this.recordScreenshot('after Action');\n recorder.push(shot2);\n }\n return result;\n },\n };\n return taskWithScreenshot;\n }\n\n public async convertPlanToExecutable(\n plans: PlanningAction[],\n opts?: {\n cacheable?: boolean;\n },\n ) {\n const tasks: ExecutionTaskApply[] = [];\n for (const plan of plans) {\n if (plan.type === 'Locate') {\n if (\n plan.locate === null ||\n plan.locate?.id === null ||\n plan.locate?.id === 'null'\n ) {\n // console.warn('Locate action with id is null, will be ignored');\n continue;\n }\n const taskFind: ExecutionTaskInsightLocateApply = {\n type: 'Insight',\n subType: 'Locate',\n param: plan.locate\n ? {\n ...plan.locate,\n cacheable: opts?.cacheable,\n }\n : undefined,\n thought: plan.thought,\n locate: plan.locate,\n executor: async (param, taskContext) => {\n const { task } = taskContext;\n assert(\n param?.prompt || param?.id || param?.bbox,\n 'No prompt or id or position or bbox to locate',\n );\n let insightDump: InsightDump | undefined;\n let usage: AIUsageInfo | undefined;\n const dumpCollector: DumpSubscriber = (dump) => {\n insightDump = dump;\n usage = dump?.taskInfo?.usage;\n\n task.log = {\n dump: insightDump,\n };\n\n task.usage = usage;\n };\n this.insight.onceDumpUpdatedFn = dumpCollector;\n const shotTime = Date.now();\n\n // Get context through contextRetrieverFn which handles frozen context\n const pageContext = await this.insight.contextRetrieverFn('locate');\n task.pageContext = pageContext;\n\n const recordItem: ExecutionRecorderItem = {\n type: 'screenshot',\n ts: shotTime,\n screenshot: pageContext.screenshotBase64,\n timing: 'before Insight',\n };\n task.recorder = [recordItem];\n\n // try matching xpath\n const elementFromXpath = param.xpath\n ? await this.page.getElementInfoByXpath(param.xpath)\n : undefined;\n const userExpectedPathHitFlag = !!elementFromXpath;\n\n // try matching cache\n const cachePrompt = param.prompt;\n const locateCacheRecord =\n this.taskCache?.matchLocateCache(cachePrompt);\n const xpaths = locateCacheRecord?.cacheContent?.xpaths;\n const elementFromCache = userExpectedPathHitFlag\n ? null\n : await matchElementFromCache(\n this,\n xpaths,\n cachePrompt,\n param.cacheable,\n );\n const cacheHitFlag = !!elementFromCache;\n\n // try matching plan\n const elementFromPlan =\n !userExpectedPathHitFlag && !cacheHitFlag\n ? matchElementFromPlan(param, pageContext.tree)\n : undefined;\n const planHitFlag = !!elementFromPlan;\n\n // try ai locate\n const elementFromAiLocate =\n !userExpectedPathHitFlag && !cacheHitFlag && !planHitFlag\n ? (\n await this.insight.locate(param, {\n // fallback to ai locate\n context: pageContext,\n })\n ).element\n : undefined;\n const aiLocateHitFlag = !!elementFromAiLocate;\n\n const element =\n elementFromXpath || // highest priority\n elementFromCache || // second priority\n elementFromPlan || // third priority\n elementFromAiLocate;\n\n // update cache\n let currentXpaths: string[] | undefined;\n if (\n element &&\n this.taskCache &&\n !cacheHitFlag &&\n param?.cacheable !== false\n ) {\n const elementXpaths = await this.getElementXpath(\n pageContext,\n element,\n );\n if (elementXpaths?.length) {\n currentXpaths = elementXpaths;\n this.taskCache.updateOrAppendCacheRecord(\n {\n type: 'locate',\n prompt: cachePrompt,\n xpaths: elementXpaths,\n },\n locateCacheRecord,\n );\n } else {\n debug(\n 'no xpaths found, will not update cache',\n cachePrompt,\n elementXpaths,\n );\n }\n }\n if (!element) {\n throw new Error(`Element not found: ${param.prompt}`);\n }\n\n let hitBy: ExecutionTaskHitBy | undefined;\n\n if (userExpectedPathHitFlag) {\n hitBy = {\n from: 'User expected path',\n context: {\n xpath: param.xpath,\n },\n };\n } else if (cacheHitFlag) {\n hitBy = {\n from: 'Cache',\n context: {\n xpathsFromCache: xpaths,\n xpathsToSave: currentXpaths,\n },\n };\n } else if (planHitFlag) {\n hitBy = {\n from: 'Planning',\n context: {\n id: elementFromPlan?.id,\n bbox: elementFromPlan?.bbox,\n },\n };\n } else if (aiLocateHitFlag) {\n hitBy = {\n from: 'AI model',\n context: {\n prompt: param.prompt,\n },\n };\n }\n\n return {\n output: {\n element,\n },\n pageContext,\n hitBy,\n };\n },\n };\n tasks.push(taskFind);\n } else if (plan.type === 'Assert' || plan.type === 'AssertWithoutThrow') {\n const assertPlan = plan as PlanningAction<PlanningActionParamAssert>;\n const taskAssert: ExecutionTaskApply = {\n type: 'Insight',\n subType: 'Assert',\n param: assertPlan.param,\n thought: assertPlan.thought,\n locate: assertPlan.locate,\n executor: async (param, taskContext) => {\n const { task } = taskContext;\n let insightDump: InsightDump | undefined;\n const dumpCollector: DumpSubscriber = (dump) => {\n insightDump = dump;\n };\n this.insight.onceDumpUpdatedFn = dumpCollector;\n const shotTime = Date.now();\n const pageContext = await this.insight.contextRetrieverFn('assert');\n task.pageContext = pageContext;\n\n const recordItem: ExecutionRecorderItem = {\n type: 'screenshot',\n ts: shotTime,\n screenshot: pageContext.screenshotBase64,\n timing: 'before Insight',\n };\n task.recorder = [recordItem];\n\n const assertion = await this.insight.assert(\n assertPlan.param.assertion,\n );\n\n if (!assertion.pass) {\n if (plan.type === 'Assert') {\n task.output = assertion;\n task.log = {\n dump: insightDump,\n };\n throw new Error(\n assertion.thought || 'Assertion failed without reason',\n );\n }\n\n task.error = new Error(assertion.thought);\n }\n\n return {\n output: assertion,\n pageContext,\n log: {\n dump: insightDump,\n },\n usage: assertion.usage,\n };\n },\n };\n tasks.push(taskAssert);\n } else if (plan.type === 'Error') {\n const taskActionError: ExecutionTaskActionApply<PlanningActionParamError> =\n {\n type: 'Action',\n subType: 'Error',\n param: plan.param,\n thought: plan.thought || plan.param?.thought,\n locate: plan.locate,\n executor: async () => {\n throw new Error(\n plan?.thought || plan.param?.thought || 'error without thought',\n );\n },\n };\n tasks.push(taskActionError);\n } else if (plan.type === 'Finished') {\n const taskActionFinished: ExecutionTaskActionApply<null> = {\n type: 'Action',\n subType: 'Finished',\n param: null,\n thought: plan.thought,\n locate: plan.locate,\n executor: async (param) => {},\n };\n tasks.push(taskActionFinished);\n } else if (plan.type === 'Sleep') {\n const taskActionSleep: ExecutionTaskActionApply<PlanningActionParamSleep> =\n {\n type: 'Action',\n subType: 'Sleep',\n param: plan.param,\n thought: plan.thought,\n locate: plan.locate,\n executor: async (taskParam) => {\n await sleep(taskParam?.timeMs || 3000);\n },\n };\n tasks.push(taskActionSleep);\n } else if (plan.type === 'Drag') {\n const taskActionDrag: ExecutionTaskActionApply<{\n start_box: { x: number; y: number };\n end_box: { x: number; y: number };\n }> = {\n type: 'Action',\n subType: 'Drag',\n param: plan.param,\n thought: plan.thought,\n locate: plan.locate,\n executor: async (taskParam) => {\n assert(\n taskParam?.start_box && taskParam?.end_box,\n 'No start_box or end_box to drag',\n );\n await this.page.mouse.drag(taskParam.start_box, taskParam.end_box);\n },\n };\n tasks.push(taskActionDrag);\n } else {\n const planType = plan.type;\n const task: ExecutionTaskActionApply = {\n type: 'Action',\n subType: planType,\n thought: plan.thought,\n param: plan.param,\n executor: async (param, context) => {\n debug(\n 'executing action',\n planType,\n param,\n `context.element.center: ${context.element?.center}`,\n );\n const actionSpace = await this.page.actionSpace();\n const action = actionSpace.find(\n (action) => action.name === planType,\n );\n if (!action) {\n throw new Error(`Action type '${planType}' not found`);\n }\n const actionFn = action.call.bind(this.page);\n return await actionFn(context, param);\n },\n };\n tasks.push(task);\n }\n }\n\n const wrappedTasks = tasks.map(\n (task: ExecutionTaskApply, index: number) => {\n if (task.type === 'Action') {\n return this.prependExecutorWithScreenshot(\n task,\n index === tasks.length - 1,\n );\n }\n return task;\n },\n );\n\n return {\n tasks: wrappedTasks,\n };\n }\n\n private async setupPlanningContext(executorContext: ExecutorContext) {\n const shotTime = Date.now();\n const pageContext = await this.insight.contextRetrieverFn('locate');\n const recordItem: ExecutionRecorderItem = {\n type: 'screenshot',\n ts: shotTime,\n screenshot: pageContext.screenshotBase64,\n timing: 'before Planning',\n };\n\n executorContext.task.recorder = [recordItem];\n (executorContext.task as ExecutionTaskPlanning).pageContext = pageContext;\n\n return {\n pageContext,\n };\n }\n\n async loadYamlFlowAsPlanning(userInstruction: string, yamlString: string) {\n const taskExecutor = new Executor(taskTitleStr('Action', userInstruction), {\n onTaskStart: this.onTaskStartCallback,\n });\n\n const task: ExecutionTaskPlanningApply = {\n type: 'Planning',\n subType: 'LoadYaml',\n locate: null,\n param: {\n userInstruction,\n },\n executor: async (param, executorContext) => {\n await this.setupPlanningContext(executorContext);\n return {\n output: {\n actions: [],\n more_actions_needed_by_instruction: false,\n log: '',\n yamlString,\n },\n cache: {\n hit: true,\n },\n };\n },\n };\n\n await taskExecutor.append(task);\n await taskExecutor.flush();\n\n return {\n executor: taskExecutor,\n };\n }\n\n private planningTaskFromPrompt(\n userInstruction: string,\n log?: string,\n actionContext?: string,\n ) {\n const task: ExecutionTaskPlanningApply = {\n type: 'Planning',\n subType: 'Plan',\n locate: null,\n param: {\n userInstruction,\n log,\n },\n executor: async (param, executorContext) => {\n const startTime = Date.now();\n const { pageContext } =\n await this.setupPlanningContext(executorContext);\n\n assert(\n this.page.actionSpace,\n 'actionSpace for device is not implemented',\n );\n const actionSpace = await this.page.actionSpace();\n debug(\n 'actionSpace for page is:',\n actionSpace.map((action) => action.name).join(', '),\n );\n assert(Array.isArray(actionSpace), 'actionSpace must be an array');\n if (actionSpace.length === 0) {\n console.warn(\n `ActionSpace for ${this.page.pageType} is empty. This may lead to unexpected behavior.`,\n );\n }\n\n const planResult = await plan(param.userInstruction, {\n context: pageContext,\n log: param.log,\n actionContext,\n pageType: this.page.pageType as PageType,\n actionSpace,\n });\n\n const {\n actions,\n log,\n more_actions_needed_by_instruction,\n error,\n usage,\n rawResponse,\n sleep,\n } = planResult;\n\n executorContext.task.log = {\n ...(executorContext.task.log || {}),\n rawResponse,\n };\n executorContext.task.usage = usage;\n\n let stopCollecting = false;\n let bboxCollected = false;\n let planParsingError = '';\n const finalActions = (actions || []).reduce<PlanningAction[]>(\n (acc, planningAction) => {\n if (stopCollecting) {\n return acc;\n }\n\n if (planningAction.locate) {\n // we only collect bbox once, let qwen re-locate in the following steps\n if (bboxCollected && planningAction.locate.bbox) {\n // biome-ignore lint/performance/noDelete: <explanation>\n delete planningAction.locate.bbox;\n }\n\n if (planningAction.locate.bbox) {\n bboxCollected = true;\n }\n\n acc.push({\n type: 'Locate',\n locate: planningAction.locate,\n param: null,\n // thought is prompt created by ai, always a string\n thought: planningAction.locate.prompt as string,\n });\n } else if (\n ['Tap', 'Hover', 'Input'].includes(planningAction.type)\n ) {\n planParsingError = `invalid planning response: ${JSON.stringify(planningAction)}`;\n // should include locate but get null\n stopCollecting = true;\n return acc;\n }\n acc.push(planningAction);\n return acc;\n },\n [],\n );\n\n if (sleep) {\n const timeNow = Date.now();\n const timeRemaining = sleep - (timeNow - startTime);\n if (timeRemaining > 0) {\n finalActions.push({\n type: 'Sleep',\n param: {\n timeMs: timeRemaining,\n },\n locate: null,\n } as PlanningAction<PlanningActionParamSleep>);\n }\n }\n\n if (finalActions.length === 0) {\n assert(\n !more_actions_needed_by_instruction || sleep,\n error\n ? `Failed to plan: ${error}`\n : planParsingError || 'No plan found',\n );\n }\n\n return {\n output: {\n actions: finalActions,\n more_actions_needed_by_instruction,\n log,\n yamlFlow: planResult.yamlFlow,\n },\n cache: {\n hit: false,\n },\n pageContext,\n };\n },\n };\n\n return task;\n }\n\n private planningTaskToGoal(userInstruction: string) {\n const task: ExecutionTaskPlanningApply = {\n type: 'Planning',\n subType: 'Plan',\n locate: null,\n param: {\n userInstruction,\n },\n executor: async (param, executorContext) => {\n const { pageContext } =\n await this.setupPlanningContext(executorContext);\n\n const imagePayload = await resizeImageForUiTars(\n pageContext.screenshotBase64,\n pageContext.size,\n );\n\n this.appendConversationHistory({\n role: 'user',\n content: [\n {\n type: 'image_url',\n image_url: {\n url: imagePayload,\n },\n },\n ],\n });\n const planResult: {\n actions: PlanningAction<any>[];\n action_summary: string;\n usage?: AIUsageInfo;\n yamlFlow?: MidsceneYamlFlowItem[];\n rawResponse?: string;\n } = await vlmPlanning({\n userInstruction: param.userInstruction,\n conversationHistory: this.conversationHistory,\n size: pageContext.size,\n });\n\n const { actions, action_summary, usage } = planResult;\n executorContext.task.log = {\n ...(executorContext.task.log || {}),\n rawResponse: planResult.rawResponse,\n };\n executorContext.task.usage = usage;\n this.appendConversationHistory({\n role: 'assistant',\n content: action_summary,\n });\n return {\n output: {\n actions,\n thought: actions[0]?.thought,\n actionType: actions[0].type,\n more_actions_needed_by_instruction: true,\n log: '',\n yamlFlow: planResult.yamlFlow,\n },\n cache: {\n hit: false,\n },\n };\n },\n };\n\n return task;\n }\n\n async runPlans(\n title: string,\n plans: PlanningAction[],\n opts?: {\n cacheable?: boolean;\n },\n ): Promise<ExecutionResult> {\n const taskExecutor = new Executor(title, {\n onTaskStart: this.onTaskStartCallback,\n });\n const { tasks } = await this.convertPlanToExecutable(plans, opts);\n await taskExecutor.append(tasks);\n const result = await taskExecutor.flush();\n const { output } = result!;\n return {\n output,\n executor: taskExecutor,\n };\n }\n\n async action(\n userPrompt: string,\n actionContext?: string,\n opts?: {\n cacheable?: boolean;\n },\n ): Promise<\n ExecutionResult<\n | {\n yamlFlow?: MidsceneYamlFlowItem[]; // for cache use\n }\n | undefined\n >\n > {\n const taskExecutor = new Executor(taskTitleStr('Action', userPrompt), {\n onTaskStart: this.onTaskStartCallback,\n });\n\n let planningTask: ExecutionTaskPlanningApply | null =\n this.planningTaskFromPrompt(userPrompt, undefined, actionContext);\n let replanCount = 0;\n const logList: string[] = [];\n\n const yamlFlow: MidsceneYamlFlowItem[] = [];\n const replanningCycleLimit =\n getAIConfigInNumber(MIDSCENE_REPLANNING_CYCLE_LIMIT) ||\n defaultReplanningCycleLimit;\n while (planningTask) {\n if (replanCount > replanningCycleLimit) {\n const errorMsg =\n 'Replanning too many times, please split the task into multiple steps';\n\n return this.appendErrorPlan(taskExecutor, errorMsg);\n }\n\n // plan\n await taskExecutor.append(planningTask);\n const result = await taskExecutor.flush();\n const planResult: PlanningAIResponse = result?.output;\n if (taskExecutor.isInErrorState()) {\n return {\n output: planResult,\n executor: taskExecutor,\n };\n }\n\n const plans = planResult.actions || [];\n yamlFlow.push(...(planResult.yamlFlow || []));\n\n let executables: Awaited<ReturnType<typeof this.convertPlanToExecutable>>;\n try {\n executables = await this.convertPlanToExecutable(plans, opts);\n taskExecutor.append(executables.tasks);\n } catch (error) {\n return this.appendErrorPlan(\n taskExecutor,\n `Error converting plans to executable tasks: ${error}, plans: ${JSON.stringify(\n plans,\n )}`,\n );\n }\n\n await taskExecutor.flush();\n if (taskExecutor.isInErrorState()) {\n return {\n output: undefined,\n executor: taskExecutor,\n };\n }\n if (planResult?.log) {\n logList.push(planResult.log);\n }\n\n if (!planResult.more_actions_needed_by_instruction) {\n planningTask = null;\n break;\n }\n planningTask = this.planningTaskFromPrompt(\n userPrompt,\n logList.length > 0 ? `- ${logList.join('\\n- ')}` : undefined,\n actionContext,\n );\n replanCount++;\n }\n\n return {\n output: {\n yamlFlow,\n },\n executor: taskExecutor,\n };\n }\n\n async actionToGoal(\n userPrompt: string,\n opts?: {\n cacheable?: boolean;\n },\n ): Promise<\n ExecutionResult<\n | {\n yamlFlow?: MidsceneYamlFlowItem[]; // for cache use\n }\n | undefined\n >\n > {\n const taskExecutor = new Executor(taskTitleStr('Action', userPrompt), {\n onTaskStart: this.onTaskStartCallback,\n });\n this.conversationHistory = [];\n const isCompleted = false;\n let currentActionNumber = 0;\n const maxActionNumber = 40;\n\n const yamlFlow: MidsceneYamlFlowItem[] = [];\n while (!isCompleted && currentActionNumber < maxActionNumber) {\n currentActionNumber++;\n const planningTask: ExecutionTaskPlanningApply =\n this.planningTaskToGoal(userPrompt);\n await taskExecutor.append(planningTask);\n const result = await taskExecutor.flush();\n if (taskExecutor.isInErrorState()) {\n return {\n output: undefined,\n executor: taskExecutor,\n };\n }\n if (!result) {\n throw new Error(\n 'result of taskExecutor.flush() is undefined in function actionToGoal',\n );\n }\n const { output } = result;\n const plans = output.actions;\n yamlFlow.push(...(output.yamlFlow || []));\n let executables: Awaited<ReturnType<typeof this.convertPlanToExecutable>>;\n try {\n executables = await this.convertPlanToExecutable(plans, opts);\n taskExecutor.append(executables.tasks);\n } catch (error) {\n return this.appendErrorPlan(\n taskExecutor,\n `Error converting plans to executable tasks: ${error}, plans: ${JSON.stringify(\n plans,\n )}`,\n );\n }\n\n await taskExecutor.flush();\n\n if (taskExecutor.isInErrorState()) {\n return {\n output: undefined,\n executor: taskExecutor,\n };\n }\n\n if (plans[0].type === 'Finished') {\n break;\n }\n }\n return {\n output: {\n yamlFlow,\n },\n executor: taskExecutor,\n };\n }\n\n private async createTypeQueryTask<T>(\n type: 'Query' | 'Boolean' | 'Number' | 'String' | 'Assert',\n demand: InsightExtractParam,\n opt?: InsightExtractOption,\n multimodalPrompt?: TMultimodalPrompt,\n ): Promise<ExecutionResult<T>> {\n const taskExecutor = new Executor(\n taskTitleStr(\n type,\n typeof demand === 'string' ? demand : JSON.stringify(demand),\n ),\n {\n onTaskStart: this.onTaskStartCallback,\n },\n );\n\n const queryTask: ExecutionTaskInsightQueryApply = {\n type: 'Insight',\n subType: type,\n locate: null,\n param: {\n // TODO: display image thumbnail in report\n dataDemand: multimodalPrompt\n ? ({\n demand,\n multimodalPrompt,\n } as never)\n : demand, // for user param presentation in report right sidebar\n },\n executor: async (param, taskContext) => {\n const { task } = taskContext;\n let insightDump: InsightDump | undefined;\n const dumpCollector: DumpSubscriber = (dump) => {\n insightDump = dump;\n };\n this.insight.onceDumpUpdatedFn = dumpCollector;\n\n // Get page context for query operations\n const shotTime = Date.now();\n const pageContext = await this.insight.contextRetrieverFn('extract');\n task.pageContext = pageContext;\n\n const recordItem: ExecutionRecorderItem = {\n type: 'screenshot',\n ts: shotTime,\n screenshot: pageContext.screenshotBase64,\n timing: 'before Extract',\n };\n task.recorder = [recordItem];\n\n const ifTypeRestricted = type !== 'Query';\n let demandInput = demand;\n if (ifTypeRestricted) {\n demandInput = {\n result: `${type}, ${demand}`,\n };\n }\n\n const { data, usage, thought } = await this.insight.extract<any>(\n demandInput,\n opt,\n multimodalPrompt,\n );\n\n let outputResult = data;\n if (ifTypeRestricted) {\n assert(data?.result !== undefined, 'No result in query data');\n outputResult = (data as any).result;\n }\n\n return {\n output: outputResult,\n log: { dump: insightDump },\n usage,\n thought,\n };\n },\n };\n\n await taskExecutor.append(this.prependExecutorWithScreenshot(queryTask));\n const result = await taskExecutor.flush();\n\n if (!result) {\n throw new Error(\n 'result of taskExecutor.flush() is undefined in function createTypeQueryTask',\n );\n }\n\n const { output, thought } = result;\n\n return {\n output,\n thought,\n executor: taskExecutor,\n };\n }\n\n async query(\n demand: InsightExtractParam,\n opt?: InsightExtractOption,\n ): Promise<ExecutionResult> {\n return this.createTypeQueryTask('Query', demand, opt);\n }\n\n async boolean(\n prompt: TUserPrompt,\n opt?: InsightExtractOption,\n ): Promise<ExecutionResult<boolean>> {\n const { textPrompt, multimodalPrompt } = parsePrompt(prompt);\n return this.createTypeQueryTask<boolean>(\n 'Boolean',\n textPrompt,\n opt,\n multimodalPrompt,\n );\n }\n\n async number(\n prompt: TUserPrompt,\n opt?: InsightExtractOption,\n ): Promise<ExecutionResult<number>> {\n const { textPrompt, multimodalPrompt } = parsePrompt(prompt);\n return this.createTypeQueryTask<number>(\n 'Number',\n textPrompt,\n opt,\n multimodalPrompt,\n );\n }\n\n async string(\n prompt: TUserPrompt,\n opt?: InsightExtractOption,\n ): Promise<ExecutionResult<string>> {\n const { textPrompt, multimodalPrompt } = parsePrompt(prompt);\n return this.createTypeQueryTask<string>(\n 'String',\n textPrompt,\n opt,\n multimodalPrompt,\n );\n }\n\n async assert(\n assertion: TUserPrompt,\n opt?: InsightExtractOption,\n ): Promise<ExecutionResult<boolean>> {\n const { textPrompt, multimodalPrompt } = parsePrompt(assertion);\n return await this.createTypeQueryTask<boolean>(\n 'Assert',\n textPrompt,\n opt,\n multimodalPrompt,\n );\n }\n\n /**\n * Append a message to the conversation history\n * For user messages with images:\n * - Keep max 4 user image messages in history\n * - Remove oldest user image message when limit reached\n * For assistant messages:\n * - Simply append to history\n * @param conversationHistory Message to append\n */\n private appendConversationHistory(\n conversationHistory: ChatCompletionMessageParam,\n ) {\n if (conversationHistory.role === 'user') {\n // Get all existing user messages with images\n const userImgItems = this.conversationHistory.filter(\n (item) => item.role === 'user',\n );\n\n // If we already have 4 user image messages\n if (userImgItems.length >= 4 && conversationHistory.role === 'user') {\n // Remove first user image message when we already have 4, before adding new one\n const firstUserImgIndex = this.conversationHistory.findIndex(\n (item) => item.role === 'user',\n );\n if (firstUserImgIndex >= 0) {\n this.conversationHistory.splice(firstUserImgIndex, 1);\n }\n }\n }\n // For non-user messages, simply append to history\n this.conversationHistory.push(conversationHistory);\n }\n\n private async appendErrorPlan(taskExecutor: Executor, errorMsg: string) {\n const errorPlan: PlanningAction<PlanningActionParamError> = {\n type: 'Error',\n param: {\n thought: errorMsg,\n },\n locate: null,\n };\n const { tasks } = await this.convertPlanToExecutable([errorPlan]);\n await taskExecutor.append(this.prependExecutorWithScreenshot(tasks[0]));\n await taskExecutor.flush();\n\n return {\n output: undefined,\n executor: taskExecutor,\n };\n }\n\n async waitFor(\n assertion: string,\n opt: PlanningActionParamWaitFor,\n ): Promise<ExecutionResult<void>> {\n const description = `waitFor: ${assertion}`;\n const taskExecutor = new Executor(taskTitleStr('WaitFor', description), {\n onTaskStart: this.onTaskStartCallback,\n });\n const { timeoutMs, checkIntervalMs } = opt;\n\n assert(assertion, 'No assertion for waitFor');\n assert(timeoutMs, 'No timeoutMs for waitFor');\n assert(checkIntervalMs, 'No checkIntervalMs for waitFor');\n\n const overallStartTime = Date.now();\n let startTime = Date.now();\n let errorThought = '';\n while (Date.now() - overallStartTime < timeoutMs) {\n startTime = Date.now();\n const assertPlan: PlanningAction<PlanningActionParamAssert> = {\n type: 'AssertWithoutThrow',\n param: {\n assertion,\n },\n locate: null,\n };\n const { tasks: assertTasks } = await this.convertPlanToExecutable([\n assertPlan,\n ]);\n await taskExecutor.append(\n this.prependExecutorWithScreenshot(assertTasks[0]),\n );\n const result = await taskExecutor.flush();\n\n if (!result) {\n throw new Error(\n 'result of taskExecutor.flush() is undefined in function waitFor',\n );\n }\n\n const { output } = result as { output: InsightAssertionResponse };\n\n if (output?.pass) {\n return {\n output: undefined,\n executor: taskExecutor,\n };\n }\n\n errorThought =\n output?.thought ||\n `unknown error when waiting for assertion: ${assertion}`;\n const now = Date.now();\n if (now - startTime < checkIntervalMs) {\n const timeRemaining = checkIntervalMs - (now - startTime);\n const sleepPlan: PlanningAction<PlanningActionParamSleep> = {\n type: 'Sleep',\n param: {\n timeMs: timeRemaining,\n },\n locate: null,\n };\n const { tasks: sleepTasks } = await this.convertPlanToExecutable([\n sleepPlan,\n ]);\n await taskExecutor.append(\n this.prependExecutorWithScreenshot(sleepTasks[0]),\n );\n await taskExecutor.flush();\n }\n }\n\n return this.appendErrorPlan(\n taskExecutor,\n `waitFor timeout: ${errorThought}`,\n );\n }\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","debug","getDebug","defaultReplanningCycleLimit","PageTaskExecutor","timing","base64","item","Date","pageContext","element","_element_attributes","elementId","undefined","xpaths","NodeType","info","elementByPositionWithElementInfo","result","error","taskApply","appendAfterExecution","taskWithScreenshot","param","context","args","recorder","task","shot","Promise","sleep","shot2","plans","opts","tasks","plan","_plan_locate","_plan_locate1","taskFind","taskContext","_this_taskCache","_locateCacheRecord_cacheContent","assert","insightDump","usage","dumpCollector","dump","_dump_taskInfo","shotTime","recordItem","elementFromXpath","userExpectedPathHitFlag","cachePrompt","locateCacheRecord","elementFromCache","matchElementFromCache","cacheHitFlag","elementFromPlan","matchElementFromPlan","planHitFlag","elementFromAiLocate","aiLocateHitFlag","currentXpaths","elementXpaths","Error","hitBy","assertPlan","taskAssert","assertion","_plan_param","taskActionError","taskActionFinished","taskActionSleep","taskParam","taskActionDrag","planType","_context_element","actionSpace","action","actionFn","wrappedTasks","index","executorContext","userInstruction","yamlString","taskExecutor","Executor","taskTitleStr","log","actionContext","startTime","Array","console","planResult","actions","more_actions_needed_by_instruction","rawResponse","stopCollecting","bboxCollected","planParsingError","finalActions","acc","planningAction","JSON","timeNow","timeRemaining","_actions_","imagePayload","resizeImageForUiTars","vlmPlanning","action_summary","title","output","userPrompt","planningTask","replanCount","logList","yamlFlow","replanningCycleLimit","getAIConfigInNumber","MIDSCENE_REPLANNING_CYCLE_LIMIT","errorMsg","executables","isCompleted","currentActionNumber","maxActionNumber","type","demand","opt","multimodalPrompt","queryTask","ifTypeRestricted","demandInput","data","thought","outputResult","prompt","textPrompt","parsePrompt","conversationHistory","userImgItems","firstUserImgIndex","errorPlan","description","timeoutMs","checkIntervalMs","overallStartTime","errorThought","assertTasks","now","sleepPlan","sleepTasks","page","insight"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"common/tasks.js","sources":["webpack://@midscene/web/webpack/runtime/define_property_getters","webpack://@midscene/web/webpack/runtime/has_own_property","webpack://@midscene/web/webpack/runtime/make_namespace_object","webpack://@midscene/web/./src/common/tasks.ts"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import type { AndroidDevicePage, WebPage } from '@/common/page';\nimport type { PuppeteerWebPage } from '@/puppeteer';\nimport {\n type AIUsageInfo,\n type BaseElement,\n type DeviceAction,\n type DumpSubscriber,\n type ExecutionRecorderItem,\n type ExecutionTaskActionApply,\n type ExecutionTaskApply,\n type ExecutionTaskHitBy,\n type ExecutionTaskInsightLocateApply,\n type ExecutionTaskInsightQueryApply,\n type ExecutionTaskPlanning,\n type ExecutionTaskPlanningApply,\n type ExecutionTaskProgressOptions,\n Executor,\n type ExecutorContext,\n type Insight,\n type InsightAssertionResponse,\n type InsightDump,\n type InsightExtractOption,\n type InsightExtractParam,\n type LocateResultElement,\n type MidsceneYamlFlowItem,\n type PageType,\n type PlanningAIResponse,\n type PlanningAction,\n type PlanningActionParamAssert,\n type PlanningActionParamError,\n type PlanningActionParamSleep,\n type PlanningActionParamWaitFor,\n type TMultimodalPrompt,\n type TUserPrompt,\n type UIContext,\n plan,\n} from '@midscene/core';\nimport {\n type ChatCompletionMessageParam,\n elementByPositionWithElementInfo,\n resizeImageForUiTars,\n vlmPlanning,\n} from '@midscene/core/ai-model';\nimport { sleep } from '@midscene/core/utils';\nimport { NodeType } from '@midscene/shared/constants';\nimport {\n MIDSCENE_REPLANNING_CYCLE_LIMIT,\n getAIConfigInNumber,\n} from '@midscene/shared/env';\nimport { getDebug } from '@midscene/shared/logger';\nimport { assert } from '@midscene/shared/utils';\nimport type { WebElementInfo, WebUIContext } from '../web-element';\nimport type { TaskCache } from './task-cache';\nimport { taskTitleStr } from './ui-utils';\nimport {\n matchElementFromCache,\n matchElementFromPlan,\n parsePrompt,\n} from './utils';\n\ninterface ExecutionResult<OutputType = any> {\n output: OutputType;\n thought?: string;\n executor: Executor;\n}\n\nconst debug = getDebug('device-task-executor');\nconst defaultReplanningCycleLimit = 10;\n\nexport class PageTaskExecutor {\n page: WebPage;\n\n insight: Insight<WebElementInfo, WebUIContext>;\n\n taskCache?: TaskCache;\n\n conversationHistory: ChatCompletionMessageParam[] = [];\n\n onTaskStartCallback?: ExecutionTaskProgressOptions['onTaskStart'];\n\n constructor(\n page: WebPage,\n insight: Insight<WebElementInfo, WebUIContext>,\n opts: {\n taskCache?: TaskCache;\n onTaskStart?: ExecutionTaskProgressOptions['onTaskStart'];\n },\n ) {\n this.page = page;\n this.insight = insight;\n\n this.taskCache = opts.taskCache;\n\n this.onTaskStartCallback = opts?.onTaskStart;\n }\n\n private async recordScreenshot(timing: ExecutionRecorderItem['timing']) {\n const base64 = await this.page.screenshotBase64();\n const item: ExecutionRecorderItem = {\n type: 'screenshot',\n ts: Date.now(),\n screenshot: base64,\n timing,\n };\n return item;\n }\n\n private async getElementXpath(\n pageContext: UIContext<BaseElement>,\n element: LocateResultElement,\n ): Promise<string[] | undefined> {\n let elementId = element?.id;\n if (element?.isOrderSensitive !== undefined) {\n const xpaths = await this.page.getXpathsByPoint(\n {\n left: element.center[0],\n top: element.center[1],\n },\n element?.isOrderSensitive,\n );\n\n return xpaths;\n }\n\n // find the nearest xpath for the element\n if (element?.attributes?.nodeType === NodeType.POSITION) {\n await this.insight.contextRetrieverFn('locate');\n const info = elementByPositionWithElementInfo(\n pageContext.tree,\n {\n x: element.center[0],\n y: element.center[1],\n },\n {\n requireStrictDistance: false,\n filterPositionElements: true,\n },\n );\n if (info?.id) {\n elementId = info.id;\n } else {\n debug(\n 'no element id found for position node, will not update cache',\n element,\n );\n }\n }\n\n if (!elementId) {\n return undefined;\n }\n try {\n const result = await this.page.getXpathsById(elementId);\n return result;\n } catch (error) {\n debug('getXpathsById error: ', error);\n }\n }\n\n private prependExecutorWithScreenshot(\n taskApply: ExecutionTaskApply,\n appendAfterExecution = false,\n ): ExecutionTaskApply {\n const taskWithScreenshot: ExecutionTaskApply = {\n ...taskApply,\n executor: async (param, context, ...args) => {\n const recorder: ExecutionRecorderItem[] = [];\n const { task } = context;\n // set the recorder before executor in case of error\n task.recorder = recorder;\n const shot = await this.recordScreenshot(`before ${task.type}`);\n recorder.push(shot);\n const result = await taskApply.executor(param, context, ...args);\n if (taskApply.type === 'Action') {\n await Promise.all([\n (async () => {\n await sleep(100);\n if ((this.page as PuppeteerWebPage).waitUntilNetworkIdle) {\n try {\n await (this.page as PuppeteerWebPage).waitUntilNetworkIdle();\n } catch (error) {\n // console.error('waitUntilNetworkIdle error', error);\n }\n }\n })(),\n sleep(200),\n ]);\n }\n if (appendAfterExecution) {\n const shot2 = await this.recordScreenshot('after Action');\n recorder.push(shot2);\n }\n return result;\n },\n };\n return taskWithScreenshot;\n }\n\n public async convertPlanToExecutable(\n plans: PlanningAction[],\n opts?: {\n cacheable?: boolean;\n },\n ) {\n const tasks: ExecutionTaskApply[] = [];\n for (const plan of plans) {\n if (plan.type === 'Locate') {\n if (\n plan.locate === null ||\n plan.locate?.id === null ||\n plan.locate?.id === 'null'\n ) {\n // console.warn('Locate action with id is null, will be ignored');\n continue;\n }\n const taskFind: ExecutionTaskInsightLocateApply = {\n type: 'Insight',\n subType: 'Locate',\n param: plan.locate\n ? {\n ...plan.locate,\n cacheable: opts?.cacheable,\n }\n : undefined,\n thought: plan.thought,\n locate: plan.locate,\n executor: async (param, taskContext) => {\n const { task } = taskContext;\n assert(\n param?.prompt || param?.id || param?.bbox,\n 'No prompt or id or position or bbox to locate',\n );\n let insightDump: InsightDump | undefined;\n let usage: AIUsageInfo | undefined;\n const dumpCollector: DumpSubscriber = (dump) => {\n insightDump = dump;\n usage = dump?.taskInfo?.usage;\n\n task.log = {\n dump: insightDump,\n };\n\n task.usage = usage;\n };\n this.insight.onceDumpUpdatedFn = dumpCollector;\n const shotTime = Date.now();\n\n // Get context through contextRetrieverFn which handles frozen context\n const pageContext = await this.insight.contextRetrieverFn('locate');\n task.pageContext = pageContext;\n\n const recordItem: ExecutionRecorderItem = {\n type: 'screenshot',\n ts: shotTime,\n screenshot: pageContext.screenshotBase64,\n timing: 'before Insight',\n };\n task.recorder = [recordItem];\n\n // try matching xpath\n const elementFromXpath = param.xpath\n ? await this.page.getElementInfoByXpath(param.xpath)\n : undefined;\n const userExpectedPathHitFlag = !!elementFromXpath;\n\n // try matching cache\n const cachePrompt = param.prompt;\n const locateCacheRecord =\n this.taskCache?.matchLocateCache(cachePrompt);\n const xpaths = locateCacheRecord?.cacheContent?.xpaths;\n const elementFromCache = userExpectedPathHitFlag\n ? null\n : await matchElementFromCache(\n this,\n xpaths,\n cachePrompt,\n param.cacheable,\n );\n const cacheHitFlag = !!elementFromCache;\n\n // try matching plan\n const elementFromPlan =\n !userExpectedPathHitFlag && !cacheHitFlag\n ? matchElementFromPlan(param, pageContext.tree)\n : undefined;\n const planHitFlag = !!elementFromPlan;\n\n // try ai locate\n const elementFromAiLocate =\n !userExpectedPathHitFlag && !cacheHitFlag && !planHitFlag\n ? (\n await this.insight.locate(param, {\n // fallback to ai locate\n context: pageContext,\n })\n ).element\n : undefined;\n const aiLocateHitFlag = !!elementFromAiLocate;\n\n const element =\n elementFromXpath || // highest priority\n elementFromCache || // second priority\n elementFromPlan || // third priority\n elementFromAiLocate;\n\n // update cache\n let currentXpaths: string[] | undefined;\n if (\n element &&\n this.taskCache &&\n !cacheHitFlag &&\n param?.cacheable !== false\n ) {\n const elementXpaths = await this.getElementXpath(\n pageContext,\n element,\n );\n if (elementXpaths?.length) {\n currentXpaths = elementXpaths;\n this.taskCache.updateOrAppendCacheRecord(\n {\n type: 'locate',\n prompt: cachePrompt,\n xpaths: elementXpaths,\n },\n locateCacheRecord,\n );\n } else {\n debug(\n 'no xpaths found, will not update cache',\n cachePrompt,\n elementXpaths,\n );\n }\n }\n if (!element) {\n throw new Error(`Element not found: ${param.prompt}`);\n }\n\n let hitBy: ExecutionTaskHitBy | undefined;\n\n if (userExpectedPathHitFlag) {\n hitBy = {\n from: 'User expected path',\n context: {\n xpath: param.xpath,\n },\n };\n } else if (cacheHitFlag) {\n hitBy = {\n from: 'Cache',\n context: {\n xpathsFromCache: xpaths,\n xpathsToSave: currentXpaths,\n },\n };\n } else if (planHitFlag) {\n hitBy = {\n from: 'Planning',\n context: {\n id: elementFromPlan?.id,\n bbox: elementFromPlan?.bbox,\n },\n };\n } else if (aiLocateHitFlag) {\n hitBy = {\n from: 'AI model',\n context: {\n prompt: param.prompt,\n },\n };\n }\n\n return {\n output: {\n element,\n },\n pageContext,\n hitBy,\n };\n },\n };\n tasks.push(taskFind);\n } else if (plan.type === 'Assert' || plan.type === 'AssertWithoutThrow') {\n const assertPlan = plan as PlanningAction<PlanningActionParamAssert>;\n const taskAssert: ExecutionTaskApply = {\n type: 'Insight',\n subType: 'Assert',\n param: assertPlan.param,\n thought: assertPlan.thought,\n locate: assertPlan.locate,\n executor: async (param, taskContext) => {\n const { task } = taskContext;\n let insightDump: InsightDump | undefined;\n const dumpCollector: DumpSubscriber = (dump) => {\n insightDump = dump;\n };\n this.insight.onceDumpUpdatedFn = dumpCollector;\n const shotTime = Date.now();\n const pageContext = await this.insight.contextRetrieverFn('assert');\n task.pageContext = pageContext;\n\n const recordItem: ExecutionRecorderItem = {\n type: 'screenshot',\n ts: shotTime,\n screenshot: pageContext.screenshotBase64,\n timing: 'before Insight',\n };\n task.recorder = [recordItem];\n\n const assertion = await this.insight.assert(\n assertPlan.param.assertion,\n );\n\n if (!assertion.pass) {\n if (plan.type === 'Assert') {\n task.output = assertion;\n task.log = {\n dump: insightDump,\n };\n throw new Error(\n assertion.thought || 'Assertion failed without reason',\n );\n }\n\n task.error = new Error(assertion.thought);\n }\n\n return {\n output: assertion,\n pageContext,\n log: {\n dump: insightDump,\n },\n usage: assertion.usage,\n };\n },\n };\n tasks.push(taskAssert);\n } else if (plan.type === 'Error') {\n const taskActionError: ExecutionTaskActionApply<PlanningActionParamError> =\n {\n type: 'Action',\n subType: 'Error',\n param: plan.param,\n thought: plan.thought || plan.param?.thought,\n locate: plan.locate,\n executor: async () => {\n throw new Error(\n plan?.thought || plan.param?.thought || 'error without thought',\n );\n },\n };\n tasks.push(taskActionError);\n } else if (plan.type === 'Finished') {\n const taskActionFinished: ExecutionTaskActionApply<null> = {\n type: 'Action',\n subType: 'Finished',\n param: null,\n thought: plan.thought,\n locate: plan.locate,\n executor: async (param) => {},\n };\n tasks.push(taskActionFinished);\n } else if (plan.type === 'Sleep') {\n const taskActionSleep: ExecutionTaskActionApply<PlanningActionParamSleep> =\n {\n type: 'Action',\n subType: 'Sleep',\n param: plan.param,\n thought: plan.thought,\n locate: plan.locate,\n executor: async (taskParam) => {\n await sleep(taskParam?.timeMs || 3000);\n },\n };\n tasks.push(taskActionSleep);\n } else if (plan.type === 'Drag') {\n const taskActionDrag: ExecutionTaskActionApply<{\n start_box: { x: number; y: number };\n end_box: { x: number; y: number };\n }> = {\n type: 'Action',\n subType: 'Drag',\n param: plan.param,\n thought: plan.thought,\n locate: plan.locate,\n executor: async (taskParam) => {\n assert(\n taskParam?.start_box && taskParam?.end_box,\n 'No start_box or end_box to drag',\n );\n await this.page.mouse.drag(taskParam.start_box, taskParam.end_box);\n },\n };\n tasks.push(taskActionDrag);\n } else {\n const planType = plan.type;\n const task: ExecutionTaskActionApply = {\n type: 'Action',\n subType: planType,\n thought: plan.thought,\n param: plan.param,\n executor: async (param, context) => {\n debug(\n 'executing action',\n planType,\n param,\n `context.element.center: ${context.element?.center}`,\n );\n const actionSpace = await this.page.actionSpace();\n const action = actionSpace.find(\n (action) => action.name === planType,\n );\n if (!action) {\n throw new Error(`Action type '${planType}' not found`);\n }\n const actionFn = action.call.bind(this.page);\n return await actionFn(context, param);\n },\n };\n tasks.push(task);\n }\n }\n\n const wrappedTasks = tasks.map(\n (task: ExecutionTaskApply, index: number) => {\n if (task.type === 'Action') {\n return this.prependExecutorWithScreenshot(\n task,\n index === tasks.length - 1,\n );\n }\n return task;\n },\n );\n\n return {\n tasks: wrappedTasks,\n };\n }\n\n private async setupPlanningContext(executorContext: ExecutorContext) {\n const shotTime = Date.now();\n const pageContext = await this.insight.contextRetrieverFn('locate');\n const recordItem: ExecutionRecorderItem = {\n type: 'screenshot',\n ts: shotTime,\n screenshot: pageContext.screenshotBase64,\n timing: 'before Planning',\n };\n\n executorContext.task.recorder = [recordItem];\n (executorContext.task as ExecutionTaskPlanning).pageContext = pageContext;\n\n return {\n pageContext,\n };\n }\n\n async loadYamlFlowAsPlanning(userInstruction: string, yamlString: string) {\n const taskExecutor = new Executor(taskTitleStr('Action', userInstruction), {\n onTaskStart: this.onTaskStartCallback,\n });\n\n const task: ExecutionTaskPlanningApply = {\n type: 'Planning',\n subType: 'LoadYaml',\n locate: null,\n param: {\n userInstruction,\n },\n executor: async (param, executorContext) => {\n await this.setupPlanningContext(executorContext);\n return {\n output: {\n actions: [],\n more_actions_needed_by_instruction: false,\n log: '',\n yamlString,\n },\n cache: {\n hit: true,\n },\n };\n },\n };\n\n await taskExecutor.append(task);\n await taskExecutor.flush();\n\n return {\n executor: taskExecutor,\n };\n }\n\n private planningTaskFromPrompt(\n userInstruction: string,\n log?: string,\n actionContext?: string,\n ) {\n const task: ExecutionTaskPlanningApply = {\n type: 'Planning',\n subType: 'Plan',\n locate: null,\n param: {\n userInstruction,\n log,\n },\n executor: async (param, executorContext) => {\n const startTime = Date.now();\n const { pageContext } =\n await this.setupPlanningContext(executorContext);\n\n assert(\n this.page.actionSpace,\n 'actionSpace for device is not implemented',\n );\n const actionSpace = await this.page.actionSpace();\n debug(\n 'actionSpace for page is:',\n actionSpace.map((action) => action.name).join(', '),\n );\n assert(Array.isArray(actionSpace), 'actionSpace must be an array');\n if (actionSpace.length === 0) {\n console.warn(\n `ActionSpace for ${this.page.pageType} is empty. This may lead to unexpected behavior.`,\n );\n }\n\n const planResult = await plan(param.userInstruction, {\n context: pageContext,\n log: param.log,\n actionContext,\n pageType: this.page.pageType as PageType,\n actionSpace,\n });\n\n const {\n actions,\n log,\n more_actions_needed_by_instruction,\n error,\n usage,\n rawResponse,\n sleep,\n } = planResult;\n\n executorContext.task.log = {\n ...(executorContext.task.log || {}),\n rawResponse,\n };\n executorContext.task.usage = usage;\n\n let stopCollecting = false;\n let bboxCollected = false;\n let planParsingError = '';\n const finalActions = (actions || []).reduce<PlanningAction[]>(\n (acc, planningAction) => {\n if (stopCollecting) {\n return acc;\n }\n\n if (planningAction.locate) {\n // we only collect bbox once, let qwen re-locate in the following steps\n if (bboxCollected && planningAction.locate.bbox) {\n // biome-ignore lint/performance/noDelete: <explanation>\n delete planningAction.locate.bbox;\n }\n\n if (planningAction.locate.bbox) {\n bboxCollected = true;\n }\n\n acc.push({\n type: 'Locate',\n locate: planningAction.locate,\n param: null,\n // thought is prompt created by ai, always a string\n thought: planningAction.locate.prompt as string,\n });\n } else if (\n ['Tap', 'Hover', 'Input'].includes(planningAction.type)\n ) {\n planParsingError = `invalid planning response: ${JSON.stringify(planningAction)}`;\n // should include locate but get null\n stopCollecting = true;\n return acc;\n }\n acc.push(planningAction);\n return acc;\n },\n [],\n );\n\n if (sleep) {\n const timeNow = Date.now();\n const timeRemaining = sleep - (timeNow - startTime);\n if (timeRemaining > 0) {\n finalActions.push({\n type: 'Sleep',\n param: {\n timeMs: timeRemaining,\n },\n locate: null,\n } as PlanningAction<PlanningActionParamSleep>);\n }\n }\n\n if (finalActions.length === 0) {\n assert(\n !more_actions_needed_by_instruction || sleep,\n error\n ? `Failed to plan: ${error}`\n : planParsingError || 'No plan found',\n );\n }\n\n return {\n output: {\n actions: finalActions,\n more_actions_needed_by_instruction,\n log,\n yamlFlow: planResult.yamlFlow,\n },\n cache: {\n hit: false,\n },\n pageContext,\n };\n },\n };\n\n return task;\n }\n\n private planningTaskToGoal(userInstruction: string) {\n const task: ExecutionTaskPlanningApply = {\n type: 'Planning',\n subType: 'Plan',\n locate: null,\n param: {\n userInstruction,\n },\n executor: async (param, executorContext) => {\n const { pageContext } =\n await this.setupPlanningContext(executorContext);\n\n const imagePayload = await resizeImageForUiTars(\n pageContext.screenshotBase64,\n pageContext.size,\n );\n\n this.appendConversationHistory({\n role: 'user',\n content: [\n {\n type: 'image_url',\n image_url: {\n url: imagePayload,\n },\n },\n ],\n });\n const planResult: {\n actions: PlanningAction<any>[];\n action_summary: string;\n usage?: AIUsageInfo;\n yamlFlow?: MidsceneYamlFlowItem[];\n rawResponse?: string;\n } = await vlmPlanning({\n userInstruction: param.userInstruction,\n conversationHistory: this.conversationHistory,\n size: pageContext.size,\n });\n\n const { actions, action_summary, usage } = planResult;\n executorContext.task.log = {\n ...(executorContext.task.log || {}),\n rawResponse: planResult.rawResponse,\n };\n executorContext.task.usage = usage;\n this.appendConversationHistory({\n role: 'assistant',\n content: action_summary,\n });\n return {\n output: {\n actions,\n thought: actions[0]?.thought,\n actionType: actions[0].type,\n more_actions_needed_by_instruction: true,\n log: '',\n yamlFlow: planResult.yamlFlow,\n },\n cache: {\n hit: false,\n },\n };\n },\n };\n\n return task;\n }\n\n async runPlans(\n title: string,\n plans: PlanningAction[],\n opts?: {\n cacheable?: boolean;\n },\n ): Promise<ExecutionResult> {\n const taskExecutor = new Executor(title, {\n onTaskStart: this.onTaskStartCallback,\n });\n const { tasks } = await this.convertPlanToExecutable(plans, opts);\n await taskExecutor.append(tasks);\n const result = await taskExecutor.flush();\n const { output } = result!;\n return {\n output,\n executor: taskExecutor,\n };\n }\n\n async action(\n userPrompt: string,\n actionContext?: string,\n opts?: {\n cacheable?: boolean;\n },\n ): Promise<\n ExecutionResult<\n | {\n yamlFlow?: MidsceneYamlFlowItem[]; // for cache use\n }\n | undefined\n >\n > {\n const taskExecutor = new Executor(taskTitleStr('Action', userPrompt), {\n onTaskStart: this.onTaskStartCallback,\n });\n\n let planningTask: ExecutionTaskPlanningApply | null =\n this.planningTaskFromPrompt(userPrompt, undefined, actionContext);\n let replanCount = 0;\n const logList: string[] = [];\n\n const yamlFlow: MidsceneYamlFlowItem[] = [];\n const replanningCycleLimit =\n getAIConfigInNumber(MIDSCENE_REPLANNING_CYCLE_LIMIT) ||\n defaultReplanningCycleLimit;\n while (planningTask) {\n if (replanCount > replanningCycleLimit) {\n const errorMsg =\n 'Replanning too many times, please split the task into multiple steps';\n\n return this.appendErrorPlan(taskExecutor, errorMsg);\n }\n\n // plan\n await taskExecutor.append(planningTask);\n const result = await taskExecutor.flush();\n const planResult: PlanningAIResponse = result?.output;\n if (taskExecutor.isInErrorState()) {\n return {\n output: planResult,\n executor: taskExecutor,\n };\n }\n\n const plans = planResult.actions || [];\n yamlFlow.push(...(planResult.yamlFlow || []));\n\n let executables: Awaited<ReturnType<typeof this.convertPlanToExecutable>>;\n try {\n executables = await this.convertPlanToExecutable(plans, opts);\n taskExecutor.append(executables.tasks);\n } catch (error) {\n return this.appendErrorPlan(\n taskExecutor,\n `Error converting plans to executable tasks: ${error}, plans: ${JSON.stringify(\n plans,\n )}`,\n );\n }\n\n await taskExecutor.flush();\n if (taskExecutor.isInErrorState()) {\n return {\n output: undefined,\n executor: taskExecutor,\n };\n }\n if (planResult?.log) {\n logList.push(planResult.log);\n }\n\n if (!planResult.more_actions_needed_by_instruction) {\n planningTask = null;\n break;\n }\n planningTask = this.planningTaskFromPrompt(\n userPrompt,\n logList.length > 0 ? `- ${logList.join('\\n- ')}` : undefined,\n actionContext,\n );\n replanCount++;\n }\n\n return {\n output: {\n yamlFlow,\n },\n executor: taskExecutor,\n };\n }\n\n async actionToGoal(\n userPrompt: string,\n opts?: {\n cacheable?: boolean;\n },\n ): Promise<\n ExecutionResult<\n | {\n yamlFlow?: MidsceneYamlFlowItem[]; // for cache use\n }\n | undefined\n >\n > {\n const taskExecutor = new Executor(taskTitleStr('Action', userPrompt), {\n onTaskStart: this.onTaskStartCallback,\n });\n this.conversationHistory = [];\n const isCompleted = false;\n let currentActionNumber = 0;\n const maxActionNumber = 40;\n\n const yamlFlow: MidsceneYamlFlowItem[] = [];\n while (!isCompleted && currentActionNumber < maxActionNumber) {\n currentActionNumber++;\n const planningTask: ExecutionTaskPlanningApply =\n this.planningTaskToGoal(userPrompt);\n await taskExecutor.append(planningTask);\n const result = await taskExecutor.flush();\n if (taskExecutor.isInErrorState()) {\n return {\n output: undefined,\n executor: taskExecutor,\n };\n }\n if (!result) {\n throw new Error(\n 'result of taskExecutor.flush() is undefined in function actionToGoal',\n );\n }\n const { output } = result;\n const plans = output.actions;\n yamlFlow.push(...(output.yamlFlow || []));\n let executables: Awaited<ReturnType<typeof this.convertPlanToExecutable>>;\n try {\n executables = await this.convertPlanToExecutable(plans, opts);\n taskExecutor.append(executables.tasks);\n } catch (error) {\n return this.appendErrorPlan(\n taskExecutor,\n `Error converting plans to executable tasks: ${error}, plans: ${JSON.stringify(\n plans,\n )}`,\n );\n }\n\n await taskExecutor.flush();\n\n if (taskExecutor.isInErrorState()) {\n return {\n output: undefined,\n executor: taskExecutor,\n };\n }\n\n if (plans[0].type === 'Finished') {\n break;\n }\n }\n return {\n output: {\n yamlFlow,\n },\n executor: taskExecutor,\n };\n }\n\n private async createTypeQueryTask<T>(\n type: 'Query' | 'Boolean' | 'Number' | 'String' | 'Assert',\n demand: InsightExtractParam,\n opt?: InsightExtractOption,\n multimodalPrompt?: TMultimodalPrompt,\n ): Promise<ExecutionResult<T>> {\n const taskExecutor = new Executor(\n taskTitleStr(\n type,\n typeof demand === 'string' ? demand : JSON.stringify(demand),\n ),\n {\n onTaskStart: this.onTaskStartCallback,\n },\n );\n\n const queryTask: ExecutionTaskInsightQueryApply = {\n type: 'Insight',\n subType: type,\n locate: null,\n param: {\n // TODO: display image thumbnail in report\n dataDemand: multimodalPrompt\n ? ({\n demand,\n multimodalPrompt,\n } as never)\n : demand, // for user param presentation in report right sidebar\n },\n executor: async (param, taskContext) => {\n const { task } = taskContext;\n let insightDump: InsightDump | undefined;\n const dumpCollector: DumpSubscriber = (dump) => {\n insightDump = dump;\n };\n this.insight.onceDumpUpdatedFn = dumpCollector;\n\n // Get page context for query operations\n const shotTime = Date.now();\n const pageContext = await this.insight.contextRetrieverFn('extract');\n task.pageContext = pageContext;\n\n const recordItem: ExecutionRecorderItem = {\n type: 'screenshot',\n ts: shotTime,\n screenshot: pageContext.screenshotBase64,\n timing: 'before Extract',\n };\n task.recorder = [recordItem];\n\n const ifTypeRestricted = type !== 'Query';\n let demandInput = demand;\n if (ifTypeRestricted) {\n const returnType = type === 'Assert' ? 'Boolean' : type;\n demandInput = {\n result: `${returnType}, ${demand}`,\n };\n }\n\n const { data, usage, thought } = await this.insight.extract<any>(\n demandInput,\n opt,\n multimodalPrompt,\n );\n\n let outputResult = data;\n if (ifTypeRestricted) {\n assert(data?.result !== undefined, 'No result in query data');\n outputResult = (data as any).result;\n }\n\n return {\n output: outputResult,\n log: { dump: insightDump },\n usage,\n thought,\n };\n },\n };\n\n await taskExecutor.append(this.prependExecutorWithScreenshot(queryTask));\n const result = await taskExecutor.flush();\n\n if (!result) {\n throw new Error(\n 'result of taskExecutor.flush() is undefined in function createTypeQueryTask',\n );\n }\n\n const { output, thought } = result;\n\n return {\n output,\n thought,\n executor: taskExecutor,\n };\n }\n\n async query(\n demand: InsightExtractParam,\n opt?: InsightExtractOption,\n ): Promise<ExecutionResult> {\n return this.createTypeQueryTask('Query', demand, opt);\n }\n\n async boolean(\n prompt: TUserPrompt,\n opt?: InsightExtractOption,\n ): Promise<ExecutionResult<boolean>> {\n const { textPrompt, multimodalPrompt } = parsePrompt(prompt);\n return this.createTypeQueryTask<boolean>(\n 'Boolean',\n textPrompt,\n opt,\n multimodalPrompt,\n );\n }\n\n async number(\n prompt: TUserPrompt,\n opt?: InsightExtractOption,\n ): Promise<ExecutionResult<number>> {\n const { textPrompt, multimodalPrompt } = parsePrompt(prompt);\n return this.createTypeQueryTask<number>(\n 'Number',\n textPrompt,\n opt,\n multimodalPrompt,\n );\n }\n\n async string(\n prompt: TUserPrompt,\n opt?: InsightExtractOption,\n ): Promise<ExecutionResult<string>> {\n const { textPrompt, multimodalPrompt } = parsePrompt(prompt);\n return this.createTypeQueryTask<string>(\n 'String',\n textPrompt,\n opt,\n multimodalPrompt,\n );\n }\n\n async assert(\n assertion: TUserPrompt,\n opt?: InsightExtractOption,\n ): Promise<ExecutionResult<boolean>> {\n const { textPrompt, multimodalPrompt } = parsePrompt(assertion);\n return await this.createTypeQueryTask<boolean>(\n 'Assert',\n textPrompt,\n opt,\n multimodalPrompt,\n );\n }\n\n /**\n * Append a message to the conversation history\n * For user messages with images:\n * - Keep max 4 user image messages in history\n * - Remove oldest user image message when limit reached\n * For assistant messages:\n * - Simply append to history\n * @param conversationHistory Message to append\n */\n private appendConversationHistory(\n conversationHistory: ChatCompletionMessageParam,\n ) {\n if (conversationHistory.role === 'user') {\n // Get all existing user messages with images\n const userImgItems = this.conversationHistory.filter(\n (item) => item.role === 'user',\n );\n\n // If we already have 4 user image messages\n if (userImgItems.length >= 4 && conversationHistory.role === 'user') {\n // Remove first user image message when we already have 4, before adding new one\n const firstUserImgIndex = this.conversationHistory.findIndex(\n (item) => item.role === 'user',\n );\n if (firstUserImgIndex >= 0) {\n this.conversationHistory.splice(firstUserImgIndex, 1);\n }\n }\n }\n // For non-user messages, simply append to history\n this.conversationHistory.push(conversationHistory);\n }\n\n private async appendErrorPlan(taskExecutor: Executor, errorMsg: string) {\n const errorPlan: PlanningAction<PlanningActionParamError> = {\n type: 'Error',\n param: {\n thought: errorMsg,\n },\n locate: null,\n };\n const { tasks } = await this.convertPlanToExecutable([errorPlan]);\n await taskExecutor.append(this.prependExecutorWithScreenshot(tasks[0]));\n await taskExecutor.flush();\n\n return {\n output: undefined,\n executor: taskExecutor,\n };\n }\n\n async waitFor(\n assertion: string,\n opt: PlanningActionParamWaitFor,\n ): Promise<ExecutionResult<void>> {\n const description = `waitFor: ${assertion}`;\n const taskExecutor = new Executor(taskTitleStr('WaitFor', description), {\n onTaskStart: this.onTaskStartCallback,\n });\n const { timeoutMs, checkIntervalMs } = opt;\n\n assert(assertion, 'No assertion for waitFor');\n assert(timeoutMs, 'No timeoutMs for waitFor');\n assert(checkIntervalMs, 'No checkIntervalMs for waitFor');\n\n const overallStartTime = Date.now();\n let startTime = Date.now();\n let errorThought = '';\n while (Date.now() - overallStartTime < timeoutMs) {\n startTime = Date.now();\n const assertPlan: PlanningAction<PlanningActionParamAssert> = {\n type: 'AssertWithoutThrow',\n param: {\n assertion,\n },\n locate: null,\n };\n const { tasks: assertTasks } = await this.convertPlanToExecutable([\n assertPlan,\n ]);\n await taskExecutor.append(\n this.prependExecutorWithScreenshot(assertTasks[0]),\n );\n const result = await taskExecutor.flush();\n\n if (!result) {\n throw new Error(\n 'result of taskExecutor.flush() is undefined in function waitFor',\n );\n }\n\n const { output } = result as { output: InsightAssertionResponse };\n\n if (output?.pass) {\n return {\n output: undefined,\n executor: taskExecutor,\n };\n }\n\n errorThought =\n output?.thought ||\n `unknown error when waiting for assertion: ${assertion}`;\n const now = Date.now();\n if (now - startTime < checkIntervalMs) {\n const timeRemaining = checkIntervalMs - (now - startTime);\n const sleepPlan: PlanningAction<PlanningActionParamSleep> = {\n type: 'Sleep',\n param: {\n timeMs: timeRemaining,\n },\n locate: null,\n };\n const { tasks: sleepTasks } = await this.convertPlanToExecutable([\n sleepPlan,\n ]);\n await taskExecutor.append(\n this.prependExecutorWithScreenshot(sleepTasks[0]),\n );\n await taskExecutor.flush();\n }\n }\n\n return this.appendErrorPlan(\n taskExecutor,\n `waitFor timeout: ${errorThought}`,\n );\n }\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","debug","getDebug","defaultReplanningCycleLimit","PageTaskExecutor","timing","base64","item","Date","pageContext","element","_element_attributes","elementId","undefined","xpaths","NodeType","info","elementByPositionWithElementInfo","result","error","taskApply","appendAfterExecution","taskWithScreenshot","param","context","args","recorder","task","shot","Promise","sleep","shot2","plans","opts","tasks","plan","_plan_locate","_plan_locate1","taskFind","taskContext","_this_taskCache","_locateCacheRecord_cacheContent","assert","insightDump","usage","dumpCollector","dump","_dump_taskInfo","shotTime","recordItem","elementFromXpath","userExpectedPathHitFlag","cachePrompt","locateCacheRecord","elementFromCache","matchElementFromCache","cacheHitFlag","elementFromPlan","matchElementFromPlan","planHitFlag","elementFromAiLocate","aiLocateHitFlag","currentXpaths","elementXpaths","Error","hitBy","assertPlan","taskAssert","assertion","_plan_param","taskActionError","taskActionFinished","taskActionSleep","taskParam","taskActionDrag","planType","_context_element","actionSpace","action","actionFn","wrappedTasks","index","executorContext","userInstruction","yamlString","taskExecutor","Executor","taskTitleStr","log","actionContext","startTime","Array","console","planResult","actions","more_actions_needed_by_instruction","rawResponse","stopCollecting","bboxCollected","planParsingError","finalActions","acc","planningAction","JSON","timeNow","timeRemaining","_actions_","imagePayload","resizeImageForUiTars","vlmPlanning","action_summary","title","output","userPrompt","planningTask","replanCount","logList","yamlFlow","replanningCycleLimit","getAIConfigInNumber","MIDSCENE_REPLANNING_CYCLE_LIMIT","errorMsg","executables","isCompleted","currentActionNumber","maxActionNumber","type","demand","opt","multimodalPrompt","queryTask","ifTypeRestricted","demandInput","returnType","data","thought","outputResult","prompt","textPrompt","parsePrompt","conversationHistory","userImgItems","firstUserImgIndex","errorPlan","description","timeoutMs","checkIntervalMs","overallStartTime","errorThought","assertTasks","now","sleepPlan","sleepTasks","page","insight"],"mappings":";;;IAAAA,oBAAoB,CAAC,GAAG,CAAC,UAASC;QACjC,IAAI,IAAIC,OAAOD,WACR,IAAGD,oBAAoB,CAAC,CAACC,YAAYC,QAAQ,CAACF,oBAAoB,CAAC,CAAC,UAASE,MACzEC,OAAO,cAAc,CAAC,UAASD,KAAK;YAAE,YAAY;YAAM,KAAKD,UAAU,CAACC,IAAI;QAAC;IAGzF;;;ICNAF,oBAAoB,CAAC,GAAG,CAACI,KAAKC,OAAUF,OAAO,SAAS,CAAC,cAAc,CAAC,IAAI,CAACC,KAAKC;;;ICClFL,oBAAoB,CAAC,GAAG,CAAC;QACxB,IAAG,AAAkB,eAAlB,OAAOM,UAA0BA,OAAO,WAAW,EACrDH,OAAO,cAAc,CAAC,UAASG,OAAO,WAAW,EAAE;YAAE,OAAO;QAAS;QAEtEH,OAAO,cAAc,CAAC,UAAS,cAAc;YAAE,OAAO;QAAK;IAC5D;;;;;;;;;;;;;;;;;;;;;;;;;;AC4DA,MAAMI,QAAQC,AAAAA,IAAAA,uBAAAA,QAAAA,AAAAA,EAAS;AACvB,MAAMC,8BAA8B;AAE7B,MAAMC;IA2BX,MAAc,iBAAiBC,MAAuC,EAAE;QACtE,MAAMC,SAAS,MAAM,IAAI,CAAC,IAAI,CAAC,gBAAgB;QAC/C,MAAMC,OAA8B;YAClC,MAAM;YACN,IAAIC,KAAK,GAAG;YACZ,YAAYF;YACZD;QACF;QACA,OAAOE;IACT;IAEA,MAAc,gBACZE,WAAmC,EACnCC,OAA4B,EACG;YAe3BC;QAdJ,IAAIC,YAAYF,QAAAA,UAAAA,KAAAA,IAAAA,QAAS,EAAE;QAC3B,IAAIA,AAAAA,CAAAA,QAAAA,UAAAA,KAAAA,IAAAA,QAAS,gBAAgB,AAAD,MAAMG,QAAW;YAC3C,MAAMC,SAAS,MAAM,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAC7C;gBACE,MAAMJ,QAAQ,MAAM,CAAC,EAAE;gBACvB,KAAKA,QAAQ,MAAM,CAAC,EAAE;YACxB,GACAA,QAAAA,UAAAA,KAAAA,IAAAA,QAAS,gBAAgB;YAG3B,OAAOI;QACT;QAGA,IAAIH,AAAAA,CAAAA,QAAAA,UAAAA,KAAAA,IAAAA,QAAAA,CAAAA,sBAAAA,QAAS,UAAU,AAAD,IAAlBA,KAAAA,IAAAA,oBAAqB,QAAQ,AAAD,MAAMI,0BAAAA,QAAAA,CAAAA,QAAiB,EAAE;YACvD,MAAM,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC;YACtC,MAAMC,OAAOC,AAAAA,IAAAA,yBAAAA,gCAAAA,AAAAA,EACXR,YAAY,IAAI,EAChB;gBACE,GAAGC,QAAQ,MAAM,CAAC,EAAE;gBACpB,GAAGA,QAAQ,MAAM,CAAC,EAAE;YACtB,GACA;gBACE,uBAAuB;gBACvB,wBAAwB;YAC1B;YAEF,IAAIM,QAAAA,OAAAA,KAAAA,IAAAA,KAAM,EAAE,EACVJ,YAAYI,KAAK,EAAE;iBAEnBf,MACE,gEACAS;QAGN;QAEA,IAAI,CAACE,WACH;QAEF,IAAI;YACF,MAAMM,SAAS,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,CAACN;YAC7C,OAAOM;QACT,EAAE,OAAOC,OAAO;YACdlB,MAAM,yBAAyBkB;QACjC;IACF;IAEQ,8BACNC,SAA6B,EAC7BC,uBAAuB,KAAK,EACR;QACpB,MAAMC,qBAAyC;YAC7C,GAAGF,SAAS;YACZ,UAAU,OAAOG,OAAOC,SAAS,GAAGC;gBAClC,MAAMC,WAAoC,EAAE;gBAC5C,MAAM,EAAEC,IAAI,EAAE,GAAGH;gBAEjBG,KAAK,QAAQ,GAAGD;gBAChB,MAAME,OAAO,MAAM,IAAI,CAAC,gBAAgB,CAAC,CAAC,OAAO,EAAED,KAAK,IAAI,EAAE;gBAC9DD,SAAS,IAAI,CAACE;gBACd,MAAMV,SAAS,MAAME,UAAU,QAAQ,CAACG,OAAOC,YAAYC;gBAC3D,IAAIL,AAAmB,aAAnBA,UAAU,IAAI,EAChB,MAAMS,QAAQ,GAAG,CAAC;oBACf;wBACC,MAAMC,AAAAA,IAAAA,sBAAAA,KAAAA,AAAAA,EAAM;wBACZ,IAAK,IAAI,CAAC,IAAI,CAAsB,oBAAoB,EACtD,IAAI;4BACF,MAAO,IAAI,CAAC,IAAI,CAAsB,oBAAoB;wBAC5D,EAAE,OAAOX,OAAO,CAEhB;oBAEJ;oBACAW,IAAAA,sBAAAA,KAAAA,AAAAA,EAAM;iBACP;gBAEH,IAAIT,sBAAsB;oBACxB,MAAMU,QAAQ,MAAM,IAAI,CAAC,gBAAgB,CAAC;oBAC1CL,SAAS,IAAI,CAACK;gBAChB;gBACA,OAAOb;YACT;QACF;QACA,OAAOI;IACT;IAEA,MAAa,wBACXU,KAAuB,EACvBC,IAEC,EACD;QACA,MAAMC,QAA8B,EAAE;QACtC,KAAK,MAAMC,QAAQH,MACjB,IAAIG,AAAc,aAAdA,KAAK,IAAI,EAAe;gBAGxBC,cACAC;YAHF,IACEF,AAAgB,SAAhBA,KAAK,MAAM,IACXC,AAAAA,SAAAA,CAAAA,eAAAA,KAAK,MAAM,AAAD,IAAVA,KAAAA,IAAAA,aAAa,EAAE,AAAD,MAAM,QACpBC,AAAAA,SAAAA,CAAAA,gBAAAA,KAAK,MAAM,AAAD,IAAVA,KAAAA,IAAAA,cAAa,EAAE,AAAD,MAAM,QAGpB;YAEF,MAAMC,WAA4C;gBAChD,MAAM;gBACN,SAAS;gBACT,OAAOH,KAAK,MAAM,GACd;oBACE,GAAGA,KAAK,MAAM;oBACd,WAAWF,QAAAA,OAAAA,KAAAA,IAAAA,KAAM,SAAS;gBAC5B,IACApB;gBACJ,SAASsB,KAAK,OAAO;gBACrB,QAAQA,KAAK,MAAM;gBACnB,UAAU,OAAOZ,OAAOgB;wBA0CpBC,iBACaC;oBA1Cf,MAAM,EAAEd,IAAI,EAAE,GAAGY;oBACjBG,IAAAA,6BAAAA,MAAAA,AAAAA,EACEnB,AAAAA,CAAAA,QAAAA,QAAAA,KAAAA,IAAAA,MAAO,MAAM,AAAD,KAAKA,CAAAA,QAAAA,QAAAA,KAAAA,IAAAA,MAAO,EAAE,AAAD,KAAKA,CAAAA,QAAAA,QAAAA,KAAAA,IAAAA,MAAO,IAAI,AAAD,GACxC;oBAEF,IAAIoB;oBACJ,IAAIC;oBACJ,MAAMC,gBAAgC,CAACC;4BAE7BC;wBADRJ,cAAcG;wBACdF,QAAQG,QAAAA,OAAAA,KAAAA,IAAAA,QAAAA,CAAAA,iBAAAA,KAAM,QAAQ,AAAD,IAAbA,KAAAA,IAAAA,eAAgB,KAAK;wBAE7BpB,KAAK,GAAG,GAAG;4BACT,MAAMgB;wBACR;wBAEAhB,KAAK,KAAK,GAAGiB;oBACf;oBACA,IAAI,CAAC,OAAO,CAAC,iBAAiB,GAAGC;oBACjC,MAAMG,WAAWxC,KAAK,GAAG;oBAGzB,MAAMC,cAAc,MAAM,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC;oBAC1DkB,KAAK,WAAW,GAAGlB;oBAEnB,MAAMwC,aAAoC;wBACxC,MAAM;wBACN,IAAID;wBACJ,YAAYvC,YAAY,gBAAgB;wBACxC,QAAQ;oBACV;oBACAkB,KAAK,QAAQ,GAAG;wBAACsB;qBAAW;oBAG5B,MAAMC,mBAAmB3B,MAAM,KAAK,GAChC,MAAM,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAACA,MAAM,KAAK,IACjDV;oBACJ,MAAMsC,0BAA0B,CAAC,CAACD;oBAGlC,MAAME,cAAc7B,MAAM,MAAM;oBAChC,MAAM8B,oBAAAA,QACJb,CAAAA,kBAAAA,IAAI,CAAC,SAAS,AAAD,IAAbA,KAAAA,IAAAA,gBAAgB,gBAAgB,CAACY;oBACnC,MAAMtC,SAAS2B,QAAAA,oBAAAA,KAAAA,IAAAA,QAAAA,CAAAA,kCAAAA,kBAAmB,YAAY,AAAD,IAA9BA,KAAAA,IAAAA,gCAAiC,MAAM;oBACtD,MAAMa,mBAAmBH,0BACrB,OACA,MAAMI,AAAAA,IAAAA,kCAAAA,qBAAAA,AAAAA,EACJ,IAAI,EACJzC,QACAsC,aACA7B,MAAM,SAAS;oBAErB,MAAMiC,eAAe,CAAC,CAACF;oBAGvB,MAAMG,kBACJ,AAACN,2BAA4BK,eAEzB3C,SADA6C,AAAAA,IAAAA,kCAAAA,oBAAAA,AAAAA,EAAqBnC,OAAOd,YAAY,IAAI;oBAElD,MAAMkD,cAAc,CAAC,CAACF;oBAGtB,MAAMG,sBACJ,AAACT,2BAA4BK,gBAAiBG,cAO1C9C,SALE,OAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAACU,OAAO;wBAE/B,SAASd;oBACX,EAAC,EACD,OAAO;oBAEf,MAAMoD,kBAAkB,CAAC,CAACD;oBAE1B,MAAMlD,UACJwC,oBACAI,oBACAG,mBACAG;oBAGF,IAAIE;oBACJ,IACEpD,WACA,IAAI,CAAC,SAAS,IACd,CAAC8C,gBACDjC,AAAAA,CAAAA,QAAAA,QAAAA,KAAAA,IAAAA,MAAO,SAAS,AAAD,MAAM,OACrB;wBACA,MAAMwC,gBAAgB,MAAM,IAAI,CAAC,eAAe,CAC9CtD,aACAC;wBAEF,IAAIqD,QAAAA,gBAAAA,KAAAA,IAAAA,cAAe,MAAM,EAAE;4BACzBD,gBAAgBC;4BAChB,IAAI,CAAC,SAAS,CAAC,yBAAyB,CACtC;gCACE,MAAM;gCACN,QAAQX;gCACR,QAAQW;4BACV,GACAV;wBAEJ,OACEpD,MACE,0CACAmD,aACAW;oBAGN;oBACA,IAAI,CAACrD,SACH,MAAM,IAAIsD,MAAM,CAAC,mBAAmB,EAAEzC,MAAM,MAAM,EAAE;oBAGtD,IAAI0C;oBAEJ,IAAId,yBACFc,QAAQ;wBACN,MAAM;wBACN,SAAS;4BACP,OAAO1C,MAAM,KAAK;wBACpB;oBACF;yBACK,IAAIiC,cACTS,QAAQ;wBACN,MAAM;wBACN,SAAS;4BACP,iBAAiBnD;4BACjB,cAAcgD;wBAChB;oBACF;yBACK,IAAIH,aACTM,QAAQ;wBACN,MAAM;wBACN,SAAS;4BACP,IAAIR,QAAAA,kBAAAA,KAAAA,IAAAA,gBAAiB,EAAE;4BACvB,MAAMA,QAAAA,kBAAAA,KAAAA,IAAAA,gBAAiB,IAAI;wBAC7B;oBACF;yBACK,IAAII,iBACTI,QAAQ;wBACN,MAAM;wBACN,SAAS;4BACP,QAAQ1C,MAAM,MAAM;wBACtB;oBACF;oBAGF,OAAO;wBACL,QAAQ;4BACNb;wBACF;wBACAD;wBACAwD;oBACF;gBACF;YACF;YACA/B,MAAM,IAAI,CAACI;QACb,OAAO,IAAIH,AAAc,aAAdA,KAAK,IAAI,IAAiBA,AAAc,yBAAdA,KAAK,IAAI,EAA2B;YACvE,MAAM+B,aAAa/B;YACnB,MAAMgC,aAAiC;gBACrC,MAAM;gBACN,SAAS;gBACT,OAAOD,WAAW,KAAK;gBACvB,SAASA,WAAW,OAAO;gBAC3B,QAAQA,WAAW,MAAM;gBACzB,UAAU,OAAO3C,OAAOgB;oBACtB,MAAM,EAAEZ,IAAI,EAAE,GAAGY;oBACjB,IAAII;oBACJ,MAAME,gBAAgC,CAACC;wBACrCH,cAAcG;oBAChB;oBACA,IAAI,CAAC,OAAO,CAAC,iBAAiB,GAAGD;oBACjC,MAAMG,WAAWxC,KAAK,GAAG;oBACzB,MAAMC,cAAc,MAAM,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC;oBAC1DkB,KAAK,WAAW,GAAGlB;oBAEnB,MAAMwC,aAAoC;wBACxC,MAAM;wBACN,IAAID;wBACJ,YAAYvC,YAAY,gBAAgB;wBACxC,QAAQ;oBACV;oBACAkB,KAAK,QAAQ,GAAG;wBAACsB;qBAAW;oBAE5B,MAAMmB,YAAY,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CACzCF,WAAW,KAAK,CAAC,SAAS;oBAG5B,IAAI,CAACE,UAAU,IAAI,EAAE;wBACnB,IAAIjC,AAAc,aAAdA,KAAK,IAAI,EAAe;4BAC1BR,KAAK,MAAM,GAAGyC;4BACdzC,KAAK,GAAG,GAAG;gCACT,MAAMgB;4BACR;4BACA,MAAM,IAAIqB,MACRI,UAAU,OAAO,IAAI;wBAEzB;wBAEAzC,KAAK,KAAK,GAAG,IAAIqC,MAAMI,UAAU,OAAO;oBAC1C;oBAEA,OAAO;wBACL,QAAQA;wBACR3D;wBACA,KAAK;4BACH,MAAMkC;wBACR;wBACA,OAAOyB,UAAU,KAAK;oBACxB;gBACF;YACF;YACAlC,MAAM,IAAI,CAACiC;QACb,OAAO,IAAIhC,AAAc,YAAdA,KAAK,IAAI,EAAc;gBAMHkC;YAL7B,MAAMC,kBACJ;gBACE,MAAM;gBACN,SAAS;gBACT,OAAOnC,KAAK,KAAK;gBACjB,SAASA,KAAK,OAAO,aAAIkC,CAAAA,cAAAA,KAAK,KAAK,AAAD,IAATA,KAAAA,IAAAA,YAAY,OAAO,AAAD;gBAC3C,QAAQlC,KAAK,MAAM;gBACnB,UAAU;wBAEWkC;oBADnB,MAAM,IAAIL,MACR7B,AAAAA,CAAAA,QAAAA,OAAAA,KAAAA,IAAAA,KAAM,OAAO,AAAD,KAAC,SAAIkC,CAAAA,cAAAA,KAAK,KAAK,AAAD,IAATA,KAAAA,IAAAA,YAAY,OAAO,AAAD,KAAK;gBAE5C;YACF;YACFnC,MAAM,IAAI,CAACoC;QACb,OAAO,IAAInC,AAAc,eAAdA,KAAK,IAAI,EAAiB;YACnC,MAAMoC,qBAAqD;gBACzD,MAAM;gBACN,SAAS;gBACT,OAAO;gBACP,SAASpC,KAAK,OAAO;gBACrB,QAAQA,KAAK,MAAM;gBACnB,UAAU,OAAOZ,SAAW;YAC9B;YACAW,MAAM,IAAI,CAACqC;QACb,OAAO,IAAIpC,AAAc,YAAdA,KAAK,IAAI,EAAc;YAChC,MAAMqC,kBACJ;gBACE,MAAM;gBACN,SAAS;gBACT,OAAOrC,KAAK,KAAK;gBACjB,SAASA,KAAK,OAAO;gBACrB,QAAQA,KAAK,MAAM;gBACnB,UAAU,OAAOsC;oBACf,MAAM3C,AAAAA,IAAAA,sBAAAA,KAAAA,AAAAA,EAAM2C,AAAAA,CAAAA,QAAAA,YAAAA,KAAAA,IAAAA,UAAW,MAAM,AAAD,KAAK;gBACnC;YACF;YACFvC,MAAM,IAAI,CAACsC;QACb,OAAO,IAAIrC,AAAc,WAAdA,KAAK,IAAI,EAAa;YAC/B,MAAMuC,iBAGD;gBACH,MAAM;gBACN,SAAS;gBACT,OAAOvC,KAAK,KAAK;gBACjB,SAASA,KAAK,OAAO;gBACrB,QAAQA,KAAK,MAAM;gBACnB,UAAU,OAAOsC;oBACf/B,IAAAA,6BAAAA,MAAAA,AAAAA,EACE+B,AAAAA,CAAAA,QAAAA,YAAAA,KAAAA,IAAAA,UAAW,SAAS,AAAD,KAAKA,CAAAA,QAAAA,YAAAA,KAAAA,IAAAA,UAAW,OAAO,AAAD,GACzC;oBAEF,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAACA,UAAU,SAAS,EAAEA,UAAU,OAAO;gBACnE;YACF;YACAvC,MAAM,IAAI,CAACwC;QACb,OAAO;YACL,MAAMC,WAAWxC,KAAK,IAAI;YAC1B,MAAMR,OAAiC;gBACrC,MAAM;gBACN,SAASgD;gBACT,SAASxC,KAAK,OAAO;gBACrB,OAAOA,KAAK,KAAK;gBACjB,UAAU,OAAOZ,OAAOC;wBAKOoD;oBAJ7B3E,MACE,oBACA0E,UACApD,OACA,CAAC,wBAAwB,EAAE,QAAAqD,CAAAA,mBAAAA,QAAQ,OAAO,AAAD,IAAdA,KAAAA,IAAAA,iBAAiB,MAAM,EAAE;oBAEtD,MAAMC,cAAc,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW;oBAC/C,MAAMC,SAASD,YAAY,IAAI,CAC7B,CAACC,SAAWA,OAAO,IAAI,KAAKH;oBAE9B,IAAI,CAACG,QACH,MAAM,IAAId,MAAM,CAAC,aAAa,EAAEW,SAAS,WAAW,CAAC;oBAEvD,MAAMI,WAAWD,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;oBAC3C,OAAO,MAAMC,SAASvD,SAASD;gBACjC;YACF;YACAW,MAAM,IAAI,CAACP;QACb;QAGF,MAAMqD,eAAe9C,MAAM,GAAG,CAC5B,CAACP,MAA0BsD;YACzB,IAAItD,AAAc,aAAdA,KAAK,IAAI,EACX,OAAO,IAAI,CAAC,6BAA6B,CACvCA,MACAsD,UAAU/C,MAAM,MAAM,GAAG;YAG7B,OAAOP;QACT;QAGF,OAAO;YACL,OAAOqD;QACT;IACF;IAEA,MAAc,qBAAqBE,eAAgC,EAAE;QACnE,MAAMlC,WAAWxC,KAAK,GAAG;QACzB,MAAMC,cAAc,MAAM,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC;QAC1D,MAAMwC,aAAoC;YACxC,MAAM;YACN,IAAID;YACJ,YAAYvC,YAAY,gBAAgB;YACxC,QAAQ;QACV;QAEAyE,gBAAgB,IAAI,CAAC,QAAQ,GAAG;YAACjC;SAAW;QAC3CiC,gBAAgB,IAAI,CAA2B,WAAW,GAAGzE;QAE9D,OAAO;YACLA;QACF;IACF;IAEA,MAAM,uBAAuB0E,eAAuB,EAAEC,UAAkB,EAAE;QACxE,MAAMC,eAAe,IAAIC,qBAAAA,QAAQA,CAACC,AAAAA,IAAAA,qCAAAA,YAAAA,AAAAA,EAAa,UAAUJ,kBAAkB;YACzE,aAAa,IAAI,CAAC,mBAAmB;QACvC;QAEA,MAAMxD,OAAmC;YACvC,MAAM;YACN,SAAS;YACT,QAAQ;YACR,OAAO;gBACLwD;YACF;YACA,UAAU,OAAO5D,OAAO2D;gBACtB,MAAM,IAAI,CAAC,oBAAoB,CAACA;gBAChC,OAAO;oBACL,QAAQ;wBACN,SAAS,EAAE;wBACX,oCAAoC;wBACpC,KAAK;wBACLE;oBACF;oBACA,OAAO;wBACL,KAAK;oBACP;gBACF;YACF;QACF;QAEA,MAAMC,aAAa,MAAM,CAAC1D;QAC1B,MAAM0D,aAAa,KAAK;QAExB,OAAO;YACL,UAAUA;QACZ;IACF;IAEQ,uBACNF,eAAuB,EACvBK,GAAY,EACZC,aAAsB,EACtB;QACA,MAAM9D,OAAmC;YACvC,MAAM;YACN,SAAS;YACT,QAAQ;YACR,OAAO;gBACLwD;gBACAK;YACF;YACA,UAAU,OAAOjE,OAAO2D;gBACtB,MAAMQ,YAAYlF,KAAK,GAAG;gBAC1B,MAAM,EAAEC,WAAW,EAAE,GACnB,MAAM,IAAI,CAAC,oBAAoB,CAACyE;gBAElCxC,IAAAA,6BAAAA,MAAAA,AAAAA,EACE,IAAI,CAAC,IAAI,CAAC,WAAW,EACrB;gBAEF,MAAMmC,cAAc,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW;gBAC/C5E,MACE,4BACA4E,YAAY,GAAG,CAAC,CAACC,SAAWA,OAAO,IAAI,EAAE,IAAI,CAAC;gBAEhDpC,IAAAA,6BAAAA,MAAAA,AAAAA,EAAOiD,MAAM,OAAO,CAACd,cAAc;gBACnC,IAAIA,AAAuB,MAAvBA,YAAY,MAAM,EACpBe,QAAQ,IAAI,CACV,CAAC,gBAAgB,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,gDAAgD,CAAC;gBAI3F,MAAMC,aAAa,MAAM1D,AAAAA,IAAAA,qBAAAA,IAAAA,AAAAA,EAAKZ,MAAM,eAAe,EAAE;oBACnD,SAASd;oBACT,KAAKc,MAAM,GAAG;oBACdkE;oBACA,UAAU,IAAI,CAAC,IAAI,CAAC,QAAQ;oBAC5BZ;gBACF;gBAEA,MAAM,EACJiB,OAAO,EACPN,GAAG,EACHO,kCAAkC,EAClC5E,KAAK,EACLyB,KAAK,EACLoD,WAAW,EACXlE,KAAK,EACN,GAAG+D;gBAEJX,gBAAgB,IAAI,CAAC,GAAG,GAAG;oBACzB,GAAIA,gBAAgB,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;oBAClCc;gBACF;gBACAd,gBAAgB,IAAI,CAAC,KAAK,GAAGtC;gBAE7B,IAAIqD,iBAAiB;gBACrB,IAAIC,gBAAgB;gBACpB,IAAIC,mBAAmB;gBACvB,MAAMC,eAAgBN,AAAAA,CAAAA,WAAW,EAAC,EAAG,MAAM,CACzC,CAACO,KAAKC;oBACJ,IAAIL,gBACF,OAAOI;oBAGT,IAAIC,eAAe,MAAM,EAAE;wBAEzB,IAAIJ,iBAAiBI,eAAe,MAAM,CAAC,IAAI,EAE7C,OAAOA,eAAe,MAAM,CAAC,IAAI;wBAGnC,IAAIA,eAAe,MAAM,CAAC,IAAI,EAC5BJ,gBAAgB;wBAGlBG,IAAI,IAAI,CAAC;4BACP,MAAM;4BACN,QAAQC,eAAe,MAAM;4BAC7B,OAAO;4BAEP,SAASA,eAAe,MAAM,CAAC,MAAM;wBACvC;oBACF,OAAO,IACL;wBAAC;wBAAO;wBAAS;qBAAQ,CAAC,QAAQ,CAACA,eAAe,IAAI,GACtD;wBACAH,mBAAmB,CAAC,2BAA2B,EAAEI,KAAK,SAAS,CAACD,iBAAiB;wBAEjFL,iBAAiB;wBACjB,OAAOI;oBACT;oBACAA,IAAI,IAAI,CAACC;oBACT,OAAOD;gBACT,GACA,EAAE;gBAGJ,IAAIvE,OAAO;oBACT,MAAM0E,UAAUhG,KAAK,GAAG;oBACxB,MAAMiG,gBAAgB3E,QAAS0E,CAAAA,UAAUd,SAAQ;oBACjD,IAAIe,gBAAgB,GAClBL,aAAa,IAAI,CAAC;wBAChB,MAAM;wBACN,OAAO;4BACL,QAAQK;wBACV;wBACA,QAAQ;oBACV;gBAEJ;gBAEA,IAAIL,AAAwB,MAAxBA,aAAa,MAAM,EACrB1D,AAAAA,IAAAA,6BAAAA,MAAAA,AAAAA,EACE,CAACqD,sCAAsCjE,OACvCX,QACI,CAAC,gBAAgB,EAAEA,OAAO,GAC1BgF,oBAAoB;gBAI5B,OAAO;oBACL,QAAQ;wBACN,SAASC;wBACTL;wBACAP;wBACA,UAAUK,WAAW,QAAQ;oBAC/B;oBACA,OAAO;wBACL,KAAK;oBACP;oBACApF;gBACF;YACF;QACF;QAEA,OAAOkB;IACT;IAEQ,mBAAmBwD,eAAuB,EAAE;QAClD,MAAMxD,OAAmC;YACvC,MAAM;YACN,SAAS;YACT,QAAQ;YACR,OAAO;gBACLwD;YACF;YACA,UAAU,OAAO5D,OAAO2D;oBA6CTwB;gBA5Cb,MAAM,EAAEjG,WAAW,EAAE,GACnB,MAAM,IAAI,CAAC,oBAAoB,CAACyE;gBAElC,MAAMyB,eAAe,MAAMC,AAAAA,IAAAA,yBAAAA,oBAAAA,AAAAA,EACzBnG,YAAY,gBAAgB,EAC5BA,YAAY,IAAI;gBAGlB,IAAI,CAAC,yBAAyB,CAAC;oBAC7B,MAAM;oBACN,SAAS;wBACP;4BACE,MAAM;4BACN,WAAW;gCACT,KAAKkG;4BACP;wBACF;qBACD;gBACH;gBACA,MAAMd,aAMF,MAAMgB,AAAAA,IAAAA,yBAAAA,WAAAA,AAAAA,EAAY;oBACpB,iBAAiBtF,MAAM,eAAe;oBACtC,qBAAqB,IAAI,CAAC,mBAAmB;oBAC7C,MAAMd,YAAY,IAAI;gBACxB;gBAEA,MAAM,EAAEqF,OAAO,EAAEgB,cAAc,EAAElE,KAAK,EAAE,GAAGiD;gBAC3CX,gBAAgB,IAAI,CAAC,GAAG,GAAG;oBACzB,GAAIA,gBAAgB,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;oBAClC,aAAaW,WAAW,WAAW;gBACrC;gBACAX,gBAAgB,IAAI,CAAC,KAAK,GAAGtC;gBAC7B,IAAI,CAAC,yBAAyB,CAAC;oBAC7B,MAAM;oBACN,SAASkE;gBACX;gBACA,OAAO;oBACL,QAAQ;wBACNhB;wBACA,SAAS,QAAAY,CAAAA,YAAAA,OAAO,CAAC,EAAE,AAAD,IAATA,KAAAA,IAAAA,UAAY,OAAO;wBAC5B,YAAYZ,OAAO,CAAC,EAAE,CAAC,IAAI;wBAC3B,oCAAoC;wBACpC,KAAK;wBACL,UAAUD,WAAW,QAAQ;oBAC/B;oBACA,OAAO;wBACL,KAAK;oBACP;gBACF;YACF;QACF;QAEA,OAAOlE;IACT;IAEA,MAAM,SACJoF,KAAa,EACb/E,KAAuB,EACvBC,IAEC,EACyB;QAC1B,MAAMoD,eAAe,IAAIC,qBAAAA,QAAQA,CAACyB,OAAO;YACvC,aAAa,IAAI,CAAC,mBAAmB;QACvC;QACA,MAAM,EAAE7E,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAACF,OAAOC;QAC5D,MAAMoD,aAAa,MAAM,CAACnD;QAC1B,MAAMhB,SAAS,MAAMmE,aAAa,KAAK;QACvC,MAAM,EAAE2B,MAAM,EAAE,GAAG9F;QACnB,OAAO;YACL8F;YACA,UAAU3B;QACZ;IACF;IAEA,MAAM,OACJ4B,UAAkB,EAClBxB,aAAsB,EACtBxD,IAEC,EAQD;QACA,MAAMoD,eAAe,IAAIC,qBAAAA,QAAQA,CAACC,AAAAA,IAAAA,qCAAAA,YAAAA,AAAAA,EAAa,UAAU0B,aAAa;YACpE,aAAa,IAAI,CAAC,mBAAmB;QACvC;QAEA,IAAIC,eACF,IAAI,CAAC,sBAAsB,CAACD,YAAYpG,QAAW4E;QACrD,IAAI0B,cAAc;QAClB,MAAMC,UAAoB,EAAE;QAE5B,MAAMC,WAAmC,EAAE;QAC3C,MAAMC,uBACJC,AAAAA,IAAAA,oBAAAA,mBAAAA,AAAAA,EAAoBC,oBAAAA,+BAA+BA,KACnDrH;QACF,MAAO+G,aAAc;YACnB,IAAIC,cAAcG,sBAAsB;gBACtC,MAAMG,WACJ;gBAEF,OAAO,IAAI,CAAC,eAAe,CAACpC,cAAcoC;YAC5C;YAGA,MAAMpC,aAAa,MAAM,CAAC6B;YAC1B,MAAMhG,SAAS,MAAMmE,aAAa,KAAK;YACvC,MAAMQ,aAAiC3E,QAAAA,SAAAA,KAAAA,IAAAA,OAAQ,MAAM;YACrD,IAAImE,aAAa,cAAc,IAC7B,OAAO;gBACL,QAAQQ;gBACR,UAAUR;YACZ;YAGF,MAAMrD,QAAQ6D,WAAW,OAAO,IAAI,EAAE;YACtCwB,SAAS,IAAI,IAAKxB,WAAW,QAAQ,IAAI,EAAE;YAE3C,IAAI6B;YACJ,IAAI;gBACFA,cAAc,MAAM,IAAI,CAAC,uBAAuB,CAAC1F,OAAOC;gBACxDoD,aAAa,MAAM,CAACqC,YAAY,KAAK;YACvC,EAAE,OAAOvG,OAAO;gBACd,OAAO,IAAI,CAAC,eAAe,CACzBkE,cACA,CAAC,4CAA4C,EAAElE,MAAM,SAAS,EAAEoF,KAAK,SAAS,CAC5EvE,QACC;YAEP;YAEA,MAAMqD,aAAa,KAAK;YACxB,IAAIA,aAAa,cAAc,IAC7B,OAAO;gBACL,QAAQxE;gBACR,UAAUwE;YACZ;YAEF,IAAIQ,QAAAA,aAAAA,KAAAA,IAAAA,WAAY,GAAG,EACjBuB,QAAQ,IAAI,CAACvB,WAAW,GAAG;YAG7B,IAAI,CAACA,WAAW,kCAAkC,EAAE;gBAClDqB,eAAe;gBACf;YACF;YACAA,eAAe,IAAI,CAAC,sBAAsB,CACxCD,YACAG,QAAQ,MAAM,GAAG,IAAI,CAAC,EAAE,EAAEA,QAAQ,IAAI,CAAC,SAAS,GAAGvG,QACnD4E;YAEF0B;QACF;QAEA,OAAO;YACL,QAAQ;gBACNE;YACF;YACA,UAAUhC;QACZ;IACF;IAEA,MAAM,aACJ4B,UAAkB,EAClBhF,IAEC,EAQD;QACA,MAAMoD,eAAe,IAAIC,qBAAAA,QAAQA,CAACC,AAAAA,IAAAA,qCAAAA,YAAAA,AAAAA,EAAa,UAAU0B,aAAa;YACpE,aAAa,IAAI,CAAC,mBAAmB;QACvC;QACA,IAAI,CAAC,mBAAmB,GAAG,EAAE;QAC7B,MAAMU,cAAc;QACpB,IAAIC,sBAAsB;QAC1B,MAAMC,kBAAkB;QAExB,MAAMR,WAAmC,EAAE;QAC3C,MAAO,CAACM,eAAeC,sBAAsBC,gBAAiB;YAC5DD;YACA,MAAMV,eACJ,IAAI,CAAC,kBAAkB,CAACD;YAC1B,MAAM5B,aAAa,MAAM,CAAC6B;YAC1B,MAAMhG,SAAS,MAAMmE,aAAa,KAAK;YACvC,IAAIA,aAAa,cAAc,IAC7B,OAAO;gBACL,QAAQxE;gBACR,UAAUwE;YACZ;YAEF,IAAI,CAACnE,QACH,MAAM,IAAI8C,MACR;YAGJ,MAAM,EAAEgD,MAAM,EAAE,GAAG9F;YACnB,MAAMc,QAAQgF,OAAO,OAAO;YAC5BK,SAAS,IAAI,IAAKL,OAAO,QAAQ,IAAI,EAAE;YACvC,IAAIU;YACJ,IAAI;gBACFA,cAAc,MAAM,IAAI,CAAC,uBAAuB,CAAC1F,OAAOC;gBACxDoD,aAAa,MAAM,CAACqC,YAAY,KAAK;YACvC,EAAE,OAAOvG,OAAO;gBACd,OAAO,IAAI,CAAC,eAAe,CACzBkE,cACA,CAAC,4CAA4C,EAAElE,MAAM,SAAS,EAAEoF,KAAK,SAAS,CAC5EvE,QACC;YAEP;YAEA,MAAMqD,aAAa,KAAK;YAExB,IAAIA,aAAa,cAAc,IAC7B,OAAO;gBACL,QAAQxE;gBACR,UAAUwE;YACZ;YAGF,IAAIrD,AAAkB,eAAlBA,KAAK,CAAC,EAAE,CAAC,IAAI,EACf;QAEJ;QACA,OAAO;YACL,QAAQ;gBACNqF;YACF;YACA,UAAUhC;QACZ;IACF;IAEA,MAAc,oBACZyC,IAA0D,EAC1DC,MAA2B,EAC3BC,GAA0B,EAC1BC,gBAAoC,EACP;QAC7B,MAAM5C,eAAe,IAAIC,qBAAAA,QAAQA,CAC/BC,AAAAA,IAAAA,qCAAAA,YAAAA,AAAAA,EACEuC,MACA,AAAkB,YAAlB,OAAOC,SAAsBA,SAASxB,KAAK,SAAS,CAACwB,UAEvD;YACE,aAAa,IAAI,CAAC,mBAAmB;QACvC;QAGF,MAAMG,YAA4C;YAChD,MAAM;YACN,SAASJ;YACT,QAAQ;YACR,OAAO;gBAEL,YAAYG,mBACP;oBACCF;oBACAE;gBACF,IACAF;YACN;YACA,UAAU,OAAOxG,OAAOgB;gBACtB,MAAM,EAAEZ,IAAI,EAAE,GAAGY;gBACjB,IAAII;gBACJ,MAAME,gBAAgC,CAACC;oBACrCH,cAAcG;gBAChB;gBACA,IAAI,CAAC,OAAO,CAAC,iBAAiB,GAAGD;gBAGjC,MAAMG,WAAWxC,KAAK,GAAG;gBACzB,MAAMC,cAAc,MAAM,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC;gBAC1DkB,KAAK,WAAW,GAAGlB;gBAEnB,MAAMwC,aAAoC;oBACxC,MAAM;oBACN,IAAID;oBACJ,YAAYvC,YAAY,gBAAgB;oBACxC,QAAQ;gBACV;gBACAkB,KAAK,QAAQ,GAAG;oBAACsB;iBAAW;gBAE5B,MAAMkF,mBAAmBL,AAAS,YAATA;gBACzB,IAAIM,cAAcL;gBAClB,IAAII,kBAAkB;oBACpB,MAAME,aAAaP,AAAS,aAATA,OAAoB,YAAYA;oBACnDM,cAAc;wBACZ,QAAQ,GAAGC,WAAW,EAAE,EAAEN,QAAQ;oBACpC;gBACF;gBAEA,MAAM,EAAEO,IAAI,EAAE1F,KAAK,EAAE2F,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CACzDH,aACAJ,KACAC;gBAGF,IAAIO,eAAeF;gBACnB,IAAIH,kBAAkB;oBACpBzF,IAAAA,6BAAAA,MAAAA,AAAAA,EAAO4F,AAAAA,CAAAA,QAAAA,OAAAA,KAAAA,IAAAA,KAAM,MAAM,AAAD,MAAMzH,QAAW;oBACnC2H,eAAgBF,KAAa,MAAM;gBACrC;gBAEA,OAAO;oBACL,QAAQE;oBACR,KAAK;wBAAE,MAAM7F;oBAAY;oBACzBC;oBACA2F;gBACF;YACF;QACF;QAEA,MAAMlD,aAAa,MAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC6C;QAC7D,MAAMhH,SAAS,MAAMmE,aAAa,KAAK;QAEvC,IAAI,CAACnE,QACH,MAAM,IAAI8C,MACR;QAIJ,MAAM,EAAEgD,MAAM,EAAEuB,OAAO,EAAE,GAAGrH;QAE5B,OAAO;YACL8F;YACAuB;YACA,UAAUlD;QACZ;IACF;IAEA,MAAM,MACJ0C,MAA2B,EAC3BC,GAA0B,EACA;QAC1B,OAAO,IAAI,CAAC,mBAAmB,CAAC,SAASD,QAAQC;IACnD;IAEA,MAAM,QACJS,MAAmB,EACnBT,GAA0B,EACS;QACnC,MAAM,EAAEU,UAAU,EAAET,gBAAgB,EAAE,GAAGU,AAAAA,IAAAA,kCAAAA,WAAAA,AAAAA,EAAYF;QACrD,OAAO,IAAI,CAAC,mBAAmB,CAC7B,WACAC,YACAV,KACAC;IAEJ;IAEA,MAAM,OACJQ,MAAmB,EACnBT,GAA0B,EACQ;QAClC,MAAM,EAAEU,UAAU,EAAET,gBAAgB,EAAE,GAAGU,AAAAA,IAAAA,kCAAAA,WAAAA,AAAAA,EAAYF;QACrD,OAAO,IAAI,CAAC,mBAAmB,CAC7B,UACAC,YACAV,KACAC;IAEJ;IAEA,MAAM,OACJQ,MAAmB,EACnBT,GAA0B,EACQ;QAClC,MAAM,EAAEU,UAAU,EAAET,gBAAgB,EAAE,GAAGU,AAAAA,IAAAA,kCAAAA,WAAAA,AAAAA,EAAYF;QACrD,OAAO,IAAI,CAAC,mBAAmB,CAC7B,UACAC,YACAV,KACAC;IAEJ;IAEA,MAAM,OACJ7D,SAAsB,EACtB4D,GAA0B,EACS;QACnC,MAAM,EAAEU,UAAU,EAAET,gBAAgB,EAAE,GAAGU,AAAAA,IAAAA,kCAAAA,WAAAA,AAAAA,EAAYvE;QACrD,OAAO,MAAM,IAAI,CAAC,mBAAmB,CACnC,UACAsE,YACAV,KACAC;IAEJ;IAWQ,0BACNW,mBAA+C,EAC/C;QACA,IAAIA,AAA6B,WAA7BA,oBAAoB,IAAI,EAAa;YAEvC,MAAMC,eAAe,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAClD,CAACtI,OAASA,AAAc,WAAdA,KAAK,IAAI;YAIrB,IAAIsI,aAAa,MAAM,IAAI,KAAKD,AAA6B,WAA7BA,oBAAoB,IAAI,EAAa;gBAEnE,MAAME,oBAAoB,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAC1D,CAACvI,OAASA,AAAc,WAAdA,KAAK,IAAI;gBAErB,IAAIuI,qBAAqB,GACvB,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAACA,mBAAmB;YAEvD;QACF;QAEA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAACF;IAChC;IAEA,MAAc,gBAAgBvD,YAAsB,EAAEoC,QAAgB,EAAE;QACtE,MAAMsB,YAAsD;YAC1D,MAAM;YACN,OAAO;gBACL,SAAStB;YACX;YACA,QAAQ;QACV;QACA,MAAM,EAAEvF,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAAC;YAAC6G;SAAU;QAChE,MAAM1D,aAAa,MAAM,CAAC,IAAI,CAAC,6BAA6B,CAACnD,KAAK,CAAC,EAAE;QACrE,MAAMmD,aAAa,KAAK;QAExB,OAAO;YACL,QAAQxE;YACR,UAAUwE;QACZ;IACF;IAEA,MAAM,QACJjB,SAAiB,EACjB4D,GAA+B,EACC;QAChC,MAAMgB,cAAc,CAAC,SAAS,EAAE5E,WAAW;QAC3C,MAAMiB,eAAe,IAAIC,qBAAAA,QAAQA,CAACC,AAAAA,IAAAA,qCAAAA,YAAAA,AAAAA,EAAa,WAAWyD,cAAc;YACtE,aAAa,IAAI,CAAC,mBAAmB;QACvC;QACA,MAAM,EAAEC,SAAS,EAAEC,eAAe,EAAE,GAAGlB;QAEvCtF,IAAAA,6BAAAA,MAAAA,AAAAA,EAAO0B,WAAW;QAClB1B,IAAAA,6BAAAA,MAAAA,AAAAA,EAAOuG,WAAW;QAClBvG,IAAAA,6BAAAA,MAAAA,AAAAA,EAAOwG,iBAAiB;QAExB,MAAMC,mBAAmB3I,KAAK,GAAG;QACjC,IAAIkF,YAAYlF,KAAK,GAAG;QACxB,IAAI4I,eAAe;QACnB,MAAO5I,KAAK,GAAG,KAAK2I,mBAAmBF,UAAW;YAChDvD,YAAYlF,KAAK,GAAG;YACpB,MAAM0D,aAAwD;gBAC5D,MAAM;gBACN,OAAO;oBACLE;gBACF;gBACA,QAAQ;YACV;YACA,MAAM,EAAE,OAAOiF,WAAW,EAAE,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAAC;gBAChEnF;aACD;YACD,MAAMmB,aAAa,MAAM,CACvB,IAAI,CAAC,6BAA6B,CAACgE,WAAW,CAAC,EAAE;YAEnD,MAAMnI,SAAS,MAAMmE,aAAa,KAAK;YAEvC,IAAI,CAACnE,QACH,MAAM,IAAI8C,MACR;YAIJ,MAAM,EAAEgD,MAAM,EAAE,GAAG9F;YAEnB,IAAI8F,QAAAA,SAAAA,KAAAA,IAAAA,OAAQ,IAAI,EACd,OAAO;gBACL,QAAQnG;gBACR,UAAUwE;YACZ;YAGF+D,eACEpC,AAAAA,CAAAA,QAAAA,SAAAA,KAAAA,IAAAA,OAAQ,OAAO,AAAD,KACd,CAAC,0CAA0C,EAAE5C,WAAW;YAC1D,MAAMkF,MAAM9I,KAAK,GAAG;YACpB,IAAI8I,MAAM5D,YAAYwD,iBAAiB;gBACrC,MAAMzC,gBAAgByC,kBAAmBI,CAAAA,MAAM5D,SAAQ;gBACvD,MAAM6D,YAAsD;oBAC1D,MAAM;oBACN,OAAO;wBACL,QAAQ9C;oBACV;oBACA,QAAQ;gBACV;gBACA,MAAM,EAAE,OAAO+C,UAAU,EAAE,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAAC;oBAC/DD;iBACD;gBACD,MAAMlE,aAAa,MAAM,CACvB,IAAI,CAAC,6BAA6B,CAACmE,UAAU,CAAC,EAAE;gBAElD,MAAMnE,aAAa,KAAK;YAC1B;QACF;QAEA,OAAO,IAAI,CAAC,eAAe,CACzBA,cACA,CAAC,iBAAiB,EAAE+D,cAAc;IAEtC;IA9qCA,YACEK,IAAa,EACbC,OAA8C,EAC9CzH,IAGC,CACD;QAjBF;QAEA;QAEA;QAEA,8CAAoD,EAAE;QAEtD;QAUE,IAAI,CAAC,IAAI,GAAGwH;QACZ,IAAI,CAAC,OAAO,GAAGC;QAEf,IAAI,CAAC,SAAS,GAAGzH,KAAK,SAAS;QAE/B,IAAI,CAAC,mBAAmB,GAAGA,QAAAA,OAAAA,KAAAA,IAAAA,KAAM,WAAW;IAC9C;AAiqCF"}
|
package/dist/lib/common/utils.js
CHANGED
|
@@ -238,7 +238,7 @@ function trimContextByViewport(execution) {
|
|
|
238
238
|
}) : execution.tasks
|
|
239
239
|
};
|
|
240
240
|
}
|
|
241
|
-
const getMidsceneVersion = ()=>"0.26.
|
|
241
|
+
const getMidsceneVersion = ()=>"0.26.4";
|
|
242
242
|
const parsePrompt = (prompt)=>{
|
|
243
243
|
if ('string' == typeof prompt) return {
|
|
244
244
|
textPrompt: prompt,
|
package/package.json
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"Browser use",
|
|
9
9
|
"Android use"
|
|
10
10
|
],
|
|
11
|
-
"version": "0.26.
|
|
11
|
+
"version": "0.26.4",
|
|
12
12
|
"repository": "https://github.com/web-infra-dev/midscene",
|
|
13
13
|
"homepage": "https://midscenejs.com/",
|
|
14
14
|
"main": "./dist/lib/index.js",
|
|
@@ -126,8 +126,8 @@
|
|
|
126
126
|
"semver": "7.5.2",
|
|
127
127
|
"socket.io": "^4.8.1",
|
|
128
128
|
"socket.io-client": "4.8.1",
|
|
129
|
-
"@midscene/core": "0.26.
|
|
130
|
-
"@midscene/shared": "0.26.
|
|
129
|
+
"@midscene/core": "0.26.4",
|
|
130
|
+
"@midscene/shared": "0.26.4"
|
|
131
131
|
},
|
|
132
132
|
"devDependencies": {
|
|
133
133
|
"@playwright/test": "^1.44.1",
|