@midscene/core 1.0.1-beta-20251103074550.0 → 1.0.1-beta-20251104075048.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/dist/es/agent/agent.mjs +67 -43
  2. package/dist/es/agent/agent.mjs.map +1 -1
  3. package/dist/es/agent/execution-session.mjs.map +1 -1
  4. package/dist/es/agent/task-builder.mjs +4 -4
  5. package/dist/es/agent/task-builder.mjs.map +1 -1
  6. package/dist/es/agent/tasks.mjs +27 -27
  7. package/dist/es/agent/tasks.mjs.map +1 -1
  8. package/dist/es/agent/ui-utils.mjs +5 -6
  9. package/dist/es/agent/ui-utils.mjs.map +1 -1
  10. package/dist/es/agent/utils.mjs +1 -1
  11. package/dist/es/service/index.mjs +1 -1
  12. package/dist/es/service/index.mjs.map +1 -1
  13. package/dist/es/task-runner.mjs +42 -7
  14. package/dist/es/task-runner.mjs.map +1 -1
  15. package/dist/es/types.mjs.map +1 -1
  16. package/dist/es/utils.mjs +2 -2
  17. package/dist/lib/agent/agent.js +66 -42
  18. package/dist/lib/agent/agent.js.map +1 -1
  19. package/dist/lib/agent/execution-session.js.map +1 -1
  20. package/dist/lib/agent/task-builder.js +4 -4
  21. package/dist/lib/agent/task-builder.js.map +1 -1
  22. package/dist/lib/agent/tasks.js +29 -26
  23. package/dist/lib/agent/tasks.js.map +1 -1
  24. package/dist/lib/agent/ui-utils.js +5 -6
  25. package/dist/lib/agent/ui-utils.js.map +1 -1
  26. package/dist/lib/agent/utils.js +1 -1
  27. package/dist/lib/service/index.js +1 -1
  28. package/dist/lib/service/index.js.map +1 -1
  29. package/dist/lib/task-runner.js +44 -6
  30. package/dist/lib/task-runner.js.map +1 -1
  31. package/dist/lib/types.js.map +1 -1
  32. package/dist/lib/utils.js +2 -2
  33. package/dist/types/agent/agent.d.ts +4 -2
  34. package/dist/types/agent/execution-session.d.ts +7 -4
  35. package/dist/types/agent/tasks.d.ts +7 -0
  36. package/dist/types/task-runner.d.ts +15 -3
  37. package/dist/types/types.d.ts +9 -2
  38. package/dist/types/yaml.d.ts +0 -1
  39. package/package.json +2 -2
@@ -159,10 +159,21 @@ class Agent {
159
159
  executions: [],
160
160
  modelBriefs: []
161
161
  };
162
+ this.executionDumpIndexByRunner = new WeakMap();
162
163
  return this.dump;
163
164
  }
164
- appendExecutionDump(execution) {
165
+ appendExecutionDump(execution, runner) {
165
166
  const currentDump = this.dump;
167
+ if (runner) {
168
+ const existingIndex = this.executionDumpIndexByRunner.get(runner);
169
+ if (void 0 !== existingIndex) {
170
+ currentDump.executions[existingIndex] = execution;
171
+ return;
172
+ }
173
+ currentDump.executions.push(execution);
174
+ this.executionDumpIndexByRunner.set(runner, currentDump.executions.length - 1);
175
+ return;
176
+ }
166
177
  currentDump.executions.push(execution);
167
178
  }
168
179
  dumpDataString() {
@@ -191,7 +202,7 @@ class Agent {
191
202
  const tip = param ? `${(0, external_ui_utils_js_namespaceObject.typeStr)(task)} - ${param}` : (0, external_ui_utils_js_namespaceObject.typeStr)(task);
192
203
  if (this.onTaskStartTip) await this.onTaskStartTip(tip);
193
204
  }
194
- async afterTaskRunning(runner, doNotThrowError = false) {
205
+ async handleRunnerAfterFlush(runner) {
195
206
  const executionDump = runner.dump();
196
207
  this.appendExecutionDump(executionDump);
197
208
  try {
@@ -200,12 +211,6 @@ class Agent {
200
211
  console.error('Error in onDumpUpdate', error);
201
212
  }
202
213
  this.writeOutActionDumps();
203
- if (runner.isInErrorState() && !doNotThrowError) {
204
- const errorTask = runner.latestErrorTask();
205
- throw new Error(`${null == errorTask ? void 0 : errorTask.errorMessage}\n${null == errorTask ? void 0 : errorTask.errorStack}`, {
206
- cause: null == errorTask ? void 0 : errorTask.error
207
- });
208
- }
209
214
  }
210
215
  wrapActionInActionSpace(name) {
211
216
  return async (param)=>await this.callActionInActionSpace(name, param);
@@ -224,7 +229,6 @@ class Agent {
224
229
  const title = (0, external_ui_utils_js_namespaceObject.taskTitleStr)(type, (0, external_ui_utils_js_namespaceObject.locateParamStr)((null == opt ? void 0 : opt.locate) || {}));
225
230
  const modelConfig = this.modelConfigManager.getModelConfig('grounding');
226
231
  const { output, runner } = await this.taskExecutor.runPlans(title, plans, modelConfig);
227
- await this.afterTaskRunning(runner);
228
232
  return output;
229
233
  }
230
234
  async aiTap(locatePrompt, opt) {
@@ -333,13 +337,12 @@ class Agent {
333
337
  const matchedCache = isVlmUiTars || false === cacheable ? void 0 : null == (_this_taskCache = this.taskCache) ? void 0 : _this_taskCache.matchPlanCache(taskPrompt);
334
338
  if (matchedCache && (null == (_this_taskCache1 = this.taskCache) ? void 0 : _this_taskCache1.isCacheResultUsed)) {
335
339
  var _matchedCache_cacheContent, _matchedCache_cacheContent1;
336
- const { runner } = await this.taskExecutor.loadYamlFlowAsPlanning(taskPrompt, null == (_matchedCache_cacheContent = matchedCache.cacheContent) ? void 0 : _matchedCache_cacheContent.yamlWorkflow);
337
- await this.afterTaskRunning(runner);
340
+ await this.taskExecutor.loadYamlFlowAsPlanning(taskPrompt, null == (_matchedCache_cacheContent = matchedCache.cacheContent) ? void 0 : _matchedCache_cacheContent.yamlWorkflow);
338
341
  debug('matched cache, will call .runYaml to run the action');
339
342
  const yaml = null == (_matchedCache_cacheContent1 = matchedCache.cacheContent) ? void 0 : _matchedCache_cacheContent1.yamlWorkflow;
340
343
  return this.runYaml(yaml);
341
344
  }
342
- const { output, runner } = await this.taskExecutor.action(taskPrompt, modelConfig, this.opts.aiActionContext, cacheable);
345
+ const { output } = await this.taskExecutor.action(taskPrompt, modelConfig, this.opts.aiActionContext, cacheable);
343
346
  if (this.taskCache && (null == output ? void 0 : output.yamlFlow) && false !== cacheable) {
344
347
  const yamlContent = {
345
348
  tasks: [
@@ -356,7 +359,6 @@ class Agent {
356
359
  yamlWorkflow: yamlFlowStr
357
360
  }, matchedCache);
358
361
  }
359
- await this.afterTaskRunning(runner);
360
362
  return output;
361
363
  }
362
364
  async aiAction(taskPrompt, opt) {
@@ -364,29 +366,25 @@ class Agent {
364
366
  }
365
367
  async aiQuery(demand, opt = defaultServiceExtractOption) {
366
368
  const modelConfig = this.modelConfigManager.getModelConfig('VQA');
367
- const { output, runner } = await this.taskExecutor.createTypeQueryExecution('Query', demand, modelConfig, opt);
368
- await this.afterTaskRunning(runner);
369
+ const { output } = await this.taskExecutor.createTypeQueryExecution('Query', demand, modelConfig, opt);
369
370
  return output;
370
371
  }
371
372
  async aiBoolean(prompt, opt = defaultServiceExtractOption) {
372
373
  const modelConfig = this.modelConfigManager.getModelConfig('VQA');
373
374
  const { textPrompt, multimodalPrompt } = (0, external_utils_js_namespaceObject_1.parsePrompt)(prompt);
374
- const { output, runner } = await this.taskExecutor.createTypeQueryExecution('Boolean', textPrompt, modelConfig, opt, multimodalPrompt);
375
- await this.afterTaskRunning(runner);
375
+ const { output } = await this.taskExecutor.createTypeQueryExecution('Boolean', textPrompt, modelConfig, opt, multimodalPrompt);
376
376
  return output;
377
377
  }
378
378
  async aiNumber(prompt, opt = defaultServiceExtractOption) {
379
379
  const modelConfig = this.modelConfigManager.getModelConfig('VQA');
380
380
  const { textPrompt, multimodalPrompt } = (0, external_utils_js_namespaceObject_1.parsePrompt)(prompt);
381
- const { output, runner } = await this.taskExecutor.createTypeQueryExecution('Number', textPrompt, modelConfig, opt, multimodalPrompt);
382
- await this.afterTaskRunning(runner);
381
+ const { output } = await this.taskExecutor.createTypeQueryExecution('Number', textPrompt, modelConfig, opt, multimodalPrompt);
383
382
  return output;
384
383
  }
385
384
  async aiString(prompt, opt = defaultServiceExtractOption) {
386
385
  const modelConfig = this.modelConfigManager.getModelConfig('VQA');
387
386
  const { textPrompt, multimodalPrompt } = (0, external_utils_js_namespaceObject_1.parsePrompt)(prompt);
388
- const { output, runner } = await this.taskExecutor.createTypeQueryExecution('String', textPrompt, modelConfig, opt, multimodalPrompt);
389
- await this.afterTaskRunning(runner);
387
+ const { output } = await this.taskExecutor.createTypeQueryExecution('String', textPrompt, modelConfig, opt, multimodalPrompt);
390
388
  return output;
391
389
  }
392
390
  async aiAsk(prompt, opt = defaultServiceExtractOption) {
@@ -444,8 +442,7 @@ class Agent {
444
442
  locatePlan
445
443
  ];
446
444
  const modelConfig = this.modelConfigManager.getModelConfig('grounding');
447
- const { runner, output } = await this.taskExecutor.runPlans((0, external_ui_utils_js_namespaceObject.taskTitleStr)('Locate', (0, external_ui_utils_js_namespaceObject.locateParamStr)(locateParam)), plans, modelConfig);
448
- await this.afterTaskRunning(runner);
445
+ const { output } = await this.taskExecutor.runPlans((0, external_ui_utils_js_namespaceObject.taskTitleStr)('Locate', (0, external_ui_utils_js_namespaceObject.locateParamStr)(locateParam)), plans, modelConfig);
449
446
  const { element } = output;
450
447
  const dprValue = await this.interface.size().dpr;
451
448
  const dprEntry = dprValue ? {
@@ -458,35 +455,49 @@ class Agent {
458
455
  };
459
456
  }
460
457
  async aiAssert(assertion, msg, opt) {
461
- var _runner_latestErrorTask;
462
458
  const modelConfig = this.modelConfigManager.getModelConfig('VQA');
463
459
  const serviceOpt = {
464
460
  domIncluded: (null == opt ? void 0 : opt.domIncluded) ?? defaultServiceExtractOption.domIncluded,
465
- screenshotIncluded: (null == opt ? void 0 : opt.screenshotIncluded) ?? defaultServiceExtractOption.screenshotIncluded,
466
- doNotThrowError: null == opt ? void 0 : opt.doNotThrowError
461
+ screenshotIncluded: (null == opt ? void 0 : opt.screenshotIncluded) ?? defaultServiceExtractOption.screenshotIncluded
467
462
  };
468
463
  const { textPrompt, multimodalPrompt } = (0, external_utils_js_namespaceObject_1.parsePrompt)(assertion);
469
- const { output, runner, thought } = await this.taskExecutor.createTypeQueryExecution('Assert', textPrompt, modelConfig, serviceOpt, multimodalPrompt);
470
- await this.afterTaskRunning(runner, true);
471
- const message = output ? void 0 : `Assertion failed: ${msg || ('string' == typeof assertion ? assertion : assertion.prompt)}\nReason: ${thought || (null == (_runner_latestErrorTask = runner.latestErrorTask()) ? void 0 : _runner_latestErrorTask.error) || '(no_reason)'}`;
472
- if (null == opt ? void 0 : opt.keepRawResponse) return {
473
- pass: output,
474
- thought,
475
- message
476
- };
477
- if (!output) throw new Error(message);
464
+ const assertionText = 'string' == typeof assertion ? assertion : assertion.prompt;
465
+ try {
466
+ const { output, thought } = await this.taskExecutor.createTypeQueryExecution('Assert', textPrompt, modelConfig, serviceOpt, multimodalPrompt);
467
+ const pass = Boolean(output);
468
+ const message = pass ? void 0 : `Assertion failed: ${msg || assertionText}\nReason: ${thought || '(no_reason)'}`;
469
+ if (null == opt ? void 0 : opt.keepRawResponse) return {
470
+ pass,
471
+ thought,
472
+ message
473
+ };
474
+ if (!pass) throw new Error(message);
475
+ } catch (error) {
476
+ if (error instanceof external_tasks_js_namespaceObject.TaskExecutionError) {
477
+ const errorTask = error.errorTask;
478
+ const thought = null == errorTask ? void 0 : errorTask.thought;
479
+ const rawError = null == errorTask ? void 0 : errorTask.error;
480
+ const rawMessage = (null == errorTask ? void 0 : errorTask.errorMessage) || (rawError instanceof Error ? rawError.message : rawError ? String(rawError) : void 0);
481
+ const reason = thought || rawMessage || '(no_reason)';
482
+ const message = `Assertion failed: ${msg || assertionText}\nReason: ${reason}`;
483
+ if (null == opt ? void 0 : opt.keepRawResponse) return {
484
+ pass: false,
485
+ thought,
486
+ message
487
+ };
488
+ throw new Error(message, {
489
+ cause: rawError ?? error
490
+ });
491
+ }
492
+ throw error;
493
+ }
478
494
  }
479
495
  async aiWaitFor(assertion, opt) {
480
496
  const modelConfig = this.modelConfigManager.getModelConfig('VQA');
481
- const { runner } = await this.taskExecutor.waitFor(assertion, {
497
+ await this.taskExecutor.waitFor(assertion, {
482
498
  timeoutMs: (null == opt ? void 0 : opt.timeoutMs) || 15000,
483
499
  checkIntervalMs: (null == opt ? void 0 : opt.checkIntervalMs) || 3000
484
500
  }, modelConfig);
485
- await this.afterTaskRunning(runner, true);
486
- if (runner.isInErrorState()) {
487
- const errorTask = runner.latestErrorTask();
488
- throw new Error(`${null == errorTask ? void 0 : errorTask.error}\n${null == errorTask ? void 0 : errorTask.errorStack}`);
489
- }
490
501
  }
491
502
  async ai(taskPrompt, type = 'action') {
492
503
  if ('action' === type) return this.aiAct(taskPrompt);
@@ -651,6 +662,7 @@ class Agent {
651
662
  _define_property(this, "hasWarnedNonVLModel", false);
652
663
  _define_property(this, "screenshotScale", void 0);
653
664
  _define_property(this, "screenshotScalePromise", void 0);
665
+ _define_property(this, "executionDumpIndexByRunner", new WeakMap());
654
666
  this.interface = interfaceInstance;
655
667
  this.opts = Object.assign({
656
668
  generateReport: true,
@@ -670,7 +682,19 @@ class Agent {
670
682
  this.taskExecutor = new external_tasks_js_namespaceObject.TaskExecutor(this.interface, this.service, {
671
683
  taskCache: this.taskCache,
672
684
  onTaskStart: this.callbackOnTaskStartTip.bind(this),
673
- replanningCycleLimit: this.opts.replanningCycleLimit
685
+ replanningCycleLimit: this.opts.replanningCycleLimit,
686
+ hooks: {
687
+ onTaskUpdate: (runner)=>{
688
+ const executionDump = runner.dump();
689
+ this.appendExecutionDump(executionDump, runner);
690
+ try {
691
+ if (this.onDumpUpdate) this.onDumpUpdate(this.dumpDataString());
692
+ } catch (error) {
693
+ console.error('Error in onDumpUpdate', error);
694
+ }
695
+ this.writeOutActionDumps();
696
+ }
697
+ }
674
698
  });
675
699
  this.dump = this.resetDump();
676
700
  this.reportFileName = (null == opts ? void 0 : opts.reportFileName) || (0, external_utils_js_namespaceObject_1.getReportFileName)((null == opts ? void 0 : opts.testId) || this.interface.interfaceType || 'web');
@@ -1 +1 @@
1
- {"version":3,"file":"agent/agent.js","sources":["webpack://@midscene/core/webpack/runtime/compat_get_default_export","webpack://@midscene/core/webpack/runtime/define_property_getters","webpack://@midscene/core/webpack/runtime/has_own_property","webpack://@midscene/core/webpack/runtime/make_namespace_object","webpack://@midscene/core/./src/agent/agent.ts"],"sourcesContent":["// getDefaultExport function for compatibility with non-ESM modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};\n","__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 {\n type ActionParam,\n type ActionReturn,\n type AgentAssertOpt,\n type AgentDescribeElementAtPointResult,\n type AgentOpt,\n type AgentWaitForOpt,\n type CacheConfig,\n type DeviceAction,\n type ExecutionDump,\n type ExecutionRecorderItem,\n type ExecutionTask,\n type ExecutionTaskLog,\n type GroupedActionDump,\n type LocateOption,\n type LocateResultElement,\n type LocateValidatorResult,\n type LocatorValidatorOption,\n type MidsceneYamlScript,\n type OnTaskStartTip,\n type PlanningAction,\n type Rect,\n type ScrollParam,\n Service,\n type ServiceAction,\n type ServiceExtractOption,\n type ServiceExtractParam,\n type TUserPrompt,\n type TaskRunner,\n type UIContext,\n} from '../index';\nexport type TestStatus =\n | 'passed'\n | 'failed'\n | 'timedOut'\n | 'skipped'\n | 'interrupted';\nimport yaml from 'js-yaml';\n\nimport {\n getVersion,\n groupedActionDumpFileExt,\n processCacheConfig,\n reportHTMLContent,\n stringifyDumpData,\n writeLogFile,\n} from '@/utils';\nimport {\n ScriptPlayer,\n buildDetailedLocateParam,\n parseYamlScript,\n} from '../yaml/index';\n\nimport type { AbstractInterface } from '@/device';\nimport {\n ModelConfigManager,\n globalModelConfigManager,\n} from '@midscene/shared/env';\nimport { imageInfoOfBase64, resizeImgBase64 } from '@midscene/shared/img';\nimport { getDebug } from '@midscene/shared/logger';\nimport { assert } from '@midscene/shared/utils';\n// import type { AndroidDeviceInputOpt } from '../device';\nimport { TaskCache } from './task-cache';\nimport { TaskExecutor, locatePlanForLocate } from './tasks';\nimport { locateParamStr, paramStr, taskTitleStr, typeStr } from './ui-utils';\nimport {\n commonContextParser,\n getReportFileName,\n parsePrompt,\n printReportMsg,\n} from './utils';\n\nconst debug = getDebug('agent');\n\nconst distanceOfTwoPoints = (p1: [number, number], p2: [number, number]) => {\n const [x1, y1] = p1;\n const [x2, y2] = p2;\n return Math.round(Math.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2));\n};\n\nconst includedInRect = (point: [number, number], rect: Rect) => {\n const [x, y] = point;\n const { left, top, width, height } = rect;\n return x >= left && x <= left + width && y >= top && y <= top + height;\n};\n\nconst defaultServiceExtractOption: ServiceExtractOption = {\n domIncluded: false,\n screenshotIncluded: true,\n};\n\ntype CacheStrategy = NonNullable<CacheConfig['strategy']>;\n\nconst CACHE_STRATEGIES: readonly CacheStrategy[] = [\n 'read-only',\n 'read-write',\n 'write-only',\n];\n\nconst isValidCacheStrategy = (strategy: string): strategy is CacheStrategy =>\n CACHE_STRATEGIES.some((value) => value === strategy);\n\nconst CACHE_STRATEGY_VALUES = CACHE_STRATEGIES.map(\n (value) => `\"${value}\"`,\n).join(', ');\n\nexport class Agent<\n InterfaceType extends AbstractInterface = AbstractInterface,\n> {\n interface: InterfaceType;\n\n service: Service;\n\n dump: GroupedActionDump;\n\n reportFile?: string | null;\n\n reportFileName?: string;\n\n taskExecutor: TaskExecutor;\n\n opts: AgentOpt;\n\n /**\n * If true, the agent will not perform any actions\n */\n dryMode = false;\n\n onTaskStartTip?: OnTaskStartTip;\n\n taskCache?: TaskCache;\n\n onDumpUpdate?: (dump: string) => void;\n\n destroyed = false;\n\n modelConfigManager: ModelConfigManager;\n\n /**\n * Frozen page context for consistent AI operations\n */\n private frozenUIContext?: UIContext;\n\n /**\n * Flag to track if VL model warning has been shown\n */\n private hasWarnedNonVLModel = false;\n\n /**\n * Screenshot scale factor derived from actual screenshot dimensions\n */\n private screenshotScale?: number;\n\n /**\n * Internal promise to deduplicate screenshot scale computation\n */\n private screenshotScalePromise?: Promise<number>;\n\n // @deprecated use .interface instead\n get page() {\n return this.interface;\n }\n\n /**\n * Ensures VL model warning is shown once when needed\n */\n private ensureVLModelWarning() {\n if (\n !this.hasWarnedNonVLModel &&\n this.interface.interfaceType !== 'puppeteer' &&\n this.interface.interfaceType !== 'playwright' &&\n this.interface.interfaceType !== 'static' &&\n this.interface.interfaceType !== 'chrome-extension-proxy' &&\n this.interface.interfaceType !== 'page-over-chrome-extension-bridge'\n ) {\n this.modelConfigManager.throwErrorIfNonVLModel();\n this.hasWarnedNonVLModel = true;\n }\n }\n\n /**\n * Lazily compute the ratio between the physical screenshot width and the logical page width\n */\n private async getScreenshotScale(context: UIContext): Promise<number> {\n if (this.screenshotScale !== undefined) {\n return this.screenshotScale;\n }\n\n if (!this.screenshotScalePromise) {\n this.screenshotScalePromise = (async () => {\n const pageWidth = context.size?.width;\n assert(\n pageWidth && pageWidth > 0,\n `Invalid page width when computing screenshot scale: ${pageWidth}`,\n );\n\n const { width: screenshotWidth } = await imageInfoOfBase64(\n context.screenshotBase64,\n );\n\n assert(\n Number.isFinite(screenshotWidth) && screenshotWidth > 0,\n `Invalid screenshot width when computing screenshot scale: ${screenshotWidth}`,\n );\n\n const computedScale = screenshotWidth / pageWidth;\n assert(\n Number.isFinite(computedScale) && computedScale > 0,\n `Invalid computed screenshot scale: ${computedScale}`,\n );\n\n debug(\n `Computed screenshot scale ${computedScale} from screenshot width ${screenshotWidth} and page width ${pageWidth}`,\n );\n return computedScale;\n })();\n }\n\n try {\n this.screenshotScale = await this.screenshotScalePromise;\n return this.screenshotScale;\n } finally {\n this.screenshotScalePromise = undefined;\n }\n }\n\n constructor(interfaceInstance: InterfaceType, opts?: AgentOpt) {\n this.interface = interfaceInstance;\n this.opts = Object.assign(\n {\n generateReport: true,\n autoPrintReportMsg: true,\n groupName: 'Midscene Report',\n groupDescription: '',\n },\n opts || {},\n );\n\n if (opts?.modelConfig && typeof opts?.modelConfig !== 'function') {\n throw new Error(\n `opts.modelConfig must be one of function or undefined, but got ${typeof opts?.modelConfig}`,\n );\n }\n this.modelConfigManager = opts?.modelConfig\n ? new ModelConfigManager(opts.modelConfig, opts?.createOpenAIClient)\n : globalModelConfigManager;\n\n this.onTaskStartTip = this.opts.onTaskStartTip;\n\n this.service = new Service(async () => {\n return this.getUIContext();\n });\n\n // Process cache configuration\n const cacheConfigObj = this.processCacheConfig(opts || {});\n if (cacheConfigObj) {\n this.taskCache = new TaskCache(\n cacheConfigObj.id,\n cacheConfigObj.enabled,\n undefined, // cacheFilePath\n {\n readOnly: cacheConfigObj.readOnly,\n writeOnly: cacheConfigObj.writeOnly,\n },\n );\n }\n\n this.taskExecutor = new TaskExecutor(this.interface, this.service, {\n taskCache: this.taskCache,\n onTaskStart: this.callbackOnTaskStartTip.bind(this),\n replanningCycleLimit: this.opts.replanningCycleLimit,\n });\n this.dump = this.resetDump();\n this.reportFileName =\n opts?.reportFileName ||\n getReportFileName(opts?.testId || this.interface.interfaceType || 'web');\n }\n\n async getActionSpace(): Promise<DeviceAction[]> {\n return this.interface.actionSpace();\n }\n\n async getUIContext(action?: ServiceAction): Promise<UIContext> {\n // Check VL model configuration when UI context is first needed\n this.ensureVLModelWarning();\n\n // If page context is frozen, return the frozen context for all actions\n if (this.frozenUIContext) {\n debug('Using frozen page context for action:', action);\n return this.frozenUIContext;\n }\n\n // Get original context\n let context: UIContext;\n if (this.interface.getContext) {\n debug('Using page.getContext for action:', action);\n context = await this.interface.getContext();\n } else {\n debug('Using commonContextParser for action:', action);\n context = await commonContextParser(this.interface, {\n uploadServerUrl: this.modelConfigManager.getUploadTestServerUrl(),\n });\n }\n\n const computedScreenshotScale = await this.getScreenshotScale(context);\n\n if (computedScreenshotScale !== 1) {\n const scaleForLog = Number.parseFloat(computedScreenshotScale.toFixed(4));\n debug(\n `Applying computed screenshot scale: ${scaleForLog} (resize to logical size)`,\n );\n const targetWidth = Math.round(context.size.width);\n const targetHeight = Math.round(context.size.height);\n debug(`Resizing screenshot to ${targetWidth}x${targetHeight}`);\n context.screenshotBase64 = await resizeImgBase64(\n context.screenshotBase64,\n { width: targetWidth, height: targetHeight },\n );\n } else {\n debug(`screenshot scale=${computedScreenshotScale}`);\n }\n\n return context;\n }\n\n async _snapshotContext(): Promise<UIContext> {\n return await this.getUIContext('locate');\n }\n\n async setAIActionContext(prompt: string) {\n if (this.opts.aiActionContext) {\n console.warn(\n 'aiActionContext is already set, and it is called again, will override the previous setting',\n );\n }\n this.opts.aiActionContext = prompt;\n }\n\n resetDump() {\n this.dump = {\n sdkVersion: getVersion(),\n groupName: this.opts.groupName!,\n groupDescription: this.opts.groupDescription,\n executions: [],\n modelBriefs: [],\n };\n\n return this.dump;\n }\n\n appendExecutionDump(execution: ExecutionDump) {\n const currentDump = this.dump;\n currentDump.executions.push(execution);\n }\n\n dumpDataString() {\n // update dump info\n this.dump.groupName = this.opts.groupName!;\n this.dump.groupDescription = this.opts.groupDescription;\n return stringifyDumpData(this.dump);\n }\n\n reportHTMLString() {\n return reportHTMLContent(this.dumpDataString());\n }\n\n writeOutActionDumps() {\n if (this.destroyed) {\n throw new Error(\n 'PageAgent has been destroyed. Cannot update report file.',\n );\n }\n const { generateReport, autoPrintReportMsg } = this.opts;\n this.reportFile = writeLogFile({\n fileName: this.reportFileName!,\n fileExt: groupedActionDumpFileExt,\n fileContent: this.dumpDataString(),\n type: 'dump',\n generateReport,\n });\n debug('writeOutActionDumps', this.reportFile);\n if (generateReport && autoPrintReportMsg && this.reportFile) {\n printReportMsg(this.reportFile);\n }\n }\n\n private async callbackOnTaskStartTip(task: ExecutionTask) {\n const param = paramStr(task);\n const tip = param ? `${typeStr(task)} - ${param}` : typeStr(task);\n\n if (this.onTaskStartTip) {\n await this.onTaskStartTip(tip);\n }\n }\n\n private async afterTaskRunning(runner: TaskRunner, doNotThrowError = false) {\n const executionDump = runner.dump();\n this.appendExecutionDump(executionDump);\n\n try {\n if (this.onDumpUpdate) {\n this.onDumpUpdate(this.dumpDataString());\n }\n } catch (error) {\n console.error('Error in onDumpUpdate', error);\n }\n\n this.writeOutActionDumps();\n\n if (runner.isInErrorState() && !doNotThrowError) {\n const errorTask = runner.latestErrorTask();\n throw new Error(`${errorTask?.errorMessage}\\n${errorTask?.errorStack}`, {\n cause: errorTask?.error,\n });\n }\n }\n\n wrapActionInActionSpace<T extends DeviceAction>(\n name: string,\n ): (param: ActionParam<T>) => Promise<ActionReturn<T>> {\n return async (param: ActionParam<T>) => {\n return await this.callActionInActionSpace<ActionReturn<T>>(name, param);\n };\n }\n\n async callActionInActionSpace<T = any>(\n type: string,\n opt?: T, // and all other action params\n ) {\n debug('callActionInActionSpace', type, ',', opt);\n\n const actionPlan: PlanningAction<T> = {\n type: type as any,\n param: (opt as any) || {},\n thought: '',\n };\n debug('actionPlan', actionPlan); // , ', in which the locateParam is', locateParam);\n\n const plans: PlanningAction[] = [actionPlan].filter(\n Boolean,\n ) as PlanningAction[];\n\n const title = taskTitleStr(\n type as any,\n locateParamStr((opt as any)?.locate || {}),\n );\n\n // assume all operation in action space is related to locating\n const modelConfig = this.modelConfigManager.getModelConfig('grounding');\n\n const { output, runner } = await this.taskExecutor.runPlans(\n title,\n plans,\n modelConfig,\n );\n await this.afterTaskRunning(runner);\n return output;\n }\n\n async aiTap(locatePrompt: TUserPrompt, opt?: LocateOption) {\n assert(locatePrompt, 'missing locate prompt for tap');\n\n const detailedLocateParam = buildDetailedLocateParam(locatePrompt, opt);\n\n return this.callActionInActionSpace('Tap', {\n locate: detailedLocateParam,\n });\n }\n\n async aiRightClick(locatePrompt: TUserPrompt, opt?: LocateOption) {\n assert(locatePrompt, 'missing locate prompt for right click');\n\n const detailedLocateParam = buildDetailedLocateParam(locatePrompt, opt);\n\n return this.callActionInActionSpace('RightClick', {\n locate: detailedLocateParam,\n });\n }\n\n async aiDoubleClick(locatePrompt: TUserPrompt, opt?: LocateOption) {\n assert(locatePrompt, 'missing locate prompt for double click');\n\n const detailedLocateParam = buildDetailedLocateParam(locatePrompt, opt);\n\n return this.callActionInActionSpace('DoubleClick', {\n locate: detailedLocateParam,\n });\n }\n\n async aiHover(locatePrompt: TUserPrompt, opt?: LocateOption) {\n assert(locatePrompt, 'missing locate prompt for hover');\n\n const detailedLocateParam = buildDetailedLocateParam(locatePrompt, opt);\n\n return this.callActionInActionSpace('Hover', {\n locate: detailedLocateParam,\n });\n }\n\n // New signature, always use locatePrompt as the first param\n async aiInput(\n locatePrompt: TUserPrompt,\n opt: LocateOption & { value: string | number } & {\n autoDismissKeyboard?: boolean;\n } & { mode?: 'replace' | 'clear' | 'append' },\n ): Promise<any>;\n\n // Legacy signature - deprecated\n /**\n * @deprecated Use aiInput(locatePrompt, opt) instead where opt contains the value\n */\n async aiInput(\n value: string | number,\n locatePrompt: TUserPrompt,\n opt?: LocateOption & { autoDismissKeyboard?: boolean } & {\n mode?: 'replace' | 'clear' | 'append';\n }, // AndroidDeviceInputOpt &\n ): Promise<any>;\n\n // Implementation\n async aiInput(\n locatePromptOrValue: TUserPrompt | string | number,\n locatePromptOrOpt:\n | TUserPrompt\n | (LocateOption & { value: string | number } & {\n autoDismissKeyboard?: boolean;\n } & { mode?: 'replace' | 'clear' | 'append' }) // AndroidDeviceInputOpt &\n | undefined,\n optOrUndefined?: LocateOption, // AndroidDeviceInputOpt &\n ) {\n let value: string | number;\n let locatePrompt: TUserPrompt;\n let opt:\n | (LocateOption & { value: string | number } & {\n autoDismissKeyboard?: boolean;\n } & { mode?: 'replace' | 'clear' | 'append' }) // AndroidDeviceInputOpt &\n | undefined;\n\n // Check if using new signature (first param is locatePrompt, second has value)\n if (\n typeof locatePromptOrOpt === 'object' &&\n locatePromptOrOpt !== null &&\n 'value' in locatePromptOrOpt\n ) {\n // New signature: aiInput(locatePrompt, opt)\n locatePrompt = locatePromptOrValue as TUserPrompt;\n const optWithValue = locatePromptOrOpt as LocateOption & {\n // AndroidDeviceInputOpt &\n value: string | number;\n autoDismissKeyboard?: boolean;\n };\n value = optWithValue.value;\n opt = optWithValue;\n } else {\n // Legacy signature: aiInput(value, locatePrompt, opt)\n value = locatePromptOrValue as string | number;\n locatePrompt = locatePromptOrOpt as TUserPrompt;\n opt = {\n ...optOrUndefined,\n value,\n };\n }\n\n assert(\n typeof value === 'string' || typeof value === 'number',\n 'input value must be a string or number, use empty string if you want to clear the input',\n );\n assert(locatePrompt, 'missing locate prompt for input');\n\n const detailedLocateParam = buildDetailedLocateParam(locatePrompt, opt);\n\n // Convert value to string to ensure consistency\n const stringValue = typeof value === 'number' ? String(value) : value;\n\n return this.callActionInActionSpace('Input', {\n ...(opt || {}),\n value: stringValue,\n locate: detailedLocateParam,\n });\n }\n\n // New signature\n async aiKeyboardPress(\n locatePrompt: TUserPrompt,\n opt: LocateOption & { keyName: string },\n ): Promise<any>;\n\n // Legacy signature - deprecated\n /**\n * @deprecated Use aiKeyboardPress(locatePrompt, opt) instead where opt contains the keyName\n */\n async aiKeyboardPress(\n keyName: string,\n locatePrompt?: TUserPrompt,\n opt?: LocateOption,\n ): Promise<any>;\n\n // Implementation\n async aiKeyboardPress(\n locatePromptOrKeyName: TUserPrompt | string,\n locatePromptOrOpt:\n | TUserPrompt\n | (LocateOption & { keyName: string })\n | undefined,\n optOrUndefined?: LocateOption,\n ) {\n let keyName: string;\n let locatePrompt: TUserPrompt | undefined;\n let opt: (LocateOption & { keyName: string }) | undefined;\n\n // Check if using new signature (first param is locatePrompt, second has keyName)\n if (\n typeof locatePromptOrOpt === 'object' &&\n locatePromptOrOpt !== null &&\n 'keyName' in locatePromptOrOpt\n ) {\n // New signature: aiKeyboardPress(locatePrompt, opt)\n locatePrompt = locatePromptOrKeyName as TUserPrompt;\n opt = locatePromptOrOpt as LocateOption & {\n keyName: string;\n };\n } else {\n // Legacy signature: aiKeyboardPress(keyName, locatePrompt, opt)\n keyName = locatePromptOrKeyName as string;\n locatePrompt = locatePromptOrOpt as TUserPrompt | undefined;\n opt = {\n ...(optOrUndefined || {}),\n keyName,\n };\n }\n\n assert(opt?.keyName, 'missing keyName for keyboard press');\n\n const detailedLocateParam = locatePrompt\n ? buildDetailedLocateParam(locatePrompt, opt)\n : undefined;\n\n return this.callActionInActionSpace('KeyboardPress', {\n ...(opt || {}),\n locate: detailedLocateParam,\n });\n }\n\n // New signature\n async aiScroll(\n locatePrompt: TUserPrompt | undefined,\n opt: LocateOption & ScrollParam,\n ): Promise<any>;\n\n // Legacy signature - deprecated\n /**\n * @deprecated Use aiScroll(locatePrompt, opt) instead where opt contains the scroll parameters\n */\n async aiScroll(\n scrollParam: ScrollParam,\n locatePrompt?: TUserPrompt,\n opt?: LocateOption,\n ): Promise<any>;\n\n // Implementation\n async aiScroll(\n locatePromptOrScrollParam: TUserPrompt | ScrollParam | undefined,\n locatePromptOrOpt: TUserPrompt | (LocateOption & ScrollParam) | undefined,\n optOrUndefined?: LocateOption,\n ) {\n let scrollParam: ScrollParam;\n let locatePrompt: TUserPrompt | undefined;\n let opt: LocateOption | undefined;\n\n // Check if using new signature (first param is locatePrompt, second has scroll params)\n if (\n typeof locatePromptOrOpt === 'object' &&\n ('direction' in locatePromptOrOpt ||\n 'scrollType' in locatePromptOrOpt ||\n 'distance' in locatePromptOrOpt)\n ) {\n // New signature: aiScroll(locatePrompt, opt)\n locatePrompt = locatePromptOrScrollParam as TUserPrompt;\n opt = locatePromptOrOpt as LocateOption & ScrollParam;\n } else {\n // Legacy signature: aiScroll(scrollParam, locatePrompt, opt)\n scrollParam = locatePromptOrScrollParam as ScrollParam;\n locatePrompt = locatePromptOrOpt as TUserPrompt | undefined;\n opt = {\n ...(optOrUndefined || {}),\n ...(scrollParam || {}),\n };\n }\n\n const detailedLocateParam = buildDetailedLocateParam(\n locatePrompt || '',\n opt,\n );\n\n return this.callActionInActionSpace('Scroll', {\n ...(opt || {}),\n locate: detailedLocateParam,\n });\n }\n\n async aiAct(\n taskPrompt: string,\n opt?: {\n cacheable?: boolean;\n },\n ) {\n const modelConfig = this.modelConfigManager.getModelConfig('planning');\n\n const cacheable = opt?.cacheable;\n // if vlm-ui-tars, plan cache is not used\n const isVlmUiTars = modelConfig.vlMode === 'vlm-ui-tars';\n const matchedCache =\n isVlmUiTars || cacheable === false\n ? undefined\n : this.taskCache?.matchPlanCache(taskPrompt);\n if (matchedCache && this.taskCache?.isCacheResultUsed) {\n // log into report file\n const { runner } = await this.taskExecutor.loadYamlFlowAsPlanning(\n taskPrompt,\n matchedCache.cacheContent?.yamlWorkflow,\n );\n\n await this.afterTaskRunning(runner);\n\n debug('matched cache, will call .runYaml to run the action');\n const yaml = matchedCache.cacheContent?.yamlWorkflow;\n return this.runYaml(yaml);\n }\n\n const { output, runner } = await this.taskExecutor.action(\n taskPrompt,\n modelConfig,\n this.opts.aiActionContext,\n cacheable,\n );\n\n // update cache\n if (this.taskCache && output?.yamlFlow && cacheable !== false) {\n const yamlContent: MidsceneYamlScript = {\n tasks: [\n {\n name: taskPrompt,\n flow: output.yamlFlow,\n },\n ],\n };\n const yamlFlowStr = yaml.dump(yamlContent);\n this.taskCache.updateOrAppendCacheRecord(\n {\n type: 'plan',\n prompt: taskPrompt,\n yamlWorkflow: yamlFlowStr,\n },\n matchedCache,\n );\n }\n\n await this.afterTaskRunning(runner);\n return output;\n }\n\n /**\n * @deprecated Use {@link Agent.aiAct} instead.\n */\n async aiAction(\n taskPrompt: string,\n opt?: {\n cacheable?: boolean;\n },\n ) {\n return this.aiAct(taskPrompt, opt);\n }\n\n async aiQuery<ReturnType = any>(\n demand: ServiceExtractParam,\n opt: ServiceExtractOption = defaultServiceExtractOption,\n ): Promise<ReturnType> {\n const modelConfig = this.modelConfigManager.getModelConfig('VQA');\n const { output, runner } = await this.taskExecutor.createTypeQueryExecution(\n 'Query',\n demand,\n modelConfig,\n opt,\n );\n await this.afterTaskRunning(runner);\n return output as ReturnType;\n }\n\n async aiBoolean(\n prompt: TUserPrompt,\n opt: ServiceExtractOption = defaultServiceExtractOption,\n ): Promise<boolean> {\n const modelConfig = this.modelConfigManager.getModelConfig('VQA');\n\n const { textPrompt, multimodalPrompt } = parsePrompt(prompt);\n const { output, runner } = await this.taskExecutor.createTypeQueryExecution(\n 'Boolean',\n textPrompt,\n modelConfig,\n opt,\n multimodalPrompt,\n );\n await this.afterTaskRunning(runner);\n return output as boolean;\n }\n\n async aiNumber(\n prompt: TUserPrompt,\n opt: ServiceExtractOption = defaultServiceExtractOption,\n ): Promise<number> {\n const modelConfig = this.modelConfigManager.getModelConfig('VQA');\n\n const { textPrompt, multimodalPrompt } = parsePrompt(prompt);\n const { output, runner } = await this.taskExecutor.createTypeQueryExecution(\n 'Number',\n textPrompt,\n modelConfig,\n opt,\n multimodalPrompt,\n );\n await this.afterTaskRunning(runner);\n return output as number;\n }\n\n async aiString(\n prompt: TUserPrompt,\n opt: ServiceExtractOption = defaultServiceExtractOption,\n ): Promise<string> {\n const modelConfig = this.modelConfigManager.getModelConfig('VQA');\n\n const { textPrompt, multimodalPrompt } = parsePrompt(prompt);\n const { output, runner } = await this.taskExecutor.createTypeQueryExecution(\n 'String',\n textPrompt,\n modelConfig,\n opt,\n multimodalPrompt,\n );\n await this.afterTaskRunning(runner);\n return output as string;\n }\n\n async aiAsk(\n prompt: TUserPrompt,\n opt: ServiceExtractOption = defaultServiceExtractOption,\n ): Promise<string> {\n return this.aiString(prompt, opt);\n }\n\n async describeElementAtPoint(\n center: [number, number],\n opt?: {\n verifyPrompt?: boolean;\n retryLimit?: number;\n deepThink?: boolean;\n } & LocatorValidatorOption,\n ): Promise<AgentDescribeElementAtPointResult> {\n const { verifyPrompt = true, retryLimit = 3 } = opt || {};\n\n let success = false;\n let retryCount = 0;\n let resultPrompt = '';\n let deepThink = opt?.deepThink || false;\n let verifyResult: LocateValidatorResult | undefined;\n\n while (!success && retryCount < retryLimit) {\n if (retryCount >= 2) {\n deepThink = true;\n }\n debug(\n 'aiDescribe',\n center,\n 'verifyPrompt',\n verifyPrompt,\n 'retryCount',\n retryCount,\n 'deepThink',\n deepThink,\n );\n // use same intent as aiLocate\n const modelConfig = this.modelConfigManager.getModelConfig('grounding');\n\n const text = await this.service.describe(center, modelConfig, {\n deepThink,\n });\n debug('aiDescribe text', text);\n assert(text.description, `failed to describe element at [${center}]`);\n resultPrompt = text.description;\n\n verifyResult = await this.verifyLocator(\n resultPrompt,\n deepThink ? { deepThink: true } : undefined,\n center,\n opt,\n );\n if (verifyResult.pass) {\n success = true;\n } else {\n retryCount++;\n }\n }\n\n return {\n prompt: resultPrompt,\n deepThink,\n verifyResult,\n };\n }\n\n async verifyLocator(\n prompt: string,\n locateOpt: LocateOption | undefined,\n expectCenter: [number, number],\n verifyLocateOption?: LocatorValidatorOption,\n ): Promise<LocateValidatorResult> {\n debug('verifyLocator', prompt, locateOpt, expectCenter, verifyLocateOption);\n\n const { center: verifyCenter, rect: verifyRect } = await this.aiLocate(\n prompt,\n locateOpt,\n );\n const distance = distanceOfTwoPoints(expectCenter, verifyCenter);\n const included = includedInRect(expectCenter, verifyRect);\n const pass =\n distance <= (verifyLocateOption?.centerDistanceThreshold || 20) ||\n included;\n const verifyResult = {\n pass,\n rect: verifyRect,\n center: verifyCenter,\n centerDistance: distance,\n };\n debug('aiDescribe verifyResult', verifyResult);\n return verifyResult;\n }\n\n async aiLocate(prompt: TUserPrompt, opt?: LocateOption) {\n const locateParam = buildDetailedLocateParam(prompt, opt);\n assert(locateParam, 'cannot get locate param for aiLocate');\n const locatePlan = locatePlanForLocate(locateParam);\n const plans = [locatePlan];\n const modelConfig = this.modelConfigManager.getModelConfig('grounding');\n\n const { runner, output } = await this.taskExecutor.runPlans(\n taskTitleStr('Locate', locateParamStr(locateParam)),\n plans,\n modelConfig,\n );\n await this.afterTaskRunning(runner);\n\n const { element } = output;\n\n const dprValue = await (this.interface.size() as any).dpr;\n const dprEntry = dprValue\n ? {\n dpr: dprValue,\n }\n : {};\n return {\n rect: element?.rect,\n center: element?.center,\n ...dprEntry,\n } as Pick<LocateResultElement, 'rect' | 'center'> & {\n dpr?: number; // this field is deprecated\n };\n }\n\n async aiAssert(\n assertion: TUserPrompt,\n msg?: string,\n opt?: AgentAssertOpt & ServiceExtractOption,\n ) {\n const modelConfig = this.modelConfigManager.getModelConfig('VQA');\n\n const serviceOpt: ServiceExtractOption = {\n domIncluded: opt?.domIncluded ?? defaultServiceExtractOption.domIncluded,\n screenshotIncluded:\n opt?.screenshotIncluded ??\n defaultServiceExtractOption.screenshotIncluded,\n doNotThrowError: opt?.doNotThrowError,\n };\n\n const { textPrompt, multimodalPrompt } = parsePrompt(assertion);\n\n const { output, runner, thought } =\n await this.taskExecutor.createTypeQueryExecution<boolean>(\n 'Assert',\n textPrompt,\n modelConfig,\n serviceOpt,\n multimodalPrompt,\n );\n await this.afterTaskRunning(runner, true);\n\n const message = output\n ? undefined\n : `Assertion failed: ${msg || (typeof assertion === 'string' ? assertion : assertion.prompt)}\\nReason: ${\n thought || runner.latestErrorTask()?.error || '(no_reason)'\n }`;\n\n if (opt?.keepRawResponse) {\n return {\n pass: output,\n thought,\n message,\n };\n }\n\n if (!output) {\n throw new Error(message);\n }\n }\n\n async aiWaitFor(assertion: TUserPrompt, opt?: AgentWaitForOpt) {\n const modelConfig = this.modelConfigManager.getModelConfig('VQA');\n const { runner } = await this.taskExecutor.waitFor(\n assertion,\n {\n timeoutMs: opt?.timeoutMs || 15 * 1000,\n checkIntervalMs: opt?.checkIntervalMs || 3 * 1000,\n },\n modelConfig,\n );\n await this.afterTaskRunning(runner, true);\n\n if (runner.isInErrorState()) {\n const errorTask = runner.latestErrorTask();\n throw new Error(`${errorTask?.error}\\n${errorTask?.errorStack}`);\n }\n }\n\n async ai(taskPrompt: string, type = 'action') {\n if (type === 'action') {\n return this.aiAct(taskPrompt);\n }\n if (type === 'query') {\n return this.aiQuery(taskPrompt);\n }\n\n if (type === 'assert') {\n return this.aiAssert(taskPrompt);\n }\n\n if (type === 'tap') {\n return this.aiTap(taskPrompt);\n }\n\n if (type === 'rightClick') {\n return this.aiRightClick(taskPrompt);\n }\n\n if (type === 'doubleClick') {\n return this.aiDoubleClick(taskPrompt);\n }\n\n throw new Error(\n `Unknown type: ${type}, only support 'action', 'query', 'assert', 'tap', 'rightClick', 'doubleClick'`,\n );\n }\n\n async runYaml(yamlScriptContent: string): Promise<{\n result: Record<string, any>;\n }> {\n const script = parseYamlScript(yamlScriptContent, 'yaml');\n const player = new ScriptPlayer(script, async () => {\n return { agent: this, freeFn: [] };\n });\n await player.run();\n\n if (player.status === 'error') {\n const errors = player.taskStatusList\n .filter((task) => task.status === 'error')\n .map((task) => {\n return `task - ${task.name}: ${task.error?.message}`;\n })\n .join('\\n');\n throw new Error(`Error(s) occurred in running yaml script:\\n${errors}`);\n }\n\n return {\n result: player.result,\n };\n }\n\n async evaluateJavaScript(script: string) {\n assert(\n this.interface.evaluateJavaScript,\n 'evaluateJavaScript is not supported in current agent',\n );\n return this.interface.evaluateJavaScript(script);\n }\n\n async destroy() {\n // Early return if already destroyed\n if (this.destroyed) {\n return;\n }\n\n await this.interface.destroy?.();\n this.resetDump(); // reset dump to release memory\n this.destroyed = true;\n }\n\n async recordToReport(\n title?: string,\n opt?: {\n content: string;\n },\n ) {\n // 1. screenshot\n const base64 = await this.interface.screenshotBase64();\n const now = Date.now();\n // 2. build recorder\n const recorder: ExecutionRecorderItem[] = [\n {\n type: 'screenshot',\n ts: now,\n screenshot: base64,\n },\n ];\n // 3. build ExecutionTaskLog\n const task: ExecutionTaskLog = {\n type: 'Log',\n subType: 'Screenshot',\n status: 'finished',\n recorder,\n timing: {\n start: now,\n end: now,\n cost: 0,\n },\n param: {\n content: opt?.content || '',\n },\n executor: async () => {},\n };\n // 4. build ExecutionDump\n const executionDump: ExecutionDump = {\n logTime: now,\n name: `Log - ${title || 'untitled'}`,\n description: opt?.content || '',\n tasks: [task],\n };\n // 5. append to execution dump\n this.appendExecutionDump(executionDump);\n\n try {\n this.onDumpUpdate?.(this.dumpDataString());\n } catch (error) {\n console.error('Failed to update dump', error);\n }\n\n this.writeOutActionDumps();\n }\n\n /**\n * @deprecated Use {@link Agent.recordToReport} instead.\n */\n async logScreenshot(\n title?: string,\n opt?: {\n content: string;\n },\n ) {\n await this.recordToReport(title, opt);\n }\n\n _unstableLogContent() {\n const { groupName, groupDescription, executions } = this.dump;\n const newExecutions = Array.isArray(executions)\n ? executions.map((execution: any) => {\n const { tasks, ...restExecution } = execution;\n let newTasks = tasks;\n if (Array.isArray(tasks)) {\n newTasks = tasks.map((task: any) => {\n // only remove uiContext and log from task\n const { uiContext, log, ...restTask } = task;\n return restTask;\n });\n }\n return { ...restExecution, ...(newTasks ? { tasks: newTasks } : {}) };\n })\n : [];\n return {\n groupName,\n groupDescription,\n executions: newExecutions,\n };\n }\n\n /**\n * Freezes the current page context to be reused in subsequent AI operations\n * This avoids recalculating page context for each operation\n */\n async freezePageContext(): Promise<void> {\n debug('Freezing page context');\n const context = await this._snapshotContext();\n // Mark the context as frozen\n context._isFrozen = true;\n this.frozenUIContext = context;\n debug('Page context frozen successfully');\n }\n\n /**\n * Unfreezes the page context, allowing AI operations to calculate context dynamically\n */\n async unfreezePageContext(): Promise<void> {\n debug('Unfreezing page context');\n this.frozenUIContext = undefined;\n debug('Page context unfrozen successfully');\n }\n\n /**\n * Process cache configuration and return normalized cache settings\n */\n private processCacheConfig(opts: AgentOpt): {\n id: string;\n enabled: boolean;\n readOnly: boolean;\n writeOnly: boolean;\n } | null {\n // Validate original cache config before processing\n // Agent requires explicit IDs - don't allow auto-generation\n if (opts.cache === true) {\n throw new Error(\n 'cache: true requires an explicit cache ID. Please provide:\\n' +\n 'Example: cache: { id: \"my-cache-id\" }',\n );\n }\n\n // Check if cache config object is missing ID\n if (\n opts.cache &&\n typeof opts.cache === 'object' &&\n opts.cache !== null &&\n !opts.cache.id\n ) {\n throw new Error(\n 'cache configuration requires an explicit id.\\n' +\n 'Example: cache: { id: \"my-cache-id\" }',\n );\n }\n\n // Use the unified utils function to process cache configuration\n const cacheConfig = processCacheConfig(\n opts.cache,\n opts.cacheId || opts.testId || 'default',\n );\n\n if (!cacheConfig) {\n return null;\n }\n\n // Handle cache configuration object\n if (typeof cacheConfig === 'object' && cacheConfig !== null) {\n const id = cacheConfig.id;\n const rawStrategy = cacheConfig.strategy as unknown;\n let strategyValue: string;\n\n if (rawStrategy === undefined) {\n strategyValue = 'read-write';\n } else if (typeof rawStrategy === 'string') {\n strategyValue = rawStrategy;\n } else {\n throw new Error(\n `cache.strategy must be a string when provided, but received type ${typeof rawStrategy}`,\n );\n }\n\n if (!isValidCacheStrategy(strategyValue)) {\n throw new Error(\n `cache.strategy must be one of ${CACHE_STRATEGY_VALUES}, but received \"${strategyValue}\"`,\n );\n }\n\n const isReadOnly = strategyValue === 'read-only';\n const isWriteOnly = strategyValue === 'write-only';\n\n return {\n id,\n enabled: !isWriteOnly,\n readOnly: isReadOnly,\n writeOnly: isWriteOnly,\n };\n }\n\n return null;\n }\n\n /**\n * Manually flush cache to file\n * @param options - Optional configuration\n * @param options.cleanUnused - If true, removes unused cache records before flushing\n */\n async flushCache(options?: { cleanUnused?: boolean }): Promise<void> {\n if (!this.taskCache) {\n throw new Error('Cache is not configured');\n }\n\n this.taskCache.flushCacheToFile(options);\n }\n}\n\nexport const createAgent = (\n interfaceInstance: AbstractInterface,\n opts?: AgentOpt,\n) => {\n return new Agent(interfaceInstance, opts);\n};\n"],"names":["__webpack_require__","module","getter","definition","key","Object","obj","prop","Symbol","debug","getDebug","distanceOfTwoPoints","p1","p2","x1","y1","x2","y2","Math","includedInRect","point","rect","x","y","left","top","width","height","defaultServiceExtractOption","CACHE_STRATEGIES","isValidCacheStrategy","strategy","value","CACHE_STRATEGY_VALUES","Agent","context","undefined","_context_size","pageWidth","assert","screenshotWidth","imageInfoOfBase64","Number","computedScale","action","commonContextParser","computedScreenshotScale","scaleForLog","targetWidth","targetHeight","resizeImgBase64","prompt","console","getVersion","execution","currentDump","stringifyDumpData","reportHTMLContent","Error","generateReport","autoPrintReportMsg","writeLogFile","groupedActionDumpFileExt","printReportMsg","task","param","paramStr","tip","typeStr","runner","doNotThrowError","executionDump","error","errorTask","name","type","opt","actionPlan","plans","Boolean","title","taskTitleStr","locateParamStr","modelConfig","output","locatePrompt","detailedLocateParam","buildDetailedLocateParam","locatePromptOrValue","locatePromptOrOpt","optOrUndefined","optWithValue","stringValue","String","locatePromptOrKeyName","keyName","locatePromptOrScrollParam","scrollParam","taskPrompt","_this_taskCache","_this_taskCache1","cacheable","isVlmUiTars","matchedCache","_matchedCache_cacheContent","_matchedCache_cacheContent1","yaml","yamlContent","yamlFlowStr","demand","textPrompt","multimodalPrompt","parsePrompt","center","verifyPrompt","retryLimit","success","retryCount","resultPrompt","deepThink","verifyResult","text","locateOpt","expectCenter","verifyLocateOption","verifyCenter","verifyRect","distance","included","pass","locateParam","locatePlan","locatePlanForLocate","element","dprValue","dprEntry","assertion","msg","_runner_latestErrorTask","serviceOpt","thought","message","yamlScriptContent","script","parseYamlScript","player","ScriptPlayer","errors","_task_error","_this_interface","base64","now","Date","recorder","_this","groupName","groupDescription","executions","newExecutions","Array","tasks","restExecution","newTasks","uiContext","log","restTask","opts","cacheConfig","processCacheConfig","id","rawStrategy","strategyValue","isReadOnly","isWriteOnly","options","interfaceInstance","ModelConfigManager","globalModelConfigManager","Service","cacheConfigObj","TaskCache","TaskExecutor","getReportFileName","createAgent"],"mappings":"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"}
1
+ {"version":3,"file":"agent/agent.js","sources":["webpack://@midscene/core/webpack/runtime/compat_get_default_export","webpack://@midscene/core/webpack/runtime/define_property_getters","webpack://@midscene/core/webpack/runtime/has_own_property","webpack://@midscene/core/webpack/runtime/make_namespace_object","webpack://@midscene/core/./src/agent/agent.ts"],"sourcesContent":["// getDefaultExport function for compatibility with non-ESM modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};\n","__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 {\n type ActionParam,\n type ActionReturn,\n type AgentAssertOpt,\n type AgentDescribeElementAtPointResult,\n type AgentOpt,\n type AgentWaitForOpt,\n type CacheConfig,\n type DeviceAction,\n type ExecutionDump,\n type ExecutionRecorderItem,\n type ExecutionTask,\n type ExecutionTaskLog,\n type GroupedActionDump,\n type LocateOption,\n type LocateResultElement,\n type LocateValidatorResult,\n type LocatorValidatorOption,\n type MidsceneYamlScript,\n type OnTaskStartTip,\n type PlanningAction,\n type Rect,\n type ScrollParam,\n Service,\n type ServiceAction,\n type ServiceExtractOption,\n type ServiceExtractParam,\n type TUserPrompt,\n type UIContext,\n} from '../index';\nexport type TestStatus =\n | 'passed'\n | 'failed'\n | 'timedOut'\n | 'skipped'\n | 'interrupted';\nimport yaml from 'js-yaml';\n\nimport {\n getVersion,\n groupedActionDumpFileExt,\n processCacheConfig,\n reportHTMLContent,\n stringifyDumpData,\n writeLogFile,\n} from '@/utils';\nimport {\n ScriptPlayer,\n buildDetailedLocateParam,\n parseYamlScript,\n} from '../yaml/index';\n\nimport type { AbstractInterface } from '@/device';\nimport type { TaskRunner } from '@/task-runner';\nimport {\n ModelConfigManager,\n globalModelConfigManager,\n} from '@midscene/shared/env';\nimport { imageInfoOfBase64, resizeImgBase64 } from '@midscene/shared/img';\nimport { getDebug } from '@midscene/shared/logger';\nimport { assert } from '@midscene/shared/utils';\n// import type { AndroidDeviceInputOpt } from '../device';\nimport { TaskCache } from './task-cache';\nimport { TaskExecutionError, TaskExecutor, locatePlanForLocate } from './tasks';\nimport { locateParamStr, paramStr, taskTitleStr, typeStr } from './ui-utils';\nimport {\n commonContextParser,\n getReportFileName,\n parsePrompt,\n printReportMsg,\n} from './utils';\n\nconst debug = getDebug('agent');\n\nconst distanceOfTwoPoints = (p1: [number, number], p2: [number, number]) => {\n const [x1, y1] = p1;\n const [x2, y2] = p2;\n return Math.round(Math.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2));\n};\n\nconst includedInRect = (point: [number, number], rect: Rect) => {\n const [x, y] = point;\n const { left, top, width, height } = rect;\n return x >= left && x <= left + width && y >= top && y <= top + height;\n};\n\nconst defaultServiceExtractOption: ServiceExtractOption = {\n domIncluded: false,\n screenshotIncluded: true,\n};\n\ntype CacheStrategy = NonNullable<CacheConfig['strategy']>;\n\nconst CACHE_STRATEGIES: readonly CacheStrategy[] = [\n 'read-only',\n 'read-write',\n 'write-only',\n];\n\nconst isValidCacheStrategy = (strategy: string): strategy is CacheStrategy =>\n CACHE_STRATEGIES.some((value) => value === strategy);\n\nconst CACHE_STRATEGY_VALUES = CACHE_STRATEGIES.map(\n (value) => `\"${value}\"`,\n).join(', ');\n\nexport class Agent<\n InterfaceType extends AbstractInterface = AbstractInterface,\n> {\n interface: InterfaceType;\n\n service: Service;\n\n dump: GroupedActionDump;\n\n reportFile?: string | null;\n\n reportFileName?: string;\n\n taskExecutor: TaskExecutor;\n\n opts: AgentOpt;\n\n /**\n * If true, the agent will not perform any actions\n */\n dryMode = false;\n\n onTaskStartTip?: OnTaskStartTip;\n\n taskCache?: TaskCache;\n\n onDumpUpdate?: (dump: string) => void;\n\n destroyed = false;\n\n modelConfigManager: ModelConfigManager;\n\n /**\n * Frozen page context for consistent AI operations\n */\n private frozenUIContext?: UIContext;\n\n /**\n * Flag to track if VL model warning has been shown\n */\n private hasWarnedNonVLModel = false;\n\n /**\n * Screenshot scale factor derived from actual screenshot dimensions\n */\n private screenshotScale?: number;\n\n /**\n * Internal promise to deduplicate screenshot scale computation\n */\n private screenshotScalePromise?: Promise<number>;\n\n private executionDumpIndexByRunner = new WeakMap<TaskRunner, number>();\n\n // @deprecated use .interface instead\n get page() {\n return this.interface;\n }\n\n /**\n * Ensures VL model warning is shown once when needed\n */\n private ensureVLModelWarning() {\n if (\n !this.hasWarnedNonVLModel &&\n this.interface.interfaceType !== 'puppeteer' &&\n this.interface.interfaceType !== 'playwright' &&\n this.interface.interfaceType !== 'static' &&\n this.interface.interfaceType !== 'chrome-extension-proxy' &&\n this.interface.interfaceType !== 'page-over-chrome-extension-bridge'\n ) {\n this.modelConfigManager.throwErrorIfNonVLModel();\n this.hasWarnedNonVLModel = true;\n }\n }\n\n /**\n * Lazily compute the ratio between the physical screenshot width and the logical page width\n */\n private async getScreenshotScale(context: UIContext): Promise<number> {\n if (this.screenshotScale !== undefined) {\n return this.screenshotScale;\n }\n\n if (!this.screenshotScalePromise) {\n this.screenshotScalePromise = (async () => {\n const pageWidth = context.size?.width;\n assert(\n pageWidth && pageWidth > 0,\n `Invalid page width when computing screenshot scale: ${pageWidth}`,\n );\n\n const { width: screenshotWidth } = await imageInfoOfBase64(\n context.screenshotBase64,\n );\n\n assert(\n Number.isFinite(screenshotWidth) && screenshotWidth > 0,\n `Invalid screenshot width when computing screenshot scale: ${screenshotWidth}`,\n );\n\n const computedScale = screenshotWidth / pageWidth;\n assert(\n Number.isFinite(computedScale) && computedScale > 0,\n `Invalid computed screenshot scale: ${computedScale}`,\n );\n\n debug(\n `Computed screenshot scale ${computedScale} from screenshot width ${screenshotWidth} and page width ${pageWidth}`,\n );\n return computedScale;\n })();\n }\n\n try {\n this.screenshotScale = await this.screenshotScalePromise;\n return this.screenshotScale;\n } finally {\n this.screenshotScalePromise = undefined;\n }\n }\n\n constructor(interfaceInstance: InterfaceType, opts?: AgentOpt) {\n this.interface = interfaceInstance;\n this.opts = Object.assign(\n {\n generateReport: true,\n autoPrintReportMsg: true,\n groupName: 'Midscene Report',\n groupDescription: '',\n },\n opts || {},\n );\n\n if (opts?.modelConfig && typeof opts?.modelConfig !== 'function') {\n throw new Error(\n `opts.modelConfig must be one of function or undefined, but got ${typeof opts?.modelConfig}`,\n );\n }\n this.modelConfigManager = opts?.modelConfig\n ? new ModelConfigManager(opts.modelConfig, opts?.createOpenAIClient)\n : globalModelConfigManager;\n\n this.onTaskStartTip = this.opts.onTaskStartTip;\n\n this.service = new Service(async () => {\n return this.getUIContext();\n });\n\n // Process cache configuration\n const cacheConfigObj = this.processCacheConfig(opts || {});\n if (cacheConfigObj) {\n this.taskCache = new TaskCache(\n cacheConfigObj.id,\n cacheConfigObj.enabled,\n undefined, // cacheFilePath\n {\n readOnly: cacheConfigObj.readOnly,\n writeOnly: cacheConfigObj.writeOnly,\n },\n );\n }\n\n this.taskExecutor = new TaskExecutor(this.interface, this.service, {\n taskCache: this.taskCache,\n onTaskStart: this.callbackOnTaskStartTip.bind(this),\n replanningCycleLimit: this.opts.replanningCycleLimit,\n hooks: {\n onTaskUpdate: (runner) => {\n const executionDump = runner.dump();\n this.appendExecutionDump(executionDump, runner);\n\n try {\n if (this.onDumpUpdate) {\n this.onDumpUpdate(this.dumpDataString());\n }\n } catch (error) {\n console.error('Error in onDumpUpdate', error);\n }\n\n this.writeOutActionDumps();\n },\n },\n });\n this.dump = this.resetDump();\n this.reportFileName =\n opts?.reportFileName ||\n getReportFileName(opts?.testId || this.interface.interfaceType || 'web');\n }\n\n async getActionSpace(): Promise<DeviceAction[]> {\n return this.interface.actionSpace();\n }\n\n async getUIContext(action?: ServiceAction): Promise<UIContext> {\n // Check VL model configuration when UI context is first needed\n this.ensureVLModelWarning();\n\n // If page context is frozen, return the frozen context for all actions\n if (this.frozenUIContext) {\n debug('Using frozen page context for action:', action);\n return this.frozenUIContext;\n }\n\n // Get original context\n let context: UIContext;\n if (this.interface.getContext) {\n debug('Using page.getContext for action:', action);\n context = await this.interface.getContext();\n } else {\n debug('Using commonContextParser for action:', action);\n context = await commonContextParser(this.interface, {\n uploadServerUrl: this.modelConfigManager.getUploadTestServerUrl(),\n });\n }\n\n const computedScreenshotScale = await this.getScreenshotScale(context);\n\n if (computedScreenshotScale !== 1) {\n const scaleForLog = Number.parseFloat(computedScreenshotScale.toFixed(4));\n debug(\n `Applying computed screenshot scale: ${scaleForLog} (resize to logical size)`,\n );\n const targetWidth = Math.round(context.size.width);\n const targetHeight = Math.round(context.size.height);\n debug(`Resizing screenshot to ${targetWidth}x${targetHeight}`);\n context.screenshotBase64 = await resizeImgBase64(\n context.screenshotBase64,\n { width: targetWidth, height: targetHeight },\n );\n } else {\n debug(`screenshot scale=${computedScreenshotScale}`);\n }\n\n return context;\n }\n\n async _snapshotContext(): Promise<UIContext> {\n return await this.getUIContext('locate');\n }\n\n async setAIActionContext(prompt: string) {\n if (this.opts.aiActionContext) {\n console.warn(\n 'aiActionContext is already set, and it is called again, will override the previous setting',\n );\n }\n this.opts.aiActionContext = prompt;\n }\n\n resetDump() {\n this.dump = {\n sdkVersion: getVersion(),\n groupName: this.opts.groupName!,\n groupDescription: this.opts.groupDescription,\n executions: [],\n modelBriefs: [],\n };\n this.executionDumpIndexByRunner = new WeakMap<TaskRunner, number>();\n\n return this.dump;\n }\n\n appendExecutionDump(execution: ExecutionDump, runner?: TaskRunner) {\n const currentDump = this.dump;\n if (runner) {\n const existingIndex = this.executionDumpIndexByRunner.get(runner);\n if (existingIndex !== undefined) {\n currentDump.executions[existingIndex] = execution;\n return;\n }\n currentDump.executions.push(execution);\n this.executionDumpIndexByRunner.set(\n runner,\n currentDump.executions.length - 1,\n );\n return;\n }\n currentDump.executions.push(execution);\n }\n\n dumpDataString() {\n // update dump info\n this.dump.groupName = this.opts.groupName!;\n this.dump.groupDescription = this.opts.groupDescription;\n return stringifyDumpData(this.dump);\n }\n\n reportHTMLString() {\n return reportHTMLContent(this.dumpDataString());\n }\n\n writeOutActionDumps() {\n if (this.destroyed) {\n throw new Error(\n 'PageAgent has been destroyed. Cannot update report file.',\n );\n }\n const { generateReport, autoPrintReportMsg } = this.opts;\n this.reportFile = writeLogFile({\n fileName: this.reportFileName!,\n fileExt: groupedActionDumpFileExt,\n fileContent: this.dumpDataString(),\n type: 'dump',\n generateReport,\n });\n debug('writeOutActionDumps', this.reportFile);\n if (generateReport && autoPrintReportMsg && this.reportFile) {\n printReportMsg(this.reportFile);\n }\n }\n\n private async callbackOnTaskStartTip(task: ExecutionTask) {\n const param = paramStr(task);\n const tip = param ? `${typeStr(task)} - ${param}` : typeStr(task);\n\n if (this.onTaskStartTip) {\n await this.onTaskStartTip(tip);\n }\n }\n\n private async handleRunnerAfterFlush(runner: TaskRunner) {\n const executionDump = runner.dump();\n this.appendExecutionDump(executionDump);\n\n try {\n if (this.onDumpUpdate) {\n this.onDumpUpdate(this.dumpDataString());\n }\n } catch (error) {\n console.error('Error in onDumpUpdate', error);\n }\n\n this.writeOutActionDumps();\n }\n\n wrapActionInActionSpace<T extends DeviceAction>(\n name: string,\n ): (param: ActionParam<T>) => Promise<ActionReturn<T>> {\n return async (param: ActionParam<T>) => {\n return await this.callActionInActionSpace<ActionReturn<T>>(name, param);\n };\n }\n\n async callActionInActionSpace<T = any>(\n type: string,\n opt?: T, // and all other action params\n ) {\n debug('callActionInActionSpace', type, ',', opt);\n\n const actionPlan: PlanningAction<T> = {\n type: type as any,\n param: (opt as any) || {},\n thought: '',\n };\n debug('actionPlan', actionPlan); // , ', in which the locateParam is', locateParam);\n\n const plans: PlanningAction[] = [actionPlan].filter(\n Boolean,\n ) as PlanningAction[];\n\n const title = taskTitleStr(\n type as any,\n locateParamStr((opt as any)?.locate || {}),\n );\n\n // assume all operation in action space is related to locating\n const modelConfig = this.modelConfigManager.getModelConfig('grounding');\n\n const { output, runner } = await this.taskExecutor.runPlans(\n title,\n plans,\n modelConfig,\n );\n return output;\n }\n\n async aiTap(locatePrompt: TUserPrompt, opt?: LocateOption) {\n assert(locatePrompt, 'missing locate prompt for tap');\n\n const detailedLocateParam = buildDetailedLocateParam(locatePrompt, opt);\n\n return this.callActionInActionSpace('Tap', {\n locate: detailedLocateParam,\n });\n }\n\n async aiRightClick(locatePrompt: TUserPrompt, opt?: LocateOption) {\n assert(locatePrompt, 'missing locate prompt for right click');\n\n const detailedLocateParam = buildDetailedLocateParam(locatePrompt, opt);\n\n return this.callActionInActionSpace('RightClick', {\n locate: detailedLocateParam,\n });\n }\n\n async aiDoubleClick(locatePrompt: TUserPrompt, opt?: LocateOption) {\n assert(locatePrompt, 'missing locate prompt for double click');\n\n const detailedLocateParam = buildDetailedLocateParam(locatePrompt, opt);\n\n return this.callActionInActionSpace('DoubleClick', {\n locate: detailedLocateParam,\n });\n }\n\n async aiHover(locatePrompt: TUserPrompt, opt?: LocateOption) {\n assert(locatePrompt, 'missing locate prompt for hover');\n\n const detailedLocateParam = buildDetailedLocateParam(locatePrompt, opt);\n\n return this.callActionInActionSpace('Hover', {\n locate: detailedLocateParam,\n });\n }\n\n // New signature, always use locatePrompt as the first param\n async aiInput(\n locatePrompt: TUserPrompt,\n opt: LocateOption & { value: string | number } & {\n autoDismissKeyboard?: boolean;\n } & { mode?: 'replace' | 'clear' | 'append' },\n ): Promise<any>;\n\n // Legacy signature - deprecated\n /**\n * @deprecated Use aiInput(locatePrompt, opt) instead where opt contains the value\n */\n async aiInput(\n value: string | number,\n locatePrompt: TUserPrompt,\n opt?: LocateOption & { autoDismissKeyboard?: boolean } & {\n mode?: 'replace' | 'clear' | 'append';\n }, // AndroidDeviceInputOpt &\n ): Promise<any>;\n\n // Implementation\n async aiInput(\n locatePromptOrValue: TUserPrompt | string | number,\n locatePromptOrOpt:\n | TUserPrompt\n | (LocateOption & { value: string | number } & {\n autoDismissKeyboard?: boolean;\n } & { mode?: 'replace' | 'clear' | 'append' }) // AndroidDeviceInputOpt &\n | undefined,\n optOrUndefined?: LocateOption, // AndroidDeviceInputOpt &\n ) {\n let value: string | number;\n let locatePrompt: TUserPrompt;\n let opt:\n | (LocateOption & { value: string | number } & {\n autoDismissKeyboard?: boolean;\n } & { mode?: 'replace' | 'clear' | 'append' }) // AndroidDeviceInputOpt &\n | undefined;\n\n // Check if using new signature (first param is locatePrompt, second has value)\n if (\n typeof locatePromptOrOpt === 'object' &&\n locatePromptOrOpt !== null &&\n 'value' in locatePromptOrOpt\n ) {\n // New signature: aiInput(locatePrompt, opt)\n locatePrompt = locatePromptOrValue as TUserPrompt;\n const optWithValue = locatePromptOrOpt as LocateOption & {\n // AndroidDeviceInputOpt &\n value: string | number;\n autoDismissKeyboard?: boolean;\n };\n value = optWithValue.value;\n opt = optWithValue;\n } else {\n // Legacy signature: aiInput(value, locatePrompt, opt)\n value = locatePromptOrValue as string | number;\n locatePrompt = locatePromptOrOpt as TUserPrompt;\n opt = {\n ...optOrUndefined,\n value,\n };\n }\n\n assert(\n typeof value === 'string' || typeof value === 'number',\n 'input value must be a string or number, use empty string if you want to clear the input',\n );\n assert(locatePrompt, 'missing locate prompt for input');\n\n const detailedLocateParam = buildDetailedLocateParam(locatePrompt, opt);\n\n // Convert value to string to ensure consistency\n const stringValue = typeof value === 'number' ? String(value) : value;\n\n return this.callActionInActionSpace('Input', {\n ...(opt || {}),\n value: stringValue,\n locate: detailedLocateParam,\n });\n }\n\n // New signature\n async aiKeyboardPress(\n locatePrompt: TUserPrompt,\n opt: LocateOption & { keyName: string },\n ): Promise<any>;\n\n // Legacy signature - deprecated\n /**\n * @deprecated Use aiKeyboardPress(locatePrompt, opt) instead where opt contains the keyName\n */\n async aiKeyboardPress(\n keyName: string,\n locatePrompt?: TUserPrompt,\n opt?: LocateOption,\n ): Promise<any>;\n\n // Implementation\n async aiKeyboardPress(\n locatePromptOrKeyName: TUserPrompt | string,\n locatePromptOrOpt:\n | TUserPrompt\n | (LocateOption & { keyName: string })\n | undefined,\n optOrUndefined?: LocateOption,\n ) {\n let keyName: string;\n let locatePrompt: TUserPrompt | undefined;\n let opt: (LocateOption & { keyName: string }) | undefined;\n\n // Check if using new signature (first param is locatePrompt, second has keyName)\n if (\n typeof locatePromptOrOpt === 'object' &&\n locatePromptOrOpt !== null &&\n 'keyName' in locatePromptOrOpt\n ) {\n // New signature: aiKeyboardPress(locatePrompt, opt)\n locatePrompt = locatePromptOrKeyName as TUserPrompt;\n opt = locatePromptOrOpt as LocateOption & {\n keyName: string;\n };\n } else {\n // Legacy signature: aiKeyboardPress(keyName, locatePrompt, opt)\n keyName = locatePromptOrKeyName as string;\n locatePrompt = locatePromptOrOpt as TUserPrompt | undefined;\n opt = {\n ...(optOrUndefined || {}),\n keyName,\n };\n }\n\n assert(opt?.keyName, 'missing keyName for keyboard press');\n\n const detailedLocateParam = locatePrompt\n ? buildDetailedLocateParam(locatePrompt, opt)\n : undefined;\n\n return this.callActionInActionSpace('KeyboardPress', {\n ...(opt || {}),\n locate: detailedLocateParam,\n });\n }\n\n // New signature\n async aiScroll(\n locatePrompt: TUserPrompt | undefined,\n opt: LocateOption & ScrollParam,\n ): Promise<any>;\n\n // Legacy signature - deprecated\n /**\n * @deprecated Use aiScroll(locatePrompt, opt) instead where opt contains the scroll parameters\n */\n async aiScroll(\n scrollParam: ScrollParam,\n locatePrompt?: TUserPrompt,\n opt?: LocateOption,\n ): Promise<any>;\n\n // Implementation\n async aiScroll(\n locatePromptOrScrollParam: TUserPrompt | ScrollParam | undefined,\n locatePromptOrOpt: TUserPrompt | (LocateOption & ScrollParam) | undefined,\n optOrUndefined?: LocateOption,\n ) {\n let scrollParam: ScrollParam;\n let locatePrompt: TUserPrompt | undefined;\n let opt: LocateOption | undefined;\n\n // Check if using new signature (first param is locatePrompt, second has scroll params)\n if (\n typeof locatePromptOrOpt === 'object' &&\n ('direction' in locatePromptOrOpt ||\n 'scrollType' in locatePromptOrOpt ||\n 'distance' in locatePromptOrOpt)\n ) {\n // New signature: aiScroll(locatePrompt, opt)\n locatePrompt = locatePromptOrScrollParam as TUserPrompt;\n opt = locatePromptOrOpt as LocateOption & ScrollParam;\n } else {\n // Legacy signature: aiScroll(scrollParam, locatePrompt, opt)\n scrollParam = locatePromptOrScrollParam as ScrollParam;\n locatePrompt = locatePromptOrOpt as TUserPrompt | undefined;\n opt = {\n ...(optOrUndefined || {}),\n ...(scrollParam || {}),\n };\n }\n\n const detailedLocateParam = buildDetailedLocateParam(\n locatePrompt || '',\n opt,\n );\n\n return this.callActionInActionSpace('Scroll', {\n ...(opt || {}),\n locate: detailedLocateParam,\n });\n }\n\n async aiAct(\n taskPrompt: string,\n opt?: {\n cacheable?: boolean;\n },\n ) {\n const modelConfig = this.modelConfigManager.getModelConfig('planning');\n\n const cacheable = opt?.cacheable;\n // if vlm-ui-tars, plan cache is not used\n const isVlmUiTars = modelConfig.vlMode === 'vlm-ui-tars';\n const matchedCache =\n isVlmUiTars || cacheable === false\n ? undefined\n : this.taskCache?.matchPlanCache(taskPrompt);\n if (matchedCache && this.taskCache?.isCacheResultUsed) {\n // log into report file\n await this.taskExecutor.loadYamlFlowAsPlanning(\n taskPrompt,\n matchedCache.cacheContent?.yamlWorkflow,\n );\n\n debug('matched cache, will call .runYaml to run the action');\n const yaml = matchedCache.cacheContent?.yamlWorkflow;\n return this.runYaml(yaml);\n }\n\n const { output } = await this.taskExecutor.action(\n taskPrompt,\n modelConfig,\n this.opts.aiActionContext,\n cacheable,\n );\n\n // update cache\n if (this.taskCache && output?.yamlFlow && cacheable !== false) {\n const yamlContent: MidsceneYamlScript = {\n tasks: [\n {\n name: taskPrompt,\n flow: output.yamlFlow,\n },\n ],\n };\n const yamlFlowStr = yaml.dump(yamlContent);\n this.taskCache.updateOrAppendCacheRecord(\n {\n type: 'plan',\n prompt: taskPrompt,\n yamlWorkflow: yamlFlowStr,\n },\n matchedCache,\n );\n }\n\n return output;\n }\n\n /**\n * @deprecated Use {@link Agent.aiAct} instead.\n */\n async aiAction(\n taskPrompt: string,\n opt?: {\n cacheable?: boolean;\n },\n ) {\n return this.aiAct(taskPrompt, opt);\n }\n\n async aiQuery<ReturnType = any>(\n demand: ServiceExtractParam,\n opt: ServiceExtractOption = defaultServiceExtractOption,\n ): Promise<ReturnType> {\n const modelConfig = this.modelConfigManager.getModelConfig('VQA');\n const { output } = await this.taskExecutor.createTypeQueryExecution(\n 'Query',\n demand,\n modelConfig,\n opt,\n );\n return output as ReturnType;\n }\n\n async aiBoolean(\n prompt: TUserPrompt,\n opt: ServiceExtractOption = defaultServiceExtractOption,\n ): Promise<boolean> {\n const modelConfig = this.modelConfigManager.getModelConfig('VQA');\n\n const { textPrompt, multimodalPrompt } = parsePrompt(prompt);\n const { output } = await this.taskExecutor.createTypeQueryExecution(\n 'Boolean',\n textPrompt,\n modelConfig,\n opt,\n multimodalPrompt,\n );\n return output as boolean;\n }\n\n async aiNumber(\n prompt: TUserPrompt,\n opt: ServiceExtractOption = defaultServiceExtractOption,\n ): Promise<number> {\n const modelConfig = this.modelConfigManager.getModelConfig('VQA');\n\n const { textPrompt, multimodalPrompt } = parsePrompt(prompt);\n const { output } = await this.taskExecutor.createTypeQueryExecution(\n 'Number',\n textPrompt,\n modelConfig,\n opt,\n multimodalPrompt,\n );\n return output as number;\n }\n\n async aiString(\n prompt: TUserPrompt,\n opt: ServiceExtractOption = defaultServiceExtractOption,\n ): Promise<string> {\n const modelConfig = this.modelConfigManager.getModelConfig('VQA');\n\n const { textPrompt, multimodalPrompt } = parsePrompt(prompt);\n const { output } = await this.taskExecutor.createTypeQueryExecution(\n 'String',\n textPrompt,\n modelConfig,\n opt,\n multimodalPrompt,\n );\n return output as string;\n }\n\n async aiAsk(\n prompt: TUserPrompt,\n opt: ServiceExtractOption = defaultServiceExtractOption,\n ): Promise<string> {\n return this.aiString(prompt, opt);\n }\n\n async describeElementAtPoint(\n center: [number, number],\n opt?: {\n verifyPrompt?: boolean;\n retryLimit?: number;\n deepThink?: boolean;\n } & LocatorValidatorOption,\n ): Promise<AgentDescribeElementAtPointResult> {\n const { verifyPrompt = true, retryLimit = 3 } = opt || {};\n\n let success = false;\n let retryCount = 0;\n let resultPrompt = '';\n let deepThink = opt?.deepThink || false;\n let verifyResult: LocateValidatorResult | undefined;\n\n while (!success && retryCount < retryLimit) {\n if (retryCount >= 2) {\n deepThink = true;\n }\n debug(\n 'aiDescribe',\n center,\n 'verifyPrompt',\n verifyPrompt,\n 'retryCount',\n retryCount,\n 'deepThink',\n deepThink,\n );\n // use same intent as aiLocate\n const modelConfig = this.modelConfigManager.getModelConfig('grounding');\n\n const text = await this.service.describe(center, modelConfig, {\n deepThink,\n });\n debug('aiDescribe text', text);\n assert(text.description, `failed to describe element at [${center}]`);\n resultPrompt = text.description;\n\n verifyResult = await this.verifyLocator(\n resultPrompt,\n deepThink ? { deepThink: true } : undefined,\n center,\n opt,\n );\n if (verifyResult.pass) {\n success = true;\n } else {\n retryCount++;\n }\n }\n\n return {\n prompt: resultPrompt,\n deepThink,\n verifyResult,\n };\n }\n\n async verifyLocator(\n prompt: string,\n locateOpt: LocateOption | undefined,\n expectCenter: [number, number],\n verifyLocateOption?: LocatorValidatorOption,\n ): Promise<LocateValidatorResult> {\n debug('verifyLocator', prompt, locateOpt, expectCenter, verifyLocateOption);\n\n const { center: verifyCenter, rect: verifyRect } = await this.aiLocate(\n prompt,\n locateOpt,\n );\n const distance = distanceOfTwoPoints(expectCenter, verifyCenter);\n const included = includedInRect(expectCenter, verifyRect);\n const pass =\n distance <= (verifyLocateOption?.centerDistanceThreshold || 20) ||\n included;\n const verifyResult = {\n pass,\n rect: verifyRect,\n center: verifyCenter,\n centerDistance: distance,\n };\n debug('aiDescribe verifyResult', verifyResult);\n return verifyResult;\n }\n\n async aiLocate(prompt: TUserPrompt, opt?: LocateOption) {\n const locateParam = buildDetailedLocateParam(prompt, opt);\n assert(locateParam, 'cannot get locate param for aiLocate');\n const locatePlan = locatePlanForLocate(locateParam);\n const plans = [locatePlan];\n const modelConfig = this.modelConfigManager.getModelConfig('grounding');\n\n const { output } = await this.taskExecutor.runPlans(\n taskTitleStr('Locate', locateParamStr(locateParam)),\n plans,\n modelConfig,\n );\n\n const { element } = output;\n\n const dprValue = await (this.interface.size() as any).dpr;\n const dprEntry = dprValue\n ? {\n dpr: dprValue,\n }\n : {};\n return {\n rect: element?.rect,\n center: element?.center,\n ...dprEntry,\n } as Pick<LocateResultElement, 'rect' | 'center'> & {\n dpr?: number; // this field is deprecated\n };\n }\n\n async aiAssert(\n assertion: TUserPrompt,\n msg?: string,\n opt?: AgentAssertOpt & ServiceExtractOption,\n ) {\n const modelConfig = this.modelConfigManager.getModelConfig('VQA');\n\n const serviceOpt: ServiceExtractOption = {\n domIncluded: opt?.domIncluded ?? defaultServiceExtractOption.domIncluded,\n screenshotIncluded:\n opt?.screenshotIncluded ??\n defaultServiceExtractOption.screenshotIncluded,\n };\n\n const { textPrompt, multimodalPrompt } = parsePrompt(assertion);\n const assertionText =\n typeof assertion === 'string' ? assertion : assertion.prompt;\n\n try {\n const { output, thought } =\n await this.taskExecutor.createTypeQueryExecution<boolean>(\n 'Assert',\n textPrompt,\n modelConfig,\n serviceOpt,\n multimodalPrompt,\n );\n\n const pass = Boolean(output);\n const message = pass\n ? undefined\n : `Assertion failed: ${msg || assertionText}\\nReason: ${thought || '(no_reason)'}`;\n\n if (opt?.keepRawResponse) {\n return {\n pass,\n thought,\n message,\n };\n }\n\n if (!pass) {\n throw new Error(message);\n }\n } catch (error) {\n if (error instanceof TaskExecutionError) {\n const errorTask = error.errorTask;\n const thought = errorTask?.thought;\n const rawError = errorTask?.error;\n const rawMessage =\n errorTask?.errorMessage ||\n (rawError instanceof Error\n ? rawError.message\n : rawError\n ? String(rawError)\n : undefined);\n const reason = thought || rawMessage || '(no_reason)';\n const message = `Assertion failed: ${msg || assertionText}\\nReason: ${reason}`;\n\n if (opt?.keepRawResponse) {\n return {\n pass: false,\n thought,\n message,\n };\n }\n\n throw new Error(message, {\n cause: rawError ?? error,\n });\n }\n\n throw error;\n }\n }\n\n async aiWaitFor(assertion: TUserPrompt, opt?: AgentWaitForOpt) {\n const modelConfig = this.modelConfigManager.getModelConfig('VQA');\n await this.taskExecutor.waitFor(\n assertion,\n {\n timeoutMs: opt?.timeoutMs || 15 * 1000,\n checkIntervalMs: opt?.checkIntervalMs || 3 * 1000,\n },\n modelConfig,\n );\n }\n\n async ai(taskPrompt: string, type = 'action') {\n if (type === 'action') {\n return this.aiAct(taskPrompt);\n }\n if (type === 'query') {\n return this.aiQuery(taskPrompt);\n }\n\n if (type === 'assert') {\n return this.aiAssert(taskPrompt);\n }\n\n if (type === 'tap') {\n return this.aiTap(taskPrompt);\n }\n\n if (type === 'rightClick') {\n return this.aiRightClick(taskPrompt);\n }\n\n if (type === 'doubleClick') {\n return this.aiDoubleClick(taskPrompt);\n }\n\n throw new Error(\n `Unknown type: ${type}, only support 'action', 'query', 'assert', 'tap', 'rightClick', 'doubleClick'`,\n );\n }\n\n async runYaml(yamlScriptContent: string): Promise<{\n result: Record<string, any>;\n }> {\n const script = parseYamlScript(yamlScriptContent, 'yaml');\n const player = new ScriptPlayer(script, async () => {\n return { agent: this, freeFn: [] };\n });\n await player.run();\n\n if (player.status === 'error') {\n const errors = player.taskStatusList\n .filter((task) => task.status === 'error')\n .map((task) => {\n return `task - ${task.name}: ${task.error?.message}`;\n })\n .join('\\n');\n throw new Error(`Error(s) occurred in running yaml script:\\n${errors}`);\n }\n\n return {\n result: player.result,\n };\n }\n\n async evaluateJavaScript(script: string) {\n assert(\n this.interface.evaluateJavaScript,\n 'evaluateJavaScript is not supported in current agent',\n );\n return this.interface.evaluateJavaScript(script);\n }\n\n async destroy() {\n // Early return if already destroyed\n if (this.destroyed) {\n return;\n }\n\n await this.interface.destroy?.();\n this.resetDump(); // reset dump to release memory\n this.destroyed = true;\n }\n\n async recordToReport(\n title?: string,\n opt?: {\n content: string;\n },\n ) {\n // 1. screenshot\n const base64 = await this.interface.screenshotBase64();\n const now = Date.now();\n // 2. build recorder\n const recorder: ExecutionRecorderItem[] = [\n {\n type: 'screenshot',\n ts: now,\n screenshot: base64,\n },\n ];\n // 3. build ExecutionTaskLog\n const task: ExecutionTaskLog = {\n type: 'Log',\n subType: 'Screenshot',\n status: 'finished',\n recorder,\n timing: {\n start: now,\n end: now,\n cost: 0,\n },\n param: {\n content: opt?.content || '',\n },\n executor: async () => {},\n };\n // 4. build ExecutionDump\n const executionDump: ExecutionDump = {\n logTime: now,\n name: `Log - ${title || 'untitled'}`,\n description: opt?.content || '',\n tasks: [task],\n };\n // 5. append to execution dump\n this.appendExecutionDump(executionDump);\n\n try {\n this.onDumpUpdate?.(this.dumpDataString());\n } catch (error) {\n console.error('Failed to update dump', error);\n }\n\n this.writeOutActionDumps();\n }\n\n /**\n * @deprecated Use {@link Agent.recordToReport} instead.\n */\n async logScreenshot(\n title?: string,\n opt?: {\n content: string;\n },\n ) {\n await this.recordToReport(title, opt);\n }\n\n _unstableLogContent() {\n const { groupName, groupDescription, executions } = this.dump;\n const newExecutions = Array.isArray(executions)\n ? executions.map((execution: any) => {\n const { tasks, ...restExecution } = execution;\n let newTasks = tasks;\n if (Array.isArray(tasks)) {\n newTasks = tasks.map((task: any) => {\n // only remove uiContext and log from task\n const { uiContext, log, ...restTask } = task;\n return restTask;\n });\n }\n return { ...restExecution, ...(newTasks ? { tasks: newTasks } : {}) };\n })\n : [];\n return {\n groupName,\n groupDescription,\n executions: newExecutions,\n };\n }\n\n /**\n * Freezes the current page context to be reused in subsequent AI operations\n * This avoids recalculating page context for each operation\n */\n async freezePageContext(): Promise<void> {\n debug('Freezing page context');\n const context = await this._snapshotContext();\n // Mark the context as frozen\n context._isFrozen = true;\n this.frozenUIContext = context;\n debug('Page context frozen successfully');\n }\n\n /**\n * Unfreezes the page context, allowing AI operations to calculate context dynamically\n */\n async unfreezePageContext(): Promise<void> {\n debug('Unfreezing page context');\n this.frozenUIContext = undefined;\n debug('Page context unfrozen successfully');\n }\n\n /**\n * Process cache configuration and return normalized cache settings\n */\n private processCacheConfig(opts: AgentOpt): {\n id: string;\n enabled: boolean;\n readOnly: boolean;\n writeOnly: boolean;\n } | null {\n // Validate original cache config before processing\n // Agent requires explicit IDs - don't allow auto-generation\n if (opts.cache === true) {\n throw new Error(\n 'cache: true requires an explicit cache ID. Please provide:\\n' +\n 'Example: cache: { id: \"my-cache-id\" }',\n );\n }\n\n // Check if cache config object is missing ID\n if (\n opts.cache &&\n typeof opts.cache === 'object' &&\n opts.cache !== null &&\n !opts.cache.id\n ) {\n throw new Error(\n 'cache configuration requires an explicit id.\\n' +\n 'Example: cache: { id: \"my-cache-id\" }',\n );\n }\n\n // Use the unified utils function to process cache configuration\n const cacheConfig = processCacheConfig(\n opts.cache,\n opts.cacheId || opts.testId || 'default',\n );\n\n if (!cacheConfig) {\n return null;\n }\n\n // Handle cache configuration object\n if (typeof cacheConfig === 'object' && cacheConfig !== null) {\n const id = cacheConfig.id;\n const rawStrategy = cacheConfig.strategy as unknown;\n let strategyValue: string;\n\n if (rawStrategy === undefined) {\n strategyValue = 'read-write';\n } else if (typeof rawStrategy === 'string') {\n strategyValue = rawStrategy;\n } else {\n throw new Error(\n `cache.strategy must be a string when provided, but received type ${typeof rawStrategy}`,\n );\n }\n\n if (!isValidCacheStrategy(strategyValue)) {\n throw new Error(\n `cache.strategy must be one of ${CACHE_STRATEGY_VALUES}, but received \"${strategyValue}\"`,\n );\n }\n\n const isReadOnly = strategyValue === 'read-only';\n const isWriteOnly = strategyValue === 'write-only';\n\n return {\n id,\n enabled: !isWriteOnly,\n readOnly: isReadOnly,\n writeOnly: isWriteOnly,\n };\n }\n\n return null;\n }\n\n /**\n * Manually flush cache to file\n * @param options - Optional configuration\n * @param options.cleanUnused - If true, removes unused cache records before flushing\n */\n async flushCache(options?: { cleanUnused?: boolean }): Promise<void> {\n if (!this.taskCache) {\n throw new Error('Cache is not configured');\n }\n\n this.taskCache.flushCacheToFile(options);\n }\n}\n\nexport const createAgent = (\n interfaceInstance: AbstractInterface,\n opts?: AgentOpt,\n) => {\n return new Agent(interfaceInstance, opts);\n};\n"],"names":["__webpack_require__","module","getter","definition","key","Object","obj","prop","Symbol","debug","getDebug","distanceOfTwoPoints","p1","p2","x1","y1","x2","y2","Math","includedInRect","point","rect","x","y","left","top","width","height","defaultServiceExtractOption","CACHE_STRATEGIES","isValidCacheStrategy","strategy","value","CACHE_STRATEGY_VALUES","Agent","context","undefined","_context_size","pageWidth","assert","screenshotWidth","imageInfoOfBase64","Number","computedScale","action","commonContextParser","computedScreenshotScale","scaleForLog","targetWidth","targetHeight","resizeImgBase64","prompt","console","getVersion","WeakMap","execution","runner","currentDump","existingIndex","stringifyDumpData","reportHTMLContent","Error","generateReport","autoPrintReportMsg","writeLogFile","groupedActionDumpFileExt","printReportMsg","task","param","paramStr","tip","typeStr","executionDump","error","name","type","opt","actionPlan","plans","Boolean","title","taskTitleStr","locateParamStr","modelConfig","output","locatePrompt","detailedLocateParam","buildDetailedLocateParam","locatePromptOrValue","locatePromptOrOpt","optOrUndefined","optWithValue","stringValue","String","locatePromptOrKeyName","keyName","locatePromptOrScrollParam","scrollParam","taskPrompt","_this_taskCache","_this_taskCache1","cacheable","isVlmUiTars","matchedCache","_matchedCache_cacheContent","_matchedCache_cacheContent1","yaml","yamlContent","yamlFlowStr","demand","textPrompt","multimodalPrompt","parsePrompt","center","verifyPrompt","retryLimit","success","retryCount","resultPrompt","deepThink","verifyResult","text","locateOpt","expectCenter","verifyLocateOption","verifyCenter","verifyRect","distance","included","pass","locateParam","locatePlan","locatePlanForLocate","element","dprValue","dprEntry","assertion","msg","serviceOpt","assertionText","thought","message","TaskExecutionError","errorTask","rawError","rawMessage","reason","yamlScriptContent","script","parseYamlScript","player","ScriptPlayer","errors","_task_error","_this_interface","base64","now","Date","recorder","_this","groupName","groupDescription","executions","newExecutions","Array","tasks","restExecution","newTasks","uiContext","log","restTask","opts","cacheConfig","processCacheConfig","id","rawStrategy","strategyValue","isReadOnly","isWriteOnly","options","interfaceInstance","ModelConfigManager","globalModelConfigManager","Service","cacheConfigObj","TaskCache","TaskExecutor","getReportFileName","createAgent"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"agent/execution-session.js","sources":["webpack://@midscene/core/webpack/runtime/define_property_getters","webpack://@midscene/core/webpack/runtime/has_own_property","webpack://@midscene/core/webpack/runtime/make_namespace_object","webpack://@midscene/core/./src/agent/execution-session.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 { TaskRunner } from '@/task-runner';\nimport type {\n ExecutionTaskApply,\n ExecutionTaskProgressOptions,\n UIContext,\n} from '@/types';\n\n/**\n * Thin wrapper around {@link TaskRunner} that represents a single linear execution run.\n */\nexport class ExecutionSession {\n private readonly runner: TaskRunner;\n\n constructor(\n name: string,\n contextProvider: () => Promise<UIContext>,\n options?: ExecutionTaskProgressOptions & { tasks?: ExecutionTaskApply[] },\n ) {\n this.runner = new TaskRunner(name, contextProvider, options);\n }\n\n async append(tasks: ExecutionTaskApply[] | ExecutionTaskApply) {\n await this.runner.append(tasks);\n }\n\n async appendAndRun(tasks: ExecutionTaskApply[] | ExecutionTaskApply) {\n return this.runner.appendAndFlush(tasks);\n }\n\n async run() {\n return this.runner.flush();\n }\n\n isInErrorState() {\n return this.runner.isInErrorState();\n }\n\n latestErrorTask() {\n return this.runner.latestErrorTask();\n }\n\n appendErrorPlan(errorMsg: string) {\n return this.runner.appendErrorPlan(errorMsg);\n }\n\n getRunner() {\n return this.runner;\n }\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","ExecutionSession","tasks","errorMsg","name","contextProvider","options","TaskRunner"],"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;;;;;;;;;;;;;;;;;;ACIO,MAAMI;IAWX,MAAM,OAAOC,KAAgD,EAAE;QAC7D,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAACA;IAC3B;IAEA,MAAM,aAAaA,KAAgD,EAAE;QACnE,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc,CAACA;IACpC;IAEA,MAAM,MAAM;QACV,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK;IAC1B;IAEA,iBAAiB;QACf,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc;IACnC;IAEA,kBAAkB;QAChB,OAAO,IAAI,CAAC,MAAM,CAAC,eAAe;IACpC;IAEA,gBAAgBC,QAAgB,EAAE;QAChC,OAAO,IAAI,CAAC,MAAM,CAAC,eAAe,CAACA;IACrC;IAEA,YAAY;QACV,OAAO,IAAI,CAAC,MAAM;IACpB;IAlCA,YACEC,IAAY,EACZC,eAAyC,EACzCC,OAAyE,CACzE;QANF,uBAAiB,UAAjB;QAOE,IAAI,CAAC,MAAM,GAAG,IAAIC,wCAAAA,UAAUA,CAACH,MAAMC,iBAAiBC;IACtD;AA6BF"}
1
+ {"version":3,"file":"agent/execution-session.js","sources":["webpack://@midscene/core/webpack/runtime/define_property_getters","webpack://@midscene/core/webpack/runtime/has_own_property","webpack://@midscene/core/webpack/runtime/make_namespace_object","webpack://@midscene/core/./src/agent/execution-session.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 TaskExecutionError, TaskRunner } from '@/task-runner';\nimport type {\n ExecutionTaskApply,\n ExecutionTaskProgressOptions,\n UIContext,\n} from '@/types';\n\ntype ExecutionSessionOptions = ExecutionTaskProgressOptions & {\n tasks?: ExecutionTaskApply[];\n onTaskUpdate?: (\n runner: TaskRunner,\n error?: TaskExecutionError,\n ) => Promise<void> | void;\n};\n\n/**\n * Thin wrapper around {@link TaskRunner} that represents a single linear execution run.\n */\nexport class ExecutionSession {\n private readonly runner: TaskRunner;\n\n constructor(\n name: string,\n contextProvider: () => Promise<UIContext>,\n options?: ExecutionSessionOptions,\n ) {\n this.runner = new TaskRunner(name, contextProvider, options);\n }\n\n async append(tasks: ExecutionTaskApply[] | ExecutionTaskApply) {\n await this.runner.append(tasks);\n }\n\n async appendAndRun(tasks: ExecutionTaskApply[] | ExecutionTaskApply) {\n return this.runner.appendAndFlush(tasks);\n }\n\n async run() {\n return this.runner.flush();\n }\n\n isInErrorState() {\n return this.runner.isInErrorState();\n }\n\n latestErrorTask() {\n return this.runner.latestErrorTask();\n }\n\n appendErrorPlan(errorMsg: string) {\n return this.runner.appendErrorPlan(errorMsg);\n }\n\n getRunner() {\n return this.runner;\n }\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","ExecutionSession","tasks","errorMsg","name","contextProvider","options","TaskRunner"],"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;;;;;;;;;;;;;;;;;;ACYO,MAAMI;IAWX,MAAM,OAAOC,KAAgD,EAAE;QAC7D,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAACA;IAC3B;IAEA,MAAM,aAAaA,KAAgD,EAAE;QACnE,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc,CAACA;IACpC;IAEA,MAAM,MAAM;QACV,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK;IAC1B;IAEA,iBAAiB;QACf,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc;IACnC;IAEA,kBAAkB;QAChB,OAAO,IAAI,CAAC,MAAM,CAAC,eAAe;IACpC;IAEA,gBAAgBC,QAAgB,EAAE;QAChC,OAAO,IAAI,CAAC,MAAM,CAAC,eAAe,CAACA;IACrC;IAEA,YAAY;QACV,OAAO,IAAI,CAAC,MAAM;IACpB;IAlCA,YACEC,IAAY,EACZC,eAAyC,EACzCC,OAAiC,CACjC;QANF,uBAAiB,UAAjB;QAOE,IAAI,CAAC,MAAM,GAAG,IAAIC,wCAAAA,UAAUA,CAACH,MAAMC,iBAAiBC;IACtD;AA6BF"}
@@ -92,7 +92,7 @@ class TaskBuilder {
92
92
  }
93
93
  handleFinishedPlan(plan, context) {
94
94
  const taskActionFinished = {
95
- type: 'Action',
95
+ type: 'Action Space',
96
96
  subType: 'Finished',
97
97
  param: null,
98
98
  thought: plan.thought,
@@ -112,7 +112,7 @@ class TaskBuilder {
112
112
  }
113
113
  createSleepTask(param, meta) {
114
114
  return {
115
- type: 'Action',
115
+ type: 'Action Space',
116
116
  subType: 'Sleep',
117
117
  param,
118
118
  thought: null == meta ? void 0 : meta.thought,
@@ -149,7 +149,7 @@ class TaskBuilder {
149
149
  }
150
150
  });
151
151
  const task = {
152
- type: 'Action',
152
+ type: 'Action Space',
153
153
  subType: planType,
154
154
  thought: plan.thought,
155
155
  param: plan.param,
@@ -227,7 +227,7 @@ class TaskBuilder {
227
227
  cacheable
228
228
  };
229
229
  const taskFind = {
230
- type: 'Insight',
230
+ type: 'Planning',
231
231
  subType: 'Locate',
232
232
  subTask: context.subTask || void 0,
233
233
  param: locateParam,