@midscene/core 0.28.2-beta-20250910072710.0 → 0.28.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/es/agent/agent.mjs +17 -27
- package/dist/es/agent/agent.mjs.map +1 -1
- package/dist/es/agent/tasks.mjs +31 -43
- package/dist/es/agent/tasks.mjs.map +1 -1
- package/dist/es/agent/utils.mjs +3 -4
- package/dist/es/agent/utils.mjs.map +1 -1
- package/dist/es/ai-model/common.mjs +26 -16
- package/dist/es/ai-model/common.mjs.map +1 -1
- package/dist/es/ai-model/index.mjs +3 -3
- package/dist/es/ai-model/inspect.mjs +34 -26
- package/dist/es/ai-model/inspect.mjs.map +1 -1
- package/dist/es/ai-model/llm-planning.mjs +15 -14
- package/dist/es/ai-model/llm-planning.mjs.map +1 -1
- package/dist/es/ai-model/prompt/common.mjs.map +1 -1
- package/dist/es/ai-model/prompt/llm-locator.mjs.map +1 -1
- package/dist/es/ai-model/prompt/llm-planning.mjs.map +1 -1
- package/dist/es/ai-model/prompt/llm-section-locator.mjs.map +1 -1
- package/dist/es/ai-model/prompt/playwright-generator.mjs +12 -6
- package/dist/es/ai-model/prompt/playwright-generator.mjs.map +1 -1
- package/dist/es/ai-model/prompt/util.mjs +3 -3
- package/dist/es/ai-model/prompt/util.mjs.map +1 -1
- package/dist/es/ai-model/prompt/yaml-generator.mjs +12 -6
- package/dist/es/ai-model/prompt/yaml-generator.mjs.map +1 -1
- package/dist/es/ai-model/service-caller/index.mjs +23 -28
- package/dist/es/ai-model/service-caller/index.mjs.map +1 -1
- package/dist/es/ai-model/ui-tars-planning.mjs +10 -10
- package/dist/es/ai-model/ui-tars-planning.mjs.map +1 -1
- package/dist/es/insight/index.mjs +26 -20
- package/dist/es/insight/index.mjs.map +1 -1
- package/dist/es/types.mjs.map +1 -1
- package/dist/es/utils.mjs +5 -4
- package/dist/es/utils.mjs.map +1 -1
- package/dist/lib/agent/agent.js +16 -26
- package/dist/lib/agent/agent.js.map +1 -1
- package/dist/lib/agent/tasks.js +31 -43
- package/dist/lib/agent/tasks.js.map +1 -1
- package/dist/lib/agent/utils.js +3 -4
- package/dist/lib/agent/utils.js.map +1 -1
- package/dist/lib/ai-model/common.js +31 -18
- package/dist/lib/ai-model/common.js.map +1 -1
- package/dist/lib/ai-model/index.js +15 -12
- package/dist/lib/ai-model/inspect.js +32 -24
- package/dist/lib/ai-model/inspect.js.map +1 -1
- package/dist/lib/ai-model/llm-planning.js +14 -13
- package/dist/lib/ai-model/llm-planning.js.map +1 -1
- package/dist/lib/ai-model/prompt/common.js.map +1 -1
- package/dist/lib/ai-model/prompt/llm-locator.js.map +1 -1
- package/dist/lib/ai-model/prompt/llm-planning.js.map +1 -1
- package/dist/lib/ai-model/prompt/llm-section-locator.js.map +1 -1
- package/dist/lib/ai-model/prompt/playwright-generator.js +11 -5
- package/dist/lib/ai-model/prompt/playwright-generator.js.map +1 -1
- package/dist/lib/ai-model/prompt/util.js +3 -3
- package/dist/lib/ai-model/prompt/util.js.map +1 -1
- package/dist/lib/ai-model/prompt/yaml-generator.js +11 -5
- package/dist/lib/ai-model/prompt/yaml-generator.js.map +1 -1
- package/dist/lib/ai-model/service-caller/index.js +31 -36
- package/dist/lib/ai-model/service-caller/index.js.map +1 -1
- package/dist/lib/ai-model/ui-tars-planning.js +8 -8
- package/dist/lib/ai-model/ui-tars-planning.js.map +1 -1
- package/dist/lib/insight/index.js +23 -17
- package/dist/lib/insight/index.js.map +1 -1
- package/dist/lib/types.js.map +1 -1
- package/dist/lib/utils.js +4 -3
- package/dist/lib/utils.js.map +1 -1
- package/dist/types/agent/agent.d.ts +0 -2
- package/dist/types/agent/tasks.d.ts +7 -8
- package/dist/types/agent/utils.d.ts +1 -3
- package/dist/types/ai-model/common.d.ts +11 -7
- package/dist/types/ai-model/index.d.ts +2 -2
- package/dist/types/ai-model/inspect.d.ts +6 -7
- package/dist/types/ai-model/llm-planning.d.ts +2 -2
- package/dist/types/ai-model/prompt/common.d.ts +2 -2
- package/dist/types/ai-model/prompt/llm-locator.d.ts +2 -2
- package/dist/types/ai-model/prompt/llm-planning.d.ts +3 -3
- package/dist/types/ai-model/prompt/llm-section-locator.d.ts +2 -2
- package/dist/types/ai-model/prompt/playwright-generator.d.ts +2 -3
- package/dist/types/ai-model/prompt/util.d.ts +2 -3
- package/dist/types/ai-model/prompt/yaml-generator.d.ts +2 -3
- package/dist/types/ai-model/service-caller/index.d.ts +5 -5
- package/dist/types/ai-model/ui-tars-planning.d.ts +3 -3
- package/dist/types/device/index.d.ts +2 -2
- package/dist/types/insight/index.d.ts +7 -12
- package/dist/types/types.d.ts +9 -0
- package/dist/types/utils.d.ts +1 -2
- package/package.json +3 -3
package/dist/lib/agent/tasks.js
CHANGED
|
@@ -127,7 +127,7 @@ class TaskExecutor {
|
|
|
127
127
|
};
|
|
128
128
|
return taskWithScreenshot;
|
|
129
129
|
}
|
|
130
|
-
async convertPlanToExecutable(plans
|
|
130
|
+
async convertPlanToExecutable(plans) {
|
|
131
131
|
const tasks = [];
|
|
132
132
|
const taskForLocatePlan = (plan, detailedLocateParam, onResult)=>{
|
|
133
133
|
if ('string' == typeof detailedLocateParam) detailedLocateParam = {
|
|
@@ -177,7 +177,7 @@ class TaskExecutor {
|
|
|
177
177
|
const planHitFlag = !!elementFromPlan;
|
|
178
178
|
const elementFromAiLocate = userExpectedPathHitFlag || cacheHitFlag || planHitFlag ? void 0 : (await this.insight.locate(param, {
|
|
179
179
|
context: uiContext
|
|
180
|
-
}
|
|
180
|
+
})).element;
|
|
181
181
|
const aiLocateHitFlag = !!elementFromAiLocate;
|
|
182
182
|
const element = elementFromXpath || elementFromCache || elementFromPlan || elementFromAiLocate;
|
|
183
183
|
let currentXpaths;
|
|
@@ -417,8 +417,7 @@ class TaskExecutor {
|
|
|
417
417
|
executor: taskExecutor
|
|
418
418
|
};
|
|
419
419
|
}
|
|
420
|
-
planningTaskFromPrompt(userInstruction,
|
|
421
|
-
const { log, actionContext, modelConfig } = opts;
|
|
420
|
+
planningTaskFromPrompt(userInstruction, log, actionContext) {
|
|
422
421
|
const task = {
|
|
423
422
|
type: 'Planning',
|
|
424
423
|
subType: 'Plan',
|
|
@@ -440,8 +439,7 @@ class TaskExecutor {
|
|
|
440
439
|
log: param.log,
|
|
441
440
|
actionContext,
|
|
442
441
|
interfaceType: this.interface.interfaceType,
|
|
443
|
-
actionSpace
|
|
444
|
-
modelConfig
|
|
442
|
+
actionSpace
|
|
445
443
|
});
|
|
446
444
|
const { actions, log, more_actions_needed_by_instruction, error, usage, rawResponse, sleep } = planResult;
|
|
447
445
|
executorContext.task.log = {
|
|
@@ -478,7 +476,7 @@ class TaskExecutor {
|
|
|
478
476
|
};
|
|
479
477
|
return task;
|
|
480
478
|
}
|
|
481
|
-
planningTaskToGoal(userInstruction,
|
|
479
|
+
planningTaskToGoal(userInstruction, modelPreferences) {
|
|
482
480
|
const task = {
|
|
483
481
|
type: 'Planning',
|
|
484
482
|
subType: 'Plan',
|
|
@@ -489,9 +487,7 @@ class TaskExecutor {
|
|
|
489
487
|
executor: async (param, executorContext)=>{
|
|
490
488
|
var _actions_;
|
|
491
489
|
const { uiContext } = await this.setupPlanningContext(executorContext);
|
|
492
|
-
const
|
|
493
|
-
const { uiTarsModelVersion } = modelConfig;
|
|
494
|
-
const imagePayload = await (0, index_js_namespaceObject.resizeImageForUiTars)(uiContext.screenshotBase64, uiContext.size, uiTarsModelVersion);
|
|
490
|
+
const imagePayload = await (0, index_js_namespaceObject.resizeImageForUiTars)(uiContext.screenshotBase64, uiContext.size, modelPreferences);
|
|
495
491
|
this.appendConversationHistory({
|
|
496
492
|
role: 'user',
|
|
497
493
|
content: [
|
|
@@ -507,7 +503,7 @@ class TaskExecutor {
|
|
|
507
503
|
userInstruction: param.userInstruction,
|
|
508
504
|
conversationHistory: this.conversationHistory,
|
|
509
505
|
size: uiContext.size,
|
|
510
|
-
|
|
506
|
+
modelPreferences
|
|
511
507
|
});
|
|
512
508
|
const { actions, action_summary, usage } = planResult;
|
|
513
509
|
executorContext.task.log = {
|
|
@@ -536,11 +532,11 @@ class TaskExecutor {
|
|
|
536
532
|
};
|
|
537
533
|
return task;
|
|
538
534
|
}
|
|
539
|
-
async runPlans(title, plans
|
|
535
|
+
async runPlans(title, plans) {
|
|
540
536
|
const taskExecutor = new external_index_js_namespaceObject.Executor(title, {
|
|
541
537
|
onTaskStart: this.onTaskStartCallback
|
|
542
538
|
});
|
|
543
|
-
const { tasks } = await this.convertPlanToExecutable(plans
|
|
539
|
+
const { tasks } = await this.convertPlanToExecutable(plans);
|
|
544
540
|
await taskExecutor.append(tasks);
|
|
545
541
|
const result = await taskExecutor.flush();
|
|
546
542
|
const { output } = result;
|
|
@@ -549,15 +545,11 @@ class TaskExecutor {
|
|
|
549
545
|
executor: taskExecutor
|
|
550
546
|
};
|
|
551
547
|
}
|
|
552
|
-
async action(userPrompt,
|
|
548
|
+
async action(userPrompt, actionContext) {
|
|
553
549
|
const taskExecutor = new external_index_js_namespaceObject.Executor((0, external_ui_utils_js_namespaceObject.taskTitleStr)('Action', userPrompt), {
|
|
554
550
|
onTaskStart: this.onTaskStartCallback
|
|
555
551
|
});
|
|
556
|
-
let planningTask = this.planningTaskFromPrompt(userPrompt,
|
|
557
|
-
log: void 0,
|
|
558
|
-
actionContext,
|
|
559
|
-
modelConfig
|
|
560
|
-
});
|
|
552
|
+
let planningTask = this.planningTaskFromPrompt(userPrompt, void 0, actionContext);
|
|
561
553
|
let replanCount = 0;
|
|
562
554
|
const logList = [];
|
|
563
555
|
const yamlFlow = [];
|
|
@@ -565,7 +557,7 @@ class TaskExecutor {
|
|
|
565
557
|
while(planningTask){
|
|
566
558
|
if (replanCount > replanningCycleLimit) {
|
|
567
559
|
const errorMsg = 'Replanning too many times, please split the task into multiple steps';
|
|
568
|
-
return this.appendErrorPlan(taskExecutor, errorMsg
|
|
560
|
+
return this.appendErrorPlan(taskExecutor, errorMsg);
|
|
569
561
|
}
|
|
570
562
|
await taskExecutor.append(planningTask);
|
|
571
563
|
const result = await taskExecutor.flush();
|
|
@@ -578,10 +570,10 @@ class TaskExecutor {
|
|
|
578
570
|
yamlFlow.push(...planResult.yamlFlow || []);
|
|
579
571
|
let executables;
|
|
580
572
|
try {
|
|
581
|
-
executables = await this.convertPlanToExecutable(plans
|
|
573
|
+
executables = await this.convertPlanToExecutable(plans);
|
|
582
574
|
taskExecutor.append(executables.tasks);
|
|
583
575
|
} catch (error) {
|
|
584
|
-
return this.appendErrorPlan(taskExecutor, `Error converting plans to executable tasks: ${error}, plans: ${JSON.stringify(plans)}
|
|
576
|
+
return this.appendErrorPlan(taskExecutor, `Error converting plans to executable tasks: ${error}, plans: ${JSON.stringify(plans)}`);
|
|
585
577
|
}
|
|
586
578
|
await taskExecutor.flush();
|
|
587
579
|
if (taskExecutor.isInErrorState()) return {
|
|
@@ -593,11 +585,7 @@ class TaskExecutor {
|
|
|
593
585
|
planningTask = null;
|
|
594
586
|
break;
|
|
595
587
|
}
|
|
596
|
-
planningTask = this.planningTaskFromPrompt(userPrompt, {
|
|
597
|
-
log: logList.length > 0 ? `- ${logList.join('\n- ')}` : void 0,
|
|
598
|
-
actionContext,
|
|
599
|
-
modelConfig
|
|
600
|
-
});
|
|
588
|
+
planningTask = this.planningTaskFromPrompt(userPrompt, logList.length > 0 ? `- ${logList.join('\n- ')}` : void 0, actionContext);
|
|
601
589
|
replanCount++;
|
|
602
590
|
}
|
|
603
591
|
return {
|
|
@@ -607,7 +595,7 @@ class TaskExecutor {
|
|
|
607
595
|
executor: taskExecutor
|
|
608
596
|
};
|
|
609
597
|
}
|
|
610
|
-
async actionToGoal(userPrompt
|
|
598
|
+
async actionToGoal(userPrompt) {
|
|
611
599
|
const taskExecutor = new external_index_js_namespaceObject.Executor((0, external_ui_utils_js_namespaceObject.taskTitleStr)('Action', userPrompt), {
|
|
612
600
|
onTaskStart: this.onTaskStartCallback
|
|
613
601
|
});
|
|
@@ -620,7 +608,7 @@ class TaskExecutor {
|
|
|
620
608
|
currentActionCount++;
|
|
621
609
|
debug('actionToGoal, currentActionCount:', currentActionCount, 'userPrompt:', userPrompt);
|
|
622
610
|
const planningTask = this.planningTaskToGoal(userPrompt, {
|
|
623
|
-
|
|
611
|
+
intent: 'planning'
|
|
624
612
|
});
|
|
625
613
|
await taskExecutor.append(planningTask);
|
|
626
614
|
const result = await taskExecutor.flush();
|
|
@@ -634,10 +622,10 @@ class TaskExecutor {
|
|
|
634
622
|
yamlFlow.push(...output.yamlFlow || []);
|
|
635
623
|
let executables;
|
|
636
624
|
try {
|
|
637
|
-
executables = await this.convertPlanToExecutable(plans
|
|
625
|
+
executables = await this.convertPlanToExecutable(plans);
|
|
638
626
|
taskExecutor.append(executables.tasks);
|
|
639
627
|
} catch (error) {
|
|
640
|
-
return this.appendErrorPlan(taskExecutor, `Error converting plans to executable tasks: ${error}, plans: ${JSON.stringify(plans)}
|
|
628
|
+
return this.appendErrorPlan(taskExecutor, `Error converting plans to executable tasks: ${error}, plans: ${JSON.stringify(plans)}`);
|
|
641
629
|
}
|
|
642
630
|
await taskExecutor.flush();
|
|
643
631
|
if (taskExecutor.isInErrorState()) return {
|
|
@@ -653,7 +641,7 @@ class TaskExecutor {
|
|
|
653
641
|
executor: taskExecutor
|
|
654
642
|
};
|
|
655
643
|
}
|
|
656
|
-
createTypeQueryTask(type, demand,
|
|
644
|
+
createTypeQueryTask(type, demand, opt, multimodalPrompt) {
|
|
657
645
|
const queryTask = {
|
|
658
646
|
type: 'Insight',
|
|
659
647
|
subType: type,
|
|
@@ -691,7 +679,7 @@ class TaskExecutor {
|
|
|
691
679
|
result: `${returnType}, ${demand}`
|
|
692
680
|
};
|
|
693
681
|
}
|
|
694
|
-
const { data, usage, thought } = await this.insight.extract(demandInput,
|
|
682
|
+
const { data, usage, thought } = await this.insight.extract(demandInput, opt, multimodalPrompt);
|
|
695
683
|
let outputResult = data;
|
|
696
684
|
if (ifTypeRestricted) if ('string' == typeof data) outputResult = data;
|
|
697
685
|
else {
|
|
@@ -711,11 +699,11 @@ class TaskExecutor {
|
|
|
711
699
|
};
|
|
712
700
|
return queryTask;
|
|
713
701
|
}
|
|
714
|
-
async createTypeQueryExecution(type, demand,
|
|
702
|
+
async createTypeQueryExecution(type, demand, opt, multimodalPrompt) {
|
|
715
703
|
const taskExecutor = new external_index_js_namespaceObject.Executor((0, external_ui_utils_js_namespaceObject.taskTitleStr)(type, 'string' == typeof demand ? demand : JSON.stringify(demand)), {
|
|
716
704
|
onTaskStart: this.onTaskStartCallback
|
|
717
705
|
});
|
|
718
|
-
const queryTask = await this.createTypeQueryTask(type, demand,
|
|
706
|
+
const queryTask = await this.createTypeQueryTask(type, demand, opt, multimodalPrompt);
|
|
719
707
|
await taskExecutor.append(this.prependExecutorWithScreenshot(queryTask));
|
|
720
708
|
const result = await taskExecutor.flush();
|
|
721
709
|
if (!result) throw new Error('result of taskExecutor.flush() is undefined in function createTypeQueryTask');
|
|
@@ -726,9 +714,9 @@ class TaskExecutor {
|
|
|
726
714
|
executor: taskExecutor
|
|
727
715
|
};
|
|
728
716
|
}
|
|
729
|
-
async assert(assertion,
|
|
717
|
+
async assert(assertion, opt) {
|
|
730
718
|
const { textPrompt, multimodalPrompt } = (0, external_utils_js_namespaceObject_1.parsePrompt)(assertion);
|
|
731
|
-
return await this.createTypeQueryExecution('Assert', textPrompt,
|
|
719
|
+
return await this.createTypeQueryExecution('Assert', textPrompt, opt, multimodalPrompt);
|
|
732
720
|
}
|
|
733
721
|
appendConversationHistory(conversationHistory) {
|
|
734
722
|
if ('user' === conversationHistory.role) {
|
|
@@ -740,7 +728,7 @@ class TaskExecutor {
|
|
|
740
728
|
}
|
|
741
729
|
this.conversationHistory.push(conversationHistory);
|
|
742
730
|
}
|
|
743
|
-
async appendErrorPlan(taskExecutor, errorMsg
|
|
731
|
+
async appendErrorPlan(taskExecutor, errorMsg) {
|
|
744
732
|
const errorPlan = {
|
|
745
733
|
type: 'Error',
|
|
746
734
|
param: {
|
|
@@ -750,7 +738,7 @@ class TaskExecutor {
|
|
|
750
738
|
};
|
|
751
739
|
const { tasks } = await this.convertPlanToExecutable([
|
|
752
740
|
errorPlan
|
|
753
|
-
]
|
|
741
|
+
]);
|
|
754
742
|
await taskExecutor.append(this.prependExecutorWithScreenshot(tasks[0]));
|
|
755
743
|
await taskExecutor.flush();
|
|
756
744
|
return {
|
|
@@ -758,7 +746,7 @@ class TaskExecutor {
|
|
|
758
746
|
executor: taskExecutor
|
|
759
747
|
};
|
|
760
748
|
}
|
|
761
|
-
async waitFor(assertion, opt
|
|
749
|
+
async waitFor(assertion, opt) {
|
|
762
750
|
const { textPrompt, multimodalPrompt } = (0, external_utils_js_namespaceObject_1.parsePrompt)(assertion);
|
|
763
751
|
const description = `waitFor: ${textPrompt}`;
|
|
764
752
|
const taskExecutor = new external_index_js_namespaceObject.Executor((0, external_ui_utils_js_namespaceObject.taskTitleStr)('WaitFor', description), {
|
|
@@ -774,7 +762,7 @@ class TaskExecutor {
|
|
|
774
762
|
let errorThought = '';
|
|
775
763
|
while(Date.now() - overallStartTime < timeoutMs){
|
|
776
764
|
startTime = Date.now();
|
|
777
|
-
const queryTask = await this.createTypeQueryTask('Assert', textPrompt,
|
|
765
|
+
const queryTask = await this.createTypeQueryTask('Assert', textPrompt, {
|
|
778
766
|
isWaitForAssert: true,
|
|
779
767
|
returnThought: true,
|
|
780
768
|
doNotThrowError: true
|
|
@@ -799,12 +787,12 @@ class TaskExecutor {
|
|
|
799
787
|
};
|
|
800
788
|
const { tasks: sleepTasks } = await this.convertPlanToExecutable([
|
|
801
789
|
sleepPlan
|
|
802
|
-
]
|
|
790
|
+
]);
|
|
803
791
|
await taskExecutor.append(this.prependExecutorWithScreenshot(sleepTasks[0]));
|
|
804
792
|
await taskExecutor.flush();
|
|
805
793
|
}
|
|
806
794
|
}
|
|
807
|
-
return this.appendErrorPlan(taskExecutor, `waitFor timeout: ${errorThought}
|
|
795
|
+
return this.appendErrorPlan(taskExecutor, `waitFor timeout: ${errorThought}`);
|
|
808
796
|
}
|
|
809
797
|
constructor(interfaceInstance, insight, opts){
|
|
810
798
|
_define_property(this, "interface", void 0);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent/tasks.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/tasks.ts"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import {\n type ChatCompletionMessageParam,\n elementByPositionWithElementInfo,\n findAllMidsceneLocatorField,\n resizeImageForUiTars,\n vlmPlanning,\n} from '@/ai-model';\nimport type { AbstractInterface } from '@/device';\nimport {\n type AIUsageInfo,\n type BaseElement,\n type DetailedLocateParam,\n type DumpSubscriber,\n type ExecutionRecorderItem,\n type ExecutionTaskActionApply,\n type ExecutionTaskApply,\n type ExecutionTaskHitBy,\n type ExecutionTaskInsightLocateApply,\n type ExecutionTaskInsightQueryApply,\n type ExecutionTaskPlanning,\n type ExecutionTaskPlanningApply,\n type ExecutionTaskProgressOptions,\n Executor,\n type ExecutorContext,\n type Insight,\n type InsightDump,\n type InsightExtractOption,\n type InsightExtractParam,\n type InterfaceType,\n type LocateResultElement,\n type MidsceneYamlFlowItem,\n type PlanningAIResponse,\n type PlanningAction,\n type PlanningActionParamError,\n type PlanningActionParamSleep,\n type PlanningActionParamWaitFor,\n type PlanningLocateParam,\n type TMultimodalPrompt,\n type TUserPrompt,\n type UIContext,\n plan,\n} from '@/index';\nimport { sleep } from '@/utils';\nimport { NodeType } from '@midscene/shared/constants';\nimport {\n type IModelConfig,\n MIDSCENE_REPLANNING_CYCLE_LIMIT,\n globalConfigManager,\n} from '@midscene/shared/env';\nimport { getDebug } from '@midscene/shared/logger';\nimport { assert } from '@midscene/shared/utils';\nimport type { TaskCache } from './task-cache';\nimport { taskTitleStr } from './ui-utils';\nimport {\n matchElementFromCache,\n matchElementFromPlan,\n parsePrompt,\n} from './utils';\n\ninterface ExecutionResult<OutputType = any> {\n output: OutputType;\n thought?: string;\n executor: Executor;\n}\n\nconst debug = getDebug('device-task-executor');\nconst defaultReplanningCycleLimit = 10;\n\nexport function locatePlanForLocate(param: string | DetailedLocateParam) {\n const locate = typeof param === 'string' ? { prompt: param } : param;\n const locatePlan: PlanningAction<PlanningLocateParam> = {\n type: 'Locate',\n locate,\n param: locate,\n thought: '',\n };\n return locatePlan;\n}\n\nexport class TaskExecutor {\n interface: AbstractInterface;\n\n insight: Insight;\n\n taskCache?: TaskCache;\n\n conversationHistory: ChatCompletionMessageParam[] = [];\n\n onTaskStartCallback?: ExecutionTaskProgressOptions['onTaskStart'];\n\n // @deprecated use .interface instead\n get page() {\n return this.interface;\n }\n\n constructor(\n interfaceInstance: AbstractInterface,\n insight: Insight,\n opts: {\n taskCache?: TaskCache;\n onTaskStart?: ExecutionTaskProgressOptions['onTaskStart'];\n },\n ) {\n this.interface = interfaceInstance;\n this.insight = insight;\n this.taskCache = opts.taskCache;\n this.onTaskStartCallback = opts?.onTaskStart;\n }\n\n private async recordScreenshot(timing: ExecutionRecorderItem['timing']) {\n const base64 = await this.interface.screenshotBase64();\n const item: ExecutionRecorderItem = {\n type: 'screenshot',\n ts: Date.now(),\n screenshot: base64,\n timing,\n };\n return item;\n }\n\n private async getElementXpath(\n uiContext: UIContext<BaseElement>,\n element: LocateResultElement,\n ): Promise<string[] | undefined> {\n if (!(this.interface as any).getXpathsByPoint) {\n debug('getXpathsByPoint is not supported for this interface');\n return undefined;\n }\n\n let elementId = element?.id;\n if (element?.isOrderSensitive !== undefined) {\n try {\n const xpaths = await (this.interface as any).getXpathsByPoint(\n {\n left: element.center[0],\n top: element.center[1],\n },\n element?.isOrderSensitive,\n );\n\n return xpaths;\n } catch (error) {\n debug('getXpathsByPoint failed: %s', error);\n return undefined;\n }\n }\n\n // find the nearest xpath for the element\n if (element?.attributes?.nodeType === NodeType.POSITION) {\n await this.insight.contextRetrieverFn('locate');\n const info = elementByPositionWithElementInfo(\n uiContext.tree,\n {\n x: element.center[0],\n y: element.center[1],\n },\n {\n requireStrictDistance: false,\n filterPositionElements: true,\n },\n );\n if (info?.id) {\n elementId = info.id;\n } else {\n debug(\n 'no element id found for position node, will not update cache',\n element,\n );\n }\n }\n\n if (!elementId) {\n return undefined;\n }\n try {\n const result = await (this.interface as any).getXpathsById(elementId);\n return result;\n } catch (error) {\n debug('getXpathsById error: ', error);\n }\n }\n\n private prependExecutorWithScreenshot(\n taskApply: ExecutionTaskApply,\n appendAfterExecution = false,\n ): ExecutionTaskApply {\n const taskWithScreenshot: ExecutionTaskApply = {\n ...taskApply,\n executor: async (param, context, ...args) => {\n const recorder: ExecutionRecorderItem[] = [];\n const { task } = context;\n // set the recorder before executor in case of error\n task.recorder = recorder;\n const shot = await this.recordScreenshot(`before ${task.type}`);\n recorder.push(shot);\n\n const result = await taskApply.executor(param, context, ...args);\n\n if (appendAfterExecution) {\n const shot2 = await this.recordScreenshot('after Action');\n recorder.push(shot2);\n }\n return result;\n },\n };\n return taskWithScreenshot;\n }\n\n public async convertPlanToExecutable(\n plans: PlanningAction[],\n modelConfig: IModelConfig,\n ) {\n const tasks: ExecutionTaskApply[] = [];\n\n const taskForLocatePlan = (\n plan: PlanningAction<PlanningLocateParam>,\n detailedLocateParam: DetailedLocateParam | string,\n onResult?: (result: LocateResultElement) => void,\n ): ExecutionTaskInsightLocateApply => {\n if (typeof detailedLocateParam === 'string') {\n detailedLocateParam = {\n prompt: detailedLocateParam,\n };\n }\n const taskFind: ExecutionTaskInsightLocateApply = {\n type: 'Insight',\n subType: 'Locate',\n param: detailedLocateParam,\n thought: plan.thought,\n executor: async (param, taskContext) => {\n const { task } = taskContext;\n assert(\n param?.prompt || param?.id || param?.bbox,\n `No prompt or id or position or bbox to locate, param=${JSON.stringify(\n param,\n )}`,\n );\n let insightDump: InsightDump | undefined;\n let usage: AIUsageInfo | undefined;\n const dumpCollector: DumpSubscriber = (dump) => {\n insightDump = dump;\n usage = dump?.taskInfo?.usage;\n\n task.log = {\n dump: insightDump,\n };\n\n task.usage = usage;\n };\n this.insight.onceDumpUpdatedFn = dumpCollector;\n const shotTime = Date.now();\n\n // Get context through contextRetrieverFn which handles frozen context\n const uiContext = await this.insight.contextRetrieverFn('locate');\n task.uiContext = uiContext;\n\n const recordItem: ExecutionRecorderItem = {\n type: 'screenshot',\n ts: shotTime,\n screenshot: uiContext.screenshotBase64,\n timing: 'before Insight',\n };\n task.recorder = [recordItem];\n\n // try matching xpath\n const elementFromXpath =\n param.xpath && (this.interface as any).getElementInfoByXpath\n ? await (this.interface as any).getElementInfoByXpath(param.xpath)\n : undefined;\n const userExpectedPathHitFlag = !!elementFromXpath;\n\n // try matching cache\n const cachePrompt = param.prompt;\n const locateCacheRecord =\n this.taskCache?.matchLocateCache(cachePrompt);\n const xpaths = locateCacheRecord?.cacheContent?.xpaths;\n const elementFromCache = userExpectedPathHitFlag\n ? null\n : await matchElementFromCache(\n this,\n xpaths,\n cachePrompt,\n param.cacheable,\n );\n const cacheHitFlag = !!elementFromCache;\n\n // try matching plan\n const elementFromPlan =\n !userExpectedPathHitFlag && !cacheHitFlag\n ? matchElementFromPlan(param, uiContext.tree)\n : undefined;\n const planHitFlag = !!elementFromPlan;\n\n // try ai locate\n const elementFromAiLocate =\n !userExpectedPathHitFlag && !cacheHitFlag && !planHitFlag\n ? (\n await this.insight.locate(\n param,\n {\n // fallback to ai locate\n context: uiContext,\n },\n modelConfig,\n )\n ).element\n : undefined;\n const aiLocateHitFlag = !!elementFromAiLocate;\n\n const element =\n elementFromXpath || // highest priority\n elementFromCache || // second priority\n elementFromPlan || // third priority\n elementFromAiLocate;\n\n // update cache\n let currentXpaths: string[] | undefined;\n if (\n element &&\n this.taskCache &&\n !cacheHitFlag &&\n param?.cacheable !== false\n ) {\n const elementXpaths = await this.getElementXpath(\n uiContext,\n element,\n );\n if (elementXpaths?.length) {\n currentXpaths = elementXpaths;\n this.taskCache.updateOrAppendCacheRecord(\n {\n type: 'locate',\n prompt: cachePrompt,\n xpaths: elementXpaths,\n },\n locateCacheRecord,\n );\n } else {\n debug(\n 'no xpaths found, will not update cache',\n cachePrompt,\n elementXpaths,\n );\n }\n }\n if (!element) {\n throw new Error(`Element not found: ${param.prompt}`);\n }\n\n let hitBy: ExecutionTaskHitBy | undefined;\n\n if (userExpectedPathHitFlag) {\n hitBy = {\n from: 'User expected path',\n context: {\n xpath: param.xpath,\n },\n };\n } else if (cacheHitFlag) {\n hitBy = {\n from: 'Cache',\n context: {\n xpathsFromCache: xpaths,\n xpathsToSave: currentXpaths,\n },\n };\n } else if (planHitFlag) {\n hitBy = {\n from: 'Planning',\n context: {\n id: elementFromPlan?.id,\n bbox: elementFromPlan?.bbox,\n },\n };\n } else if (aiLocateHitFlag) {\n hitBy = {\n from: 'AI model',\n context: {\n prompt: param.prompt,\n },\n };\n }\n\n onResult?.(element);\n\n return {\n output: {\n element,\n },\n uiContext,\n hitBy,\n };\n },\n };\n return taskFind;\n };\n\n for (const plan of plans) {\n if (plan.type === 'Locate') {\n if (\n !plan.locate ||\n plan.locate === null ||\n plan.locate?.id === null ||\n plan.locate?.id === 'null'\n ) {\n debug('Locate action with id is null, will be ignored', plan);\n continue;\n }\n const taskLocate = taskForLocatePlan(plan, plan.locate);\n\n tasks.push(taskLocate);\n } else if (plan.type === 'Error') {\n const taskActionError: ExecutionTaskActionApply<PlanningActionParamError> =\n {\n type: 'Action',\n subType: 'Error',\n param: plan.param,\n thought: plan.thought || plan.param?.thought,\n locate: plan.locate,\n executor: async () => {\n throw new Error(\n plan?.thought || plan.param?.thought || 'error without thought',\n );\n },\n };\n tasks.push(taskActionError);\n } else if (plan.type === 'Finished') {\n const taskActionFinished: ExecutionTaskActionApply<null> = {\n type: 'Action',\n subType: 'Finished',\n param: null,\n thought: plan.thought,\n locate: plan.locate,\n executor: async (param) => {},\n };\n tasks.push(taskActionFinished);\n } else if (plan.type === 'Sleep') {\n const taskActionSleep: ExecutionTaskActionApply<PlanningActionParamSleep> =\n {\n type: 'Action',\n subType: 'Sleep',\n param: plan.param,\n thought: plan.thought,\n locate: plan.locate,\n executor: async (taskParam) => {\n await sleep(taskParam?.timeMs || 3000);\n },\n };\n tasks.push(taskActionSleep);\n } else {\n // action in action space\n const planType = plan.type;\n const actionSpace = await this.interface.actionSpace();\n const action = actionSpace.find((action) => action.name === planType);\n const param = plan.param;\n\n if (!action) {\n throw new Error(`Action type '${planType}' not found`);\n }\n\n // find all params that needs location\n const locateFields = action\n ? findAllMidsceneLocatorField(action.paramSchema)\n : [];\n\n const requiredLocateFields = action\n ? findAllMidsceneLocatorField(action.paramSchema, true)\n : [];\n\n locateFields.forEach((field) => {\n if (param[field]) {\n const locatePlan = locatePlanForLocate(param[field]);\n debug(\n 'will prepend locate param for field',\n `action.type=${planType}`,\n `param=${JSON.stringify(param[field])}`,\n `locatePlan=${JSON.stringify(locatePlan)}`,\n );\n const locateTask = taskForLocatePlan(\n locatePlan,\n param[field],\n (result) => {\n param[field] = result;\n },\n );\n tasks.push(locateTask);\n } else {\n assert(\n !requiredLocateFields.includes(field),\n `Required locate field '${field}' is not provided for action ${planType}`,\n );\n debug(`field '${field}' is not provided for action ${planType}`);\n }\n });\n\n const task: ExecutionTaskApply<\n 'Action',\n any,\n { success: boolean; action: string; param: any },\n void\n > = {\n type: 'Action',\n subType: planType,\n thought: plan.thought,\n param: plan.param,\n executor: async (param, context) => {\n debug(\n 'executing action',\n planType,\n param,\n `context.element.center: ${context.element?.center}`,\n );\n\n // Get context for actionSpace operations to ensure size info is available\n const uiContext = await this.insight.contextRetrieverFn('locate');\n context.task.uiContext = uiContext;\n\n requiredLocateFields.forEach((field) => {\n assert(\n param[field],\n `field '${field}' is required for action ${planType} but not provided. Cannot execute action ${planType}.`,\n );\n });\n\n try {\n await Promise.all([\n (async () => {\n if (this.interface.beforeInvokeAction) {\n debug('will call \"beforeInvokeAction\" for interface');\n await this.interface.beforeInvokeAction(action.name, param);\n debug('called \"beforeInvokeAction\" for interface');\n }\n })(),\n sleep(200),\n ]);\n } catch (originalError: any) {\n const originalMessage =\n originalError?.message || String(originalError);\n throw new Error(\n `error in running beforeInvokeAction for ${action.name}: ${originalMessage}`,\n { cause: originalError },\n );\n }\n\n debug('calling action', action.name);\n const actionFn = action.call.bind(this.interface);\n await actionFn(param, context);\n debug('called action', action.name);\n\n try {\n if (this.interface.afterInvokeAction) {\n debug('will call \"afterInvokeAction\" for interface');\n await this.interface.afterInvokeAction(action.name, param);\n debug('called \"afterInvokeAction\" for interface');\n }\n } catch (originalError: any) {\n const originalMessage =\n originalError?.message || String(originalError);\n throw new Error(\n `error in running afterInvokeAction for ${action.name}: ${originalMessage}`,\n { cause: originalError },\n );\n }\n // Return a proper result for report generation\n return {\n output: {\n success: true,\n action: planType,\n param: param,\n },\n };\n },\n };\n tasks.push(task);\n }\n }\n\n const wrappedTasks = tasks.map(\n (task: ExecutionTaskApply, index: number) => {\n if (task.type === 'Action') {\n return this.prependExecutorWithScreenshot(\n task,\n index === tasks.length - 1,\n );\n }\n return task;\n },\n );\n\n return {\n tasks: wrappedTasks,\n };\n }\n\n private async setupPlanningContext(executorContext: ExecutorContext) {\n const shotTime = Date.now();\n const uiContext = await this.insight.contextRetrieverFn('locate');\n const recordItem: ExecutionRecorderItem = {\n type: 'screenshot',\n ts: shotTime,\n screenshot: uiContext.screenshotBase64,\n timing: 'before Planning',\n };\n\n executorContext.task.recorder = [recordItem];\n (executorContext.task as ExecutionTaskPlanning).uiContext = uiContext;\n\n return {\n uiContext,\n };\n }\n\n async loadYamlFlowAsPlanning(userInstruction: string, yamlString: string) {\n const taskExecutor = new Executor(taskTitleStr('Action', userInstruction), {\n onTaskStart: this.onTaskStartCallback,\n });\n\n const task: ExecutionTaskPlanningApply = {\n type: 'Planning',\n subType: 'LoadYaml',\n locate: null,\n param: {\n userInstruction,\n },\n executor: async (param, executorContext) => {\n await this.setupPlanningContext(executorContext);\n return {\n output: {\n actions: [],\n more_actions_needed_by_instruction: false,\n log: '',\n yamlString,\n },\n cache: {\n hit: true,\n },\n hitBy: {\n from: 'Cache',\n context: {\n yamlString,\n },\n },\n };\n },\n };\n\n await taskExecutor.append(task);\n await taskExecutor.flush();\n\n return {\n executor: taskExecutor,\n };\n }\n\n private planningTaskFromPrompt(\n userInstruction: string,\n opts: {\n log?: string;\n actionContext?: string;\n modelConfig: IModelConfig;\n },\n ) {\n const { log, actionContext, modelConfig } = opts;\n const task: ExecutionTaskPlanningApply = {\n type: 'Planning',\n subType: 'Plan',\n locate: null,\n param: {\n userInstruction,\n log,\n },\n executor: async (param, executorContext) => {\n const startTime = Date.now();\n const { uiContext } = await this.setupPlanningContext(executorContext);\n\n assert(\n this.interface.actionSpace,\n 'actionSpace for device is not implemented',\n );\n const actionSpace = await this.interface.actionSpace();\n debug(\n 'actionSpace for this interface is:',\n actionSpace.map((action) => action.name).join(', '),\n );\n assert(Array.isArray(actionSpace), 'actionSpace must be an array');\n if (actionSpace.length === 0) {\n console.warn(\n `ActionSpace for ${this.interface.interfaceType} is empty. This may lead to unexpected behavior.`,\n );\n }\n\n const planResult = await plan(param.userInstruction, {\n context: uiContext,\n log: param.log,\n actionContext,\n interfaceType: this.interface.interfaceType as InterfaceType,\n actionSpace,\n modelConfig,\n });\n\n const {\n actions,\n log,\n more_actions_needed_by_instruction,\n error,\n usage,\n rawResponse,\n sleep,\n } = planResult;\n\n executorContext.task.log = {\n ...(executorContext.task.log || {}),\n rawResponse,\n };\n executorContext.task.usage = usage;\n\n const finalActions = actions || [];\n\n // TODO: check locate result\n // let bboxCollected = false;\n // (actions || []).reduce<PlanningAction[]>(\n // (acc, planningAction) => {\n // // TODO: magic field \"locate\" is used to indicate the action requires a locate\n // if (planningAction.locate) {\n // // we only collect bbox once, let qwen re-locate in the following steps\n // if (bboxCollected && planningAction.locate.bbox) {\n // // biome-ignore lint/performance/noDelete: <explanation>\n // delete planningAction.locate.bbox;\n // }\n\n // if (planningAction.locate.bbox) {\n // bboxCollected = true;\n // }\n\n // acc.push({\n // type: 'Locate',\n // locate: planningAction.locate,\n // param: null,\n // // thought is prompt created by ai, always a string\n // thought: planningAction.locate.prompt as string,\n // });\n // }\n // acc.push(planningAction);\n // return acc;\n // },\n // [],\n // );\n\n if (sleep) {\n const timeNow = Date.now();\n const timeRemaining = sleep - (timeNow - startTime);\n if (timeRemaining > 0) {\n finalActions.push({\n type: 'Sleep',\n param: {\n timeMs: timeRemaining,\n },\n locate: null,\n } as PlanningAction<PlanningActionParamSleep>);\n }\n }\n\n if (finalActions.length === 0) {\n assert(\n !more_actions_needed_by_instruction || sleep,\n error ? `Failed to plan: ${error}` : 'No plan found',\n );\n }\n\n return {\n output: {\n actions: finalActions,\n more_actions_needed_by_instruction,\n log,\n yamlFlow: planResult.yamlFlow,\n },\n cache: {\n hit: false,\n },\n uiContext,\n };\n },\n };\n\n return task;\n }\n\n private planningTaskToGoal(\n userInstruction: string,\n opts: {\n modelConfig: IModelConfig;\n },\n ) {\n const task: ExecutionTaskPlanningApply = {\n type: 'Planning',\n subType: 'Plan',\n locate: null,\n param: {\n userInstruction,\n },\n executor: async (param, executorContext) => {\n const { uiContext } = await this.setupPlanningContext(executorContext);\n const { modelConfig } = opts;\n const { uiTarsModelVersion } = modelConfig;\n\n const imagePayload = await resizeImageForUiTars(\n uiContext.screenshotBase64,\n uiContext.size,\n uiTarsModelVersion,\n );\n\n this.appendConversationHistory({\n role: 'user',\n content: [\n {\n type: 'image_url',\n image_url: {\n url: imagePayload,\n },\n },\n ],\n });\n const planResult: {\n actions: PlanningAction<any>[];\n action_summary: string;\n usage?: AIUsageInfo;\n yamlFlow?: MidsceneYamlFlowItem[];\n rawResponse?: string;\n } = await vlmPlanning({\n userInstruction: param.userInstruction,\n conversationHistory: this.conversationHistory,\n size: uiContext.size,\n modelConfig,\n });\n\n const { actions, action_summary, usage } = planResult;\n executorContext.task.log = {\n ...(executorContext.task.log || {}),\n rawResponse: planResult.rawResponse,\n };\n executorContext.task.usage = usage;\n this.appendConversationHistory({\n role: 'assistant',\n content: action_summary,\n });\n return {\n output: {\n actions,\n thought: actions[0]?.thought,\n actionType: actions[0].type,\n more_actions_needed_by_instruction: true,\n log: '',\n yamlFlow: planResult.yamlFlow,\n },\n cache: {\n hit: false,\n },\n };\n },\n };\n\n return task;\n }\n\n async runPlans(\n title: string,\n plans: PlanningAction[],\n modelConfig: IModelConfig,\n ): Promise<ExecutionResult> {\n const taskExecutor = new Executor(title, {\n onTaskStart: this.onTaskStartCallback,\n });\n const { tasks } = await this.convertPlanToExecutable(plans, modelConfig);\n await taskExecutor.append(tasks);\n const result = await taskExecutor.flush();\n const { output } = result!;\n return {\n output,\n executor: taskExecutor,\n };\n }\n\n async action(\n userPrompt: string,\n modelConfig: IModelConfig,\n actionContext?: string,\n ): Promise<\n ExecutionResult<\n | {\n yamlFlow?: MidsceneYamlFlowItem[]; // for cache use\n }\n | undefined\n >\n > {\n const taskExecutor = new Executor(taskTitleStr('Action', userPrompt), {\n onTaskStart: this.onTaskStartCallback,\n });\n\n let planningTask: ExecutionTaskPlanningApply | null =\n this.planningTaskFromPrompt(userPrompt, {\n log: undefined,\n actionContext,\n modelConfig,\n });\n let replanCount = 0;\n const logList: string[] = [];\n\n const yamlFlow: MidsceneYamlFlowItem[] = [];\n const replanningCycleLimit =\n globalConfigManager.getEnvConfigInNumber(\n MIDSCENE_REPLANNING_CYCLE_LIMIT,\n ) || defaultReplanningCycleLimit;\n while (planningTask) {\n if (replanCount > replanningCycleLimit) {\n const errorMsg =\n 'Replanning too many times, please split the task into multiple steps';\n\n return this.appendErrorPlan(taskExecutor, errorMsg, modelConfig);\n }\n\n // plan\n await taskExecutor.append(planningTask);\n const result = await taskExecutor.flush();\n const planResult: PlanningAIResponse = result?.output;\n if (taskExecutor.isInErrorState()) {\n return {\n output: planResult,\n executor: taskExecutor,\n };\n }\n\n const plans = planResult.actions || [];\n yamlFlow.push(...(planResult.yamlFlow || []));\n\n let executables: Awaited<ReturnType<typeof this.convertPlanToExecutable>>;\n try {\n executables = await this.convertPlanToExecutable(plans, modelConfig);\n taskExecutor.append(executables.tasks);\n } catch (error) {\n return this.appendErrorPlan(\n taskExecutor,\n `Error converting plans to executable tasks: ${error}, plans: ${JSON.stringify(\n plans,\n )}`,\n modelConfig,\n );\n }\n\n await taskExecutor.flush();\n if (taskExecutor.isInErrorState()) {\n return {\n output: undefined,\n executor: taskExecutor,\n };\n }\n if (planResult?.log) {\n logList.push(planResult.log);\n }\n\n if (!planResult.more_actions_needed_by_instruction) {\n planningTask = null;\n break;\n }\n planningTask = this.planningTaskFromPrompt(userPrompt, {\n log: logList.length > 0 ? `- ${logList.join('\\n- ')}` : undefined,\n actionContext,\n modelConfig,\n });\n replanCount++;\n }\n\n return {\n output: {\n yamlFlow,\n },\n executor: taskExecutor,\n };\n }\n\n async actionToGoal(\n userPrompt: string,\n modelConfig: IModelConfig,\n ): Promise<\n ExecutionResult<\n | {\n yamlFlow?: MidsceneYamlFlowItem[]; // for cache use\n }\n | undefined\n >\n > {\n const taskExecutor = new Executor(taskTitleStr('Action', userPrompt), {\n onTaskStart: this.onTaskStartCallback,\n });\n this.conversationHistory = [];\n const isCompleted = false;\n let currentActionCount = 0;\n const maxActionNumber = 40;\n\n const yamlFlow: MidsceneYamlFlowItem[] = [];\n while (!isCompleted && currentActionCount < maxActionNumber) {\n currentActionCount++;\n debug(\n 'actionToGoal, currentActionCount:',\n currentActionCount,\n 'userPrompt:',\n userPrompt,\n );\n\n const planningTask: ExecutionTaskPlanningApply = this.planningTaskToGoal(\n userPrompt,\n {\n modelConfig,\n },\n );\n await taskExecutor.append(planningTask);\n const result = await taskExecutor.flush();\n if (taskExecutor.isInErrorState()) {\n return {\n output: undefined,\n executor: taskExecutor,\n };\n }\n if (!result) {\n throw new Error(\n 'result of taskExecutor.flush() is undefined in function actionToGoal',\n );\n }\n const { output } = result;\n const plans = output.actions;\n yamlFlow.push(...(output.yamlFlow || []));\n let executables: Awaited<ReturnType<typeof this.convertPlanToExecutable>>;\n try {\n executables = await this.convertPlanToExecutable(plans, modelConfig);\n taskExecutor.append(executables.tasks);\n } catch (error) {\n return this.appendErrorPlan(\n taskExecutor,\n `Error converting plans to executable tasks: ${error}, plans: ${JSON.stringify(\n plans,\n )}`,\n modelConfig,\n );\n }\n\n await taskExecutor.flush();\n\n if (taskExecutor.isInErrorState()) {\n return {\n output: undefined,\n executor: taskExecutor,\n };\n }\n\n if (plans[0].type === 'Finished') {\n break;\n }\n }\n return {\n output: {\n yamlFlow,\n },\n executor: taskExecutor,\n };\n }\n\n private createTypeQueryTask(\n type: 'Query' | 'Boolean' | 'Number' | 'String' | 'Assert',\n demand: InsightExtractParam,\n modelConfig: IModelConfig,\n opt?: InsightExtractOption,\n multimodalPrompt?: TMultimodalPrompt,\n ) {\n const queryTask: ExecutionTaskInsightQueryApply = {\n type: 'Insight',\n subType: type,\n locate: null,\n param: {\n // TODO: display image thumbnail in report\n dataDemand: multimodalPrompt\n ? ({\n demand,\n multimodalPrompt,\n } as never)\n : demand, // for user param presentation in report right sidebar\n },\n executor: async (param, taskContext) => {\n const { task } = taskContext;\n let insightDump: InsightDump | undefined;\n const dumpCollector: DumpSubscriber = (dump) => {\n insightDump = dump;\n };\n this.insight.onceDumpUpdatedFn = dumpCollector;\n\n // Get context for query operations\n const shotTime = Date.now();\n const uiContext = await this.insight.contextRetrieverFn('extract');\n task.uiContext = uiContext;\n\n const recordItem: ExecutionRecorderItem = {\n type: 'screenshot',\n ts: shotTime,\n screenshot: uiContext.screenshotBase64,\n timing: 'before Extract',\n };\n task.recorder = [recordItem];\n\n const ifTypeRestricted = type !== 'Query';\n let demandInput = demand;\n if (ifTypeRestricted) {\n const returnType = type === 'Assert' ? 'Boolean' : type;\n demandInput = {\n result: `${returnType}, ${demand}`,\n };\n }\n\n const { data, usage, thought } = await this.insight.extract<any>(\n demandInput,\n modelConfig,\n opt,\n multimodalPrompt,\n );\n\n let outputResult = data;\n if (ifTypeRestricted) {\n // If AI returned a plain string instead of structured format, use it directly\n if (typeof data === 'string') {\n outputResult = data;\n } else {\n assert(data?.result !== undefined, 'No result in query data');\n outputResult = (data as any).result;\n }\n }\n\n return {\n output: outputResult,\n log: { dump: insightDump, isWaitForAssert: opt?.isWaitForAssert },\n usage,\n thought,\n };\n },\n };\n\n return queryTask;\n }\n async createTypeQueryExecution<T>(\n type: 'Query' | 'Boolean' | 'Number' | 'String' | 'Assert',\n demand: InsightExtractParam,\n modelConfig: IModelConfig,\n opt?: InsightExtractOption,\n multimodalPrompt?: TMultimodalPrompt,\n ): Promise<ExecutionResult<T>> {\n const taskExecutor = new Executor(\n taskTitleStr(\n type,\n typeof demand === 'string' ? demand : JSON.stringify(demand),\n ),\n {\n onTaskStart: this.onTaskStartCallback,\n },\n );\n\n const queryTask = await this.createTypeQueryTask(\n type,\n demand,\n modelConfig,\n opt,\n multimodalPrompt,\n );\n\n await taskExecutor.append(this.prependExecutorWithScreenshot(queryTask));\n const result = await taskExecutor.flush();\n\n if (!result) {\n throw new Error(\n 'result of taskExecutor.flush() is undefined in function createTypeQueryTask',\n );\n }\n\n const { output, thought } = result;\n\n return {\n output,\n thought,\n executor: taskExecutor,\n };\n }\n\n async assert(\n assertion: TUserPrompt,\n modelConfig: IModelConfig,\n opt?: InsightExtractOption,\n ): Promise<ExecutionResult<boolean>> {\n const { textPrompt, multimodalPrompt } = parsePrompt(assertion);\n return await this.createTypeQueryExecution<boolean>(\n 'Assert',\n textPrompt,\n modelConfig,\n opt,\n multimodalPrompt,\n );\n }\n\n /**\n * Append a message to the conversation history\n * For user messages with images:\n * - Keep max 4 user image messages in history\n * - Remove oldest user image message when limit reached\n * For assistant messages:\n * - Simply append to history\n * @param conversationHistory Message to append\n */\n private appendConversationHistory(\n conversationHistory: ChatCompletionMessageParam,\n ) {\n if (conversationHistory.role === 'user') {\n // Get all existing user messages with images\n const userImgItems = this.conversationHistory.filter(\n (item) => item.role === 'user',\n );\n\n // If we already have 4 user image messages\n if (userImgItems.length >= 4 && conversationHistory.role === 'user') {\n // Remove first user image message when we already have 4, before adding new one\n const firstUserImgIndex = this.conversationHistory.findIndex(\n (item) => item.role === 'user',\n );\n if (firstUserImgIndex >= 0) {\n this.conversationHistory.splice(firstUserImgIndex, 1);\n }\n }\n }\n // For non-user messages, simply append to history\n this.conversationHistory.push(conversationHistory);\n }\n\n private async appendErrorPlan(\n taskExecutor: Executor,\n errorMsg: string,\n modelConfig: IModelConfig,\n ) {\n const errorPlan: PlanningAction<PlanningActionParamError> = {\n type: 'Error',\n param: {\n thought: errorMsg,\n },\n locate: null,\n };\n const { tasks } = await this.convertPlanToExecutable(\n [errorPlan],\n modelConfig,\n );\n await taskExecutor.append(this.prependExecutorWithScreenshot(tasks[0]));\n await taskExecutor.flush();\n\n return {\n output: undefined,\n executor: taskExecutor,\n };\n }\n\n async waitFor(\n assertion: TUserPrompt,\n opt: PlanningActionParamWaitFor,\n modelConfig: IModelConfig,\n ): Promise<ExecutionResult<void>> {\n const { textPrompt, multimodalPrompt } = parsePrompt(assertion);\n\n const description = `waitFor: ${textPrompt}`;\n const taskExecutor = new Executor(taskTitleStr('WaitFor', description), {\n onTaskStart: this.onTaskStartCallback,\n });\n const { timeoutMs, checkIntervalMs } = opt;\n\n assert(assertion, 'No assertion for waitFor');\n assert(timeoutMs, 'No timeoutMs for waitFor');\n assert(checkIntervalMs, 'No checkIntervalMs for waitFor');\n\n assert(\n checkIntervalMs <= timeoutMs,\n `wrong config for waitFor: checkIntervalMs must be less than timeoutMs, config: {checkIntervalMs: ${checkIntervalMs}, timeoutMs: ${timeoutMs}}`,\n );\n\n const overallStartTime = Date.now();\n let startTime = Date.now();\n let errorThought = '';\n while (Date.now() - overallStartTime < timeoutMs) {\n startTime = Date.now();\n const queryTask = await this.createTypeQueryTask(\n 'Assert',\n textPrompt,\n modelConfig,\n {\n isWaitForAssert: true,\n returnThought: true,\n doNotThrowError: true,\n },\n multimodalPrompt,\n );\n\n await taskExecutor.append(this.prependExecutorWithScreenshot(queryTask));\n const result = (await taskExecutor.flush()) as {\n output: boolean;\n thought?: string;\n };\n\n if (!result) {\n throw new Error(\n 'result of taskExecutor.flush() is undefined in function waitFor',\n );\n }\n\n if (result?.output) {\n return {\n output: undefined,\n executor: taskExecutor,\n };\n }\n\n errorThought =\n result?.thought ||\n `unknown error when waiting for assertion: ${textPrompt}`;\n const now = Date.now();\n if (now - startTime < checkIntervalMs) {\n const timeRemaining = checkIntervalMs - (now - startTime);\n const sleepPlan: PlanningAction<PlanningActionParamSleep> = {\n type: 'Sleep',\n param: {\n timeMs: timeRemaining,\n },\n locate: null,\n };\n const { tasks: sleepTasks } = await this.convertPlanToExecutable(\n [sleepPlan],\n modelConfig,\n );\n await taskExecutor.append(\n this.prependExecutorWithScreenshot(sleepTasks[0]),\n );\n await taskExecutor.flush();\n }\n }\n\n return this.appendErrorPlan(\n taskExecutor,\n `waitFor timeout: ${errorThought}`,\n modelConfig,\n );\n }\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","debug","getDebug","defaultReplanningCycleLimit","locatePlanForLocate","param","locate","locatePlan","TaskExecutor","timing","base64","item","Date","uiContext","element","_element_attributes","elementId","undefined","xpaths","error","NodeType","info","elementByPositionWithElementInfo","result","taskApply","appendAfterExecution","taskWithScreenshot","context","args","recorder","task","shot","shot2","plans","modelConfig","tasks","taskForLocatePlan","plan","detailedLocateParam","onResult","taskFind","taskContext","_this_taskCache","_locateCacheRecord_cacheContent","assert","JSON","insightDump","usage","dumpCollector","dump","_dump_taskInfo","shotTime","recordItem","elementFromXpath","userExpectedPathHitFlag","cachePrompt","locateCacheRecord","elementFromCache","matchElementFromCache","cacheHitFlag","elementFromPlan","matchElementFromPlan","planHitFlag","elementFromAiLocate","aiLocateHitFlag","currentXpaths","elementXpaths","Error","hitBy","_plan_locate","_plan_locate1","taskLocate","_plan_param","taskActionError","taskActionFinished","taskActionSleep","taskParam","sleep","planType","actionSpace","action","locateFields","findAllMidsceneLocatorField","requiredLocateFields","field","locateTask","_context_element","Promise","originalError","originalMessage","String","actionFn","wrappedTasks","index","executorContext","userInstruction","yamlString","taskExecutor","Executor","taskTitleStr","opts","log","actionContext","startTime","Array","console","planResult","actions","more_actions_needed_by_instruction","rawResponse","finalActions","timeNow","timeRemaining","_actions_","uiTarsModelVersion","imagePayload","resizeImageForUiTars","vlmPlanning","action_summary","title","output","userPrompt","planningTask","replanCount","logList","yamlFlow","replanningCycleLimit","globalConfigManager","MIDSCENE_REPLANNING_CYCLE_LIMIT","errorMsg","executables","isCompleted","currentActionCount","maxActionNumber","type","demand","opt","multimodalPrompt","queryTask","ifTypeRestricted","demandInput","returnType","data","thought","outputResult","assertion","textPrompt","parsePrompt","conversationHistory","userImgItems","firstUserImgIndex","errorPlan","description","timeoutMs","checkIntervalMs","overallStartTime","errorThought","now","sleepPlan","sleepTasks","interfaceInstance","insight"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"agent/tasks.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/tasks.ts"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import {\n type ChatCompletionMessageParam,\n elementByPositionWithElementInfo,\n findAllMidsceneLocatorField,\n resizeImageForUiTars,\n vlmPlanning,\n} from '@/ai-model';\nimport type { AbstractInterface } from '@/device';\nimport {\n type AIUsageInfo,\n type BaseElement,\n type DetailedLocateParam,\n type DumpSubscriber,\n type ExecutionRecorderItem,\n type ExecutionTaskActionApply,\n type ExecutionTaskApply,\n type ExecutionTaskHitBy,\n type ExecutionTaskInsightLocateApply,\n type ExecutionTaskInsightQueryApply,\n type ExecutionTaskPlanning,\n type ExecutionTaskPlanningApply,\n type ExecutionTaskProgressOptions,\n Executor,\n type ExecutorContext,\n type Insight,\n type InsightDump,\n type InsightExtractOption,\n type InsightExtractParam,\n type InterfaceType,\n type LocateResultElement,\n type MidsceneYamlFlowItem,\n type PlanningAIResponse,\n type PlanningAction,\n type PlanningActionParamError,\n type PlanningActionParamSleep,\n type PlanningActionParamWaitFor,\n type PlanningLocateParam,\n type TMultimodalPrompt,\n type TUserPrompt,\n type UIContext,\n plan,\n} from '@/index';\nimport { sleep } from '@/utils';\nimport { NodeType } from '@midscene/shared/constants';\nimport {\n type IModelPreferences,\n MIDSCENE_REPLANNING_CYCLE_LIMIT,\n globalConfigManager,\n} from '@midscene/shared/env';\nimport { getDebug } from '@midscene/shared/logger';\nimport { assert } from '@midscene/shared/utils';\nimport type { TaskCache } from './task-cache';\nimport { taskTitleStr } from './ui-utils';\nimport {\n matchElementFromCache,\n matchElementFromPlan,\n parsePrompt,\n} from './utils';\n\ninterface ExecutionResult<OutputType = any> {\n output: OutputType;\n thought?: string;\n executor: Executor;\n}\n\nconst debug = getDebug('device-task-executor');\nconst defaultReplanningCycleLimit = 10;\n\nexport function locatePlanForLocate(param: string | DetailedLocateParam) {\n const locate = typeof param === 'string' ? { prompt: param } : param;\n const locatePlan: PlanningAction<PlanningLocateParam> = {\n type: 'Locate',\n locate,\n param: locate,\n thought: '',\n };\n return locatePlan;\n}\n\nexport class TaskExecutor {\n interface: AbstractInterface;\n\n insight: Insight;\n\n taskCache?: TaskCache;\n\n conversationHistory: ChatCompletionMessageParam[] = [];\n\n onTaskStartCallback?: ExecutionTaskProgressOptions['onTaskStart'];\n\n // @deprecated use .interface instead\n get page() {\n return this.interface;\n }\n\n constructor(\n interfaceInstance: AbstractInterface,\n insight: Insight,\n opts: {\n taskCache?: TaskCache;\n onTaskStart?: ExecutionTaskProgressOptions['onTaskStart'];\n },\n ) {\n this.interface = interfaceInstance;\n this.insight = insight;\n this.taskCache = opts.taskCache;\n this.onTaskStartCallback = opts?.onTaskStart;\n }\n\n private async recordScreenshot(timing: ExecutionRecorderItem['timing']) {\n const base64 = await this.interface.screenshotBase64();\n const item: ExecutionRecorderItem = {\n type: 'screenshot',\n ts: Date.now(),\n screenshot: base64,\n timing,\n };\n return item;\n }\n\n private async getElementXpath(\n uiContext: UIContext<BaseElement>,\n element: LocateResultElement,\n ): Promise<string[] | undefined> {\n if (!(this.interface as any).getXpathsByPoint) {\n debug('getXpathsByPoint is not supported for this interface');\n return undefined;\n }\n\n let elementId = element?.id;\n if (element?.isOrderSensitive !== undefined) {\n try {\n const xpaths = await (this.interface as any).getXpathsByPoint(\n {\n left: element.center[0],\n top: element.center[1],\n },\n element?.isOrderSensitive,\n );\n\n return xpaths;\n } catch (error) {\n debug('getXpathsByPoint failed: %s', error);\n return undefined;\n }\n }\n\n // find the nearest xpath for the element\n if (element?.attributes?.nodeType === NodeType.POSITION) {\n await this.insight.contextRetrieverFn('locate');\n const info = elementByPositionWithElementInfo(\n uiContext.tree,\n {\n x: element.center[0],\n y: element.center[1],\n },\n {\n requireStrictDistance: false,\n filterPositionElements: true,\n },\n );\n if (info?.id) {\n elementId = info.id;\n } else {\n debug(\n 'no element id found for position node, will not update cache',\n element,\n );\n }\n }\n\n if (!elementId) {\n return undefined;\n }\n try {\n const result = await (this.interface as any).getXpathsById(elementId);\n return result;\n } catch (error) {\n debug('getXpathsById error: ', error);\n }\n }\n\n private prependExecutorWithScreenshot(\n taskApply: ExecutionTaskApply,\n appendAfterExecution = false,\n ): ExecutionTaskApply {\n const taskWithScreenshot: ExecutionTaskApply = {\n ...taskApply,\n executor: async (param, context, ...args) => {\n const recorder: ExecutionRecorderItem[] = [];\n const { task } = context;\n // set the recorder before executor in case of error\n task.recorder = recorder;\n const shot = await this.recordScreenshot(`before ${task.type}`);\n recorder.push(shot);\n\n const result = await taskApply.executor(param, context, ...args);\n\n if (appendAfterExecution) {\n const shot2 = await this.recordScreenshot('after Action');\n recorder.push(shot2);\n }\n return result;\n },\n };\n return taskWithScreenshot;\n }\n\n public async convertPlanToExecutable(plans: PlanningAction[]) {\n const tasks: ExecutionTaskApply[] = [];\n\n const taskForLocatePlan = (\n plan: PlanningAction<PlanningLocateParam>,\n detailedLocateParam: DetailedLocateParam | string,\n onResult?: (result: LocateResultElement) => void,\n ): ExecutionTaskInsightLocateApply => {\n if (typeof detailedLocateParam === 'string') {\n detailedLocateParam = {\n prompt: detailedLocateParam,\n };\n }\n const taskFind: ExecutionTaskInsightLocateApply = {\n type: 'Insight',\n subType: 'Locate',\n param: detailedLocateParam,\n thought: plan.thought,\n executor: async (param, taskContext) => {\n const { task } = taskContext;\n assert(\n param?.prompt || param?.id || param?.bbox,\n `No prompt or id or position or bbox to locate, param=${JSON.stringify(\n param,\n )}`,\n );\n let insightDump: InsightDump | undefined;\n let usage: AIUsageInfo | undefined;\n const dumpCollector: DumpSubscriber = (dump) => {\n insightDump = dump;\n usage = dump?.taskInfo?.usage;\n\n task.log = {\n dump: insightDump,\n };\n\n task.usage = usage;\n };\n this.insight.onceDumpUpdatedFn = dumpCollector;\n const shotTime = Date.now();\n\n // Get context through contextRetrieverFn which handles frozen context\n const uiContext = await this.insight.contextRetrieverFn('locate');\n task.uiContext = uiContext;\n\n const recordItem: ExecutionRecorderItem = {\n type: 'screenshot',\n ts: shotTime,\n screenshot: uiContext.screenshotBase64,\n timing: 'before Insight',\n };\n task.recorder = [recordItem];\n\n // try matching xpath\n const elementFromXpath =\n param.xpath && (this.interface as any).getElementInfoByXpath\n ? await (this.interface as any).getElementInfoByXpath(param.xpath)\n : undefined;\n const userExpectedPathHitFlag = !!elementFromXpath;\n\n // try matching cache\n const cachePrompt = param.prompt;\n const locateCacheRecord =\n this.taskCache?.matchLocateCache(cachePrompt);\n const xpaths = locateCacheRecord?.cacheContent?.xpaths;\n const elementFromCache = userExpectedPathHitFlag\n ? null\n : await matchElementFromCache(\n this,\n xpaths,\n cachePrompt,\n param.cacheable,\n );\n const cacheHitFlag = !!elementFromCache;\n\n // try matching plan\n const elementFromPlan =\n !userExpectedPathHitFlag && !cacheHitFlag\n ? matchElementFromPlan(param, uiContext.tree)\n : undefined;\n const planHitFlag = !!elementFromPlan;\n\n // try ai locate\n const elementFromAiLocate =\n !userExpectedPathHitFlag && !cacheHitFlag && !planHitFlag\n ? (\n await this.insight.locate(param, {\n // fallback to ai locate\n context: uiContext,\n })\n ).element\n : undefined;\n const aiLocateHitFlag = !!elementFromAiLocate;\n\n const element =\n elementFromXpath || // highest priority\n elementFromCache || // second priority\n elementFromPlan || // third priority\n elementFromAiLocate;\n\n // update cache\n let currentXpaths: string[] | undefined;\n if (\n element &&\n this.taskCache &&\n !cacheHitFlag &&\n param?.cacheable !== false\n ) {\n const elementXpaths = await this.getElementXpath(\n uiContext,\n element,\n );\n if (elementXpaths?.length) {\n currentXpaths = elementXpaths;\n this.taskCache.updateOrAppendCacheRecord(\n {\n type: 'locate',\n prompt: cachePrompt,\n xpaths: elementXpaths,\n },\n locateCacheRecord,\n );\n } else {\n debug(\n 'no xpaths found, will not update cache',\n cachePrompt,\n elementXpaths,\n );\n }\n }\n if (!element) {\n throw new Error(`Element not found: ${param.prompt}`);\n }\n\n let hitBy: ExecutionTaskHitBy | undefined;\n\n if (userExpectedPathHitFlag) {\n hitBy = {\n from: 'User expected path',\n context: {\n xpath: param.xpath,\n },\n };\n } else if (cacheHitFlag) {\n hitBy = {\n from: 'Cache',\n context: {\n xpathsFromCache: xpaths,\n xpathsToSave: currentXpaths,\n },\n };\n } else if (planHitFlag) {\n hitBy = {\n from: 'Planning',\n context: {\n id: elementFromPlan?.id,\n bbox: elementFromPlan?.bbox,\n },\n };\n } else if (aiLocateHitFlag) {\n hitBy = {\n from: 'AI model',\n context: {\n prompt: param.prompt,\n },\n };\n }\n\n onResult?.(element);\n\n return {\n output: {\n element,\n },\n uiContext,\n hitBy,\n };\n },\n };\n return taskFind;\n };\n\n for (const plan of plans) {\n if (plan.type === 'Locate') {\n if (\n !plan.locate ||\n plan.locate === null ||\n plan.locate?.id === null ||\n plan.locate?.id === 'null'\n ) {\n debug('Locate action with id is null, will be ignored', plan);\n continue;\n }\n const taskLocate = taskForLocatePlan(plan, plan.locate);\n\n tasks.push(taskLocate);\n } else if (plan.type === 'Error') {\n const taskActionError: ExecutionTaskActionApply<PlanningActionParamError> =\n {\n type: 'Action',\n subType: 'Error',\n param: plan.param,\n thought: plan.thought || plan.param?.thought,\n locate: plan.locate,\n executor: async () => {\n throw new Error(\n plan?.thought || plan.param?.thought || 'error without thought',\n );\n },\n };\n tasks.push(taskActionError);\n } else if (plan.type === 'Finished') {\n const taskActionFinished: ExecutionTaskActionApply<null> = {\n type: 'Action',\n subType: 'Finished',\n param: null,\n thought: plan.thought,\n locate: plan.locate,\n executor: async (param) => {},\n };\n tasks.push(taskActionFinished);\n } else if (plan.type === 'Sleep') {\n const taskActionSleep: ExecutionTaskActionApply<PlanningActionParamSleep> =\n {\n type: 'Action',\n subType: 'Sleep',\n param: plan.param,\n thought: plan.thought,\n locate: plan.locate,\n executor: async (taskParam) => {\n await sleep(taskParam?.timeMs || 3000);\n },\n };\n tasks.push(taskActionSleep);\n } else {\n // action in action space\n const planType = plan.type;\n const actionSpace = await this.interface.actionSpace();\n const action = actionSpace.find((action) => action.name === planType);\n const param = plan.param;\n\n if (!action) {\n throw new Error(`Action type '${planType}' not found`);\n }\n\n // find all params that needs location\n const locateFields = action\n ? findAllMidsceneLocatorField(action.paramSchema)\n : [];\n\n const requiredLocateFields = action\n ? findAllMidsceneLocatorField(action.paramSchema, true)\n : [];\n\n locateFields.forEach((field) => {\n if (param[field]) {\n const locatePlan = locatePlanForLocate(param[field]);\n debug(\n 'will prepend locate param for field',\n `action.type=${planType}`,\n `param=${JSON.stringify(param[field])}`,\n `locatePlan=${JSON.stringify(locatePlan)}`,\n );\n const locateTask = taskForLocatePlan(\n locatePlan,\n param[field],\n (result) => {\n param[field] = result;\n },\n );\n tasks.push(locateTask);\n } else {\n assert(\n !requiredLocateFields.includes(field),\n `Required locate field '${field}' is not provided for action ${planType}`,\n );\n debug(`field '${field}' is not provided for action ${planType}`);\n }\n });\n\n const task: ExecutionTaskApply<\n 'Action',\n any,\n { success: boolean; action: string; param: any },\n void\n > = {\n type: 'Action',\n subType: planType,\n thought: plan.thought,\n param: plan.param,\n executor: async (param, context) => {\n debug(\n 'executing action',\n planType,\n param,\n `context.element.center: ${context.element?.center}`,\n );\n\n // Get context for actionSpace operations to ensure size info is available\n const uiContext = await this.insight.contextRetrieverFn('locate');\n context.task.uiContext = uiContext;\n\n requiredLocateFields.forEach((field) => {\n assert(\n param[field],\n `field '${field}' is required for action ${planType} but not provided. Cannot execute action ${planType}.`,\n );\n });\n\n try {\n await Promise.all([\n (async () => {\n if (this.interface.beforeInvokeAction) {\n debug('will call \"beforeInvokeAction\" for interface');\n await this.interface.beforeInvokeAction(action.name, param);\n debug('called \"beforeInvokeAction\" for interface');\n }\n })(),\n sleep(200),\n ]);\n } catch (originalError: any) {\n const originalMessage =\n originalError?.message || String(originalError);\n throw new Error(\n `error in running beforeInvokeAction for ${action.name}: ${originalMessage}`,\n { cause: originalError },\n );\n }\n\n debug('calling action', action.name);\n const actionFn = action.call.bind(this.interface);\n await actionFn(param, context);\n debug('called action', action.name);\n\n try {\n if (this.interface.afterInvokeAction) {\n debug('will call \"afterInvokeAction\" for interface');\n await this.interface.afterInvokeAction(action.name, param);\n debug('called \"afterInvokeAction\" for interface');\n }\n } catch (originalError: any) {\n const originalMessage =\n originalError?.message || String(originalError);\n throw new Error(\n `error in running afterInvokeAction for ${action.name}: ${originalMessage}`,\n { cause: originalError },\n );\n }\n // Return a proper result for report generation\n return {\n output: {\n success: true,\n action: planType,\n param: param,\n },\n };\n },\n };\n tasks.push(task);\n }\n }\n\n const wrappedTasks = tasks.map(\n (task: ExecutionTaskApply, index: number) => {\n if (task.type === 'Action') {\n return this.prependExecutorWithScreenshot(\n task,\n index === tasks.length - 1,\n );\n }\n return task;\n },\n );\n\n return {\n tasks: wrappedTasks,\n };\n }\n\n private async setupPlanningContext(executorContext: ExecutorContext) {\n const shotTime = Date.now();\n const uiContext = await this.insight.contextRetrieverFn('locate');\n const recordItem: ExecutionRecorderItem = {\n type: 'screenshot',\n ts: shotTime,\n screenshot: uiContext.screenshotBase64,\n timing: 'before Planning',\n };\n\n executorContext.task.recorder = [recordItem];\n (executorContext.task as ExecutionTaskPlanning).uiContext = uiContext;\n\n return {\n uiContext,\n };\n }\n\n async loadYamlFlowAsPlanning(userInstruction: string, yamlString: string) {\n const taskExecutor = new Executor(taskTitleStr('Action', userInstruction), {\n onTaskStart: this.onTaskStartCallback,\n });\n\n const task: ExecutionTaskPlanningApply = {\n type: 'Planning',\n subType: 'LoadYaml',\n locate: null,\n param: {\n userInstruction,\n },\n executor: async (param, executorContext) => {\n await this.setupPlanningContext(executorContext);\n return {\n output: {\n actions: [],\n more_actions_needed_by_instruction: false,\n log: '',\n yamlString,\n },\n cache: {\n hit: true,\n },\n hitBy: {\n from: 'Cache',\n context: {\n yamlString,\n },\n },\n };\n },\n };\n\n await taskExecutor.append(task);\n await taskExecutor.flush();\n\n return {\n executor: taskExecutor,\n };\n }\n\n private planningTaskFromPrompt(\n userInstruction: string,\n log?: string,\n actionContext?: string,\n ) {\n const task: ExecutionTaskPlanningApply = {\n type: 'Planning',\n subType: 'Plan',\n locate: null,\n param: {\n userInstruction,\n log,\n },\n executor: async (param, executorContext) => {\n const startTime = Date.now();\n const { uiContext } = await this.setupPlanningContext(executorContext);\n\n assert(\n this.interface.actionSpace,\n 'actionSpace for device is not implemented',\n );\n const actionSpace = await this.interface.actionSpace();\n debug(\n 'actionSpace for this interface is:',\n actionSpace.map((action) => action.name).join(', '),\n );\n assert(Array.isArray(actionSpace), 'actionSpace must be an array');\n if (actionSpace.length === 0) {\n console.warn(\n `ActionSpace for ${this.interface.interfaceType} is empty. This may lead to unexpected behavior.`,\n );\n }\n\n const planResult = await plan(param.userInstruction, {\n context: uiContext,\n log: param.log,\n actionContext,\n interfaceType: this.interface.interfaceType as InterfaceType,\n actionSpace,\n });\n\n const {\n actions,\n log,\n more_actions_needed_by_instruction,\n error,\n usage,\n rawResponse,\n sleep,\n } = planResult;\n\n executorContext.task.log = {\n ...(executorContext.task.log || {}),\n rawResponse,\n };\n executorContext.task.usage = usage;\n\n const finalActions = actions || [];\n\n // TODO: check locate result\n // let bboxCollected = false;\n // (actions || []).reduce<PlanningAction[]>(\n // (acc, planningAction) => {\n // // TODO: magic field \"locate\" is used to indicate the action requires a locate\n // if (planningAction.locate) {\n // // we only collect bbox once, let qwen re-locate in the following steps\n // if (bboxCollected && planningAction.locate.bbox) {\n // // biome-ignore lint/performance/noDelete: <explanation>\n // delete planningAction.locate.bbox;\n // }\n\n // if (planningAction.locate.bbox) {\n // bboxCollected = true;\n // }\n\n // acc.push({\n // type: 'Locate',\n // locate: planningAction.locate,\n // param: null,\n // // thought is prompt created by ai, always a string\n // thought: planningAction.locate.prompt as string,\n // });\n // }\n // acc.push(planningAction);\n // return acc;\n // },\n // [],\n // );\n\n if (sleep) {\n const timeNow = Date.now();\n const timeRemaining = sleep - (timeNow - startTime);\n if (timeRemaining > 0) {\n finalActions.push({\n type: 'Sleep',\n param: {\n timeMs: timeRemaining,\n },\n locate: null,\n } as PlanningAction<PlanningActionParamSleep>);\n }\n }\n\n if (finalActions.length === 0) {\n assert(\n !more_actions_needed_by_instruction || sleep,\n error ? `Failed to plan: ${error}` : 'No plan found',\n );\n }\n\n return {\n output: {\n actions: finalActions,\n more_actions_needed_by_instruction,\n log,\n yamlFlow: planResult.yamlFlow,\n },\n cache: {\n hit: false,\n },\n uiContext,\n };\n },\n };\n\n return task;\n }\n\n private planningTaskToGoal(\n userInstruction: string,\n modelPreferences: IModelPreferences,\n ) {\n const task: ExecutionTaskPlanningApply = {\n type: 'Planning',\n subType: 'Plan',\n locate: null,\n param: {\n userInstruction,\n },\n executor: async (param, executorContext) => {\n const { uiContext } = await this.setupPlanningContext(executorContext);\n\n const imagePayload = await resizeImageForUiTars(\n uiContext.screenshotBase64,\n uiContext.size,\n modelPreferences,\n );\n\n this.appendConversationHistory({\n role: 'user',\n content: [\n {\n type: 'image_url',\n image_url: {\n url: imagePayload,\n },\n },\n ],\n });\n const planResult: {\n actions: PlanningAction<any>[];\n action_summary: string;\n usage?: AIUsageInfo;\n yamlFlow?: MidsceneYamlFlowItem[];\n rawResponse?: string;\n } = await vlmPlanning({\n userInstruction: param.userInstruction,\n conversationHistory: this.conversationHistory,\n size: uiContext.size,\n modelPreferences,\n });\n\n const { actions, action_summary, usage } = planResult;\n executorContext.task.log = {\n ...(executorContext.task.log || {}),\n rawResponse: planResult.rawResponse,\n };\n executorContext.task.usage = usage;\n this.appendConversationHistory({\n role: 'assistant',\n content: action_summary,\n });\n return {\n output: {\n actions,\n thought: actions[0]?.thought,\n actionType: actions[0].type,\n more_actions_needed_by_instruction: true,\n log: '',\n yamlFlow: planResult.yamlFlow,\n },\n cache: {\n hit: false,\n },\n };\n },\n };\n\n return task;\n }\n\n async runPlans(\n title: string,\n plans: PlanningAction[],\n ): Promise<ExecutionResult> {\n const taskExecutor = new Executor(title, {\n onTaskStart: this.onTaskStartCallback,\n });\n const { tasks } = await this.convertPlanToExecutable(plans);\n await taskExecutor.append(tasks);\n const result = await taskExecutor.flush();\n const { output } = result!;\n return {\n output,\n executor: taskExecutor,\n };\n }\n\n async action(\n userPrompt: string,\n actionContext?: string,\n ): Promise<\n ExecutionResult<\n | {\n yamlFlow?: MidsceneYamlFlowItem[]; // for cache use\n }\n | undefined\n >\n > {\n const taskExecutor = new Executor(taskTitleStr('Action', userPrompt), {\n onTaskStart: this.onTaskStartCallback,\n });\n\n let planningTask: ExecutionTaskPlanningApply | null =\n this.planningTaskFromPrompt(userPrompt, undefined, actionContext);\n let replanCount = 0;\n const logList: string[] = [];\n\n const yamlFlow: MidsceneYamlFlowItem[] = [];\n const replanningCycleLimit =\n globalConfigManager.getEnvConfigInNumber(\n MIDSCENE_REPLANNING_CYCLE_LIMIT,\n ) || defaultReplanningCycleLimit;\n while (planningTask) {\n if (replanCount > replanningCycleLimit) {\n const errorMsg =\n 'Replanning too many times, please split the task into multiple steps';\n\n return this.appendErrorPlan(taskExecutor, errorMsg);\n }\n\n // plan\n await taskExecutor.append(planningTask);\n const result = await taskExecutor.flush();\n const planResult: PlanningAIResponse = result?.output;\n if (taskExecutor.isInErrorState()) {\n return {\n output: planResult,\n executor: taskExecutor,\n };\n }\n\n const plans = planResult.actions || [];\n yamlFlow.push(...(planResult.yamlFlow || []));\n\n let executables: Awaited<ReturnType<typeof this.convertPlanToExecutable>>;\n try {\n executables = await this.convertPlanToExecutable(plans);\n taskExecutor.append(executables.tasks);\n } catch (error) {\n return this.appendErrorPlan(\n taskExecutor,\n `Error converting plans to executable tasks: ${error}, plans: ${JSON.stringify(\n plans,\n )}`,\n );\n }\n\n await taskExecutor.flush();\n if (taskExecutor.isInErrorState()) {\n return {\n output: undefined,\n executor: taskExecutor,\n };\n }\n if (planResult?.log) {\n logList.push(planResult.log);\n }\n\n if (!planResult.more_actions_needed_by_instruction) {\n planningTask = null;\n break;\n }\n planningTask = this.planningTaskFromPrompt(\n userPrompt,\n logList.length > 0 ? `- ${logList.join('\\n- ')}` : undefined,\n actionContext,\n );\n replanCount++;\n }\n\n return {\n output: {\n yamlFlow,\n },\n executor: taskExecutor,\n };\n }\n\n async actionToGoal(userPrompt: string): Promise<\n ExecutionResult<\n | {\n yamlFlow?: MidsceneYamlFlowItem[]; // for cache use\n }\n | undefined\n >\n > {\n const taskExecutor = new Executor(taskTitleStr('Action', userPrompt), {\n onTaskStart: this.onTaskStartCallback,\n });\n this.conversationHistory = [];\n const isCompleted = false;\n let currentActionCount = 0;\n const maxActionNumber = 40;\n\n const yamlFlow: MidsceneYamlFlowItem[] = [];\n while (!isCompleted && currentActionCount < maxActionNumber) {\n currentActionCount++;\n debug(\n 'actionToGoal, currentActionCount:',\n currentActionCount,\n 'userPrompt:',\n userPrompt,\n );\n const planningTask: ExecutionTaskPlanningApply = this.planningTaskToGoal(\n userPrompt,\n {\n intent: 'planning',\n },\n );\n await taskExecutor.append(planningTask);\n const result = await taskExecutor.flush();\n if (taskExecutor.isInErrorState()) {\n return {\n output: undefined,\n executor: taskExecutor,\n };\n }\n if (!result) {\n throw new Error(\n 'result of taskExecutor.flush() is undefined in function actionToGoal',\n );\n }\n const { output } = result;\n const plans = output.actions;\n yamlFlow.push(...(output.yamlFlow || []));\n let executables: Awaited<ReturnType<typeof this.convertPlanToExecutable>>;\n try {\n executables = await this.convertPlanToExecutable(plans);\n taskExecutor.append(executables.tasks);\n } catch (error) {\n return this.appendErrorPlan(\n taskExecutor,\n `Error converting plans to executable tasks: ${error}, plans: ${JSON.stringify(\n plans,\n )}`,\n );\n }\n\n await taskExecutor.flush();\n\n if (taskExecutor.isInErrorState()) {\n return {\n output: undefined,\n executor: taskExecutor,\n };\n }\n\n if (plans[0].type === 'Finished') {\n break;\n }\n }\n return {\n output: {\n yamlFlow,\n },\n executor: taskExecutor,\n };\n }\n\n private createTypeQueryTask(\n type: 'Query' | 'Boolean' | 'Number' | 'String' | 'Assert',\n demand: InsightExtractParam,\n opt?: InsightExtractOption,\n multimodalPrompt?: TMultimodalPrompt,\n ) {\n const queryTask: ExecutionTaskInsightQueryApply = {\n type: 'Insight',\n subType: type,\n locate: null,\n param: {\n // TODO: display image thumbnail in report\n dataDemand: multimodalPrompt\n ? ({\n demand,\n multimodalPrompt,\n } as never)\n : demand, // for user param presentation in report right sidebar\n },\n executor: async (param, taskContext) => {\n const { task } = taskContext;\n let insightDump: InsightDump | undefined;\n const dumpCollector: DumpSubscriber = (dump) => {\n insightDump = dump;\n };\n this.insight.onceDumpUpdatedFn = dumpCollector;\n\n // Get context for query operations\n const shotTime = Date.now();\n const uiContext = await this.insight.contextRetrieverFn('extract');\n task.uiContext = uiContext;\n\n const recordItem: ExecutionRecorderItem = {\n type: 'screenshot',\n ts: shotTime,\n screenshot: uiContext.screenshotBase64,\n timing: 'before Extract',\n };\n task.recorder = [recordItem];\n\n const ifTypeRestricted = type !== 'Query';\n let demandInput = demand;\n if (ifTypeRestricted) {\n const returnType = type === 'Assert' ? 'Boolean' : type;\n demandInput = {\n result: `${returnType}, ${demand}`,\n };\n }\n\n const { data, usage, thought } = await this.insight.extract<any>(\n demandInput,\n opt,\n multimodalPrompt,\n );\n\n let outputResult = data;\n if (ifTypeRestricted) {\n // If AI returned a plain string instead of structured format, use it directly\n if (typeof data === 'string') {\n outputResult = data;\n } else {\n assert(data?.result !== undefined, 'No result in query data');\n outputResult = (data as any).result;\n }\n }\n\n return {\n output: outputResult,\n log: { dump: insightDump, isWaitForAssert: opt?.isWaitForAssert },\n usage,\n thought,\n };\n },\n };\n\n return queryTask;\n }\n async createTypeQueryExecution<T>(\n type: 'Query' | 'Boolean' | 'Number' | 'String' | 'Assert',\n demand: InsightExtractParam,\n opt?: InsightExtractOption,\n multimodalPrompt?: TMultimodalPrompt,\n ): Promise<ExecutionResult<T>> {\n const taskExecutor = new Executor(\n taskTitleStr(\n type,\n typeof demand === 'string' ? demand : JSON.stringify(demand),\n ),\n {\n onTaskStart: this.onTaskStartCallback,\n },\n );\n\n const queryTask = await this.createTypeQueryTask(\n type,\n demand,\n opt,\n multimodalPrompt,\n );\n\n await taskExecutor.append(this.prependExecutorWithScreenshot(queryTask));\n const result = await taskExecutor.flush();\n\n if (!result) {\n throw new Error(\n 'result of taskExecutor.flush() is undefined in function createTypeQueryTask',\n );\n }\n\n const { output, thought } = result;\n\n return {\n output,\n thought,\n executor: taskExecutor,\n };\n }\n\n async assert(\n assertion: TUserPrompt,\n opt?: InsightExtractOption,\n ): Promise<ExecutionResult<boolean>> {\n const { textPrompt, multimodalPrompt } = parsePrompt(assertion);\n return await this.createTypeQueryExecution<boolean>(\n 'Assert',\n textPrompt,\n opt,\n multimodalPrompt,\n );\n }\n\n /**\n * Append a message to the conversation history\n * For user messages with images:\n * - Keep max 4 user image messages in history\n * - Remove oldest user image message when limit reached\n * For assistant messages:\n * - Simply append to history\n * @param conversationHistory Message to append\n */\n private appendConversationHistory(\n conversationHistory: ChatCompletionMessageParam,\n ) {\n if (conversationHistory.role === 'user') {\n // Get all existing user messages with images\n const userImgItems = this.conversationHistory.filter(\n (item) => item.role === 'user',\n );\n\n // If we already have 4 user image messages\n if (userImgItems.length >= 4 && conversationHistory.role === 'user') {\n // Remove first user image message when we already have 4, before adding new one\n const firstUserImgIndex = this.conversationHistory.findIndex(\n (item) => item.role === 'user',\n );\n if (firstUserImgIndex >= 0) {\n this.conversationHistory.splice(firstUserImgIndex, 1);\n }\n }\n }\n // For non-user messages, simply append to history\n this.conversationHistory.push(conversationHistory);\n }\n\n private async appendErrorPlan(taskExecutor: Executor, errorMsg: string) {\n const errorPlan: PlanningAction<PlanningActionParamError> = {\n type: 'Error',\n param: {\n thought: errorMsg,\n },\n locate: null,\n };\n const { tasks } = await this.convertPlanToExecutable([errorPlan]);\n await taskExecutor.append(this.prependExecutorWithScreenshot(tasks[0]));\n await taskExecutor.flush();\n\n return {\n output: undefined,\n executor: taskExecutor,\n };\n }\n\n async waitFor(\n assertion: TUserPrompt,\n opt: PlanningActionParamWaitFor,\n ): Promise<ExecutionResult<void>> {\n const { textPrompt, multimodalPrompt } = parsePrompt(assertion);\n\n const description = `waitFor: ${textPrompt}`;\n const taskExecutor = new Executor(taskTitleStr('WaitFor', description), {\n onTaskStart: this.onTaskStartCallback,\n });\n const { timeoutMs, checkIntervalMs } = opt;\n\n assert(assertion, 'No assertion for waitFor');\n assert(timeoutMs, 'No timeoutMs for waitFor');\n assert(checkIntervalMs, 'No checkIntervalMs for waitFor');\n\n assert(\n checkIntervalMs <= timeoutMs,\n `wrong config for waitFor: checkIntervalMs must be less than timeoutMs, config: {checkIntervalMs: ${checkIntervalMs}, timeoutMs: ${timeoutMs}}`,\n );\n\n const overallStartTime = Date.now();\n let startTime = Date.now();\n let errorThought = '';\n while (Date.now() - overallStartTime < timeoutMs) {\n startTime = Date.now();\n const queryTask = await this.createTypeQueryTask(\n 'Assert',\n textPrompt,\n {\n isWaitForAssert: true,\n returnThought: true,\n doNotThrowError: true,\n },\n multimodalPrompt,\n );\n\n await taskExecutor.append(this.prependExecutorWithScreenshot(queryTask));\n const result = (await taskExecutor.flush()) as {\n output: boolean;\n thought?: string;\n };\n\n if (!result) {\n throw new Error(\n 'result of taskExecutor.flush() is undefined in function waitFor',\n );\n }\n\n if (result?.output) {\n return {\n output: undefined,\n executor: taskExecutor,\n };\n }\n\n errorThought =\n result?.thought ||\n `unknown error when waiting for assertion: ${textPrompt}`;\n const now = Date.now();\n if (now - startTime < checkIntervalMs) {\n const timeRemaining = checkIntervalMs - (now - startTime);\n const sleepPlan: PlanningAction<PlanningActionParamSleep> = {\n type: 'Sleep',\n param: {\n timeMs: timeRemaining,\n },\n locate: null,\n };\n const { tasks: sleepTasks } = await this.convertPlanToExecutable([\n sleepPlan,\n ]);\n await taskExecutor.append(\n this.prependExecutorWithScreenshot(sleepTasks[0]),\n );\n await taskExecutor.flush();\n }\n }\n\n return this.appendErrorPlan(\n taskExecutor,\n `waitFor timeout: ${errorThought}`,\n );\n }\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","debug","getDebug","defaultReplanningCycleLimit","locatePlanForLocate","param","locate","locatePlan","TaskExecutor","timing","base64","item","Date","uiContext","element","_element_attributes","elementId","undefined","xpaths","error","NodeType","info","elementByPositionWithElementInfo","result","taskApply","appendAfterExecution","taskWithScreenshot","context","args","recorder","task","shot","shot2","plans","tasks","taskForLocatePlan","plan","detailedLocateParam","onResult","taskFind","taskContext","_this_taskCache","_locateCacheRecord_cacheContent","assert","JSON","insightDump","usage","dumpCollector","dump","_dump_taskInfo","shotTime","recordItem","elementFromXpath","userExpectedPathHitFlag","cachePrompt","locateCacheRecord","elementFromCache","matchElementFromCache","cacheHitFlag","elementFromPlan","matchElementFromPlan","planHitFlag","elementFromAiLocate","aiLocateHitFlag","currentXpaths","elementXpaths","Error","hitBy","_plan_locate","_plan_locate1","taskLocate","_plan_param","taskActionError","taskActionFinished","taskActionSleep","taskParam","sleep","planType","actionSpace","action","locateFields","findAllMidsceneLocatorField","requiredLocateFields","field","locateTask","_context_element","Promise","originalError","originalMessage","String","actionFn","wrappedTasks","index","executorContext","userInstruction","yamlString","taskExecutor","Executor","taskTitleStr","log","actionContext","startTime","Array","console","planResult","actions","more_actions_needed_by_instruction","rawResponse","finalActions","timeNow","timeRemaining","modelPreferences","_actions_","imagePayload","resizeImageForUiTars","vlmPlanning","action_summary","title","output","userPrompt","planningTask","replanCount","logList","yamlFlow","replanningCycleLimit","globalConfigManager","MIDSCENE_REPLANNING_CYCLE_LIMIT","errorMsg","executables","isCompleted","currentActionCount","maxActionNumber","type","demand","opt","multimodalPrompt","queryTask","ifTypeRestricted","demandInput","returnType","data","thought","outputResult","assertion","textPrompt","parsePrompt","conversationHistory","userImgItems","firstUserImgIndex","errorPlan","description","timeoutMs","checkIntervalMs","overallStartTime","errorThought","now","sleepPlan","sleepTasks","interfaceInstance","insight","opts"],"mappings":"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"}
|
package/dist/lib/agent/utils.js
CHANGED
|
@@ -55,7 +55,7 @@ const external_dayjs_namespaceObject = require("dayjs");
|
|
|
55
55
|
var external_dayjs_default = /*#__PURE__*/ __webpack_require__.n(external_dayjs_namespaceObject);
|
|
56
56
|
const external_task_cache_js_namespaceObject = require("./task-cache.js");
|
|
57
57
|
const debugProfile = (0, logger_namespaceObject.getDebug)('web:tool:profile');
|
|
58
|
-
async function commonContextParser(interfaceInstance
|
|
58
|
+
async function commonContextParser(interfaceInstance) {
|
|
59
59
|
var _interfaceInstance_describe;
|
|
60
60
|
(0, utils_namespaceObject.assert)(interfaceInstance, 'interfaceInstance is required');
|
|
61
61
|
debugProfile("Getting interface description");
|
|
@@ -63,8 +63,7 @@ async function commonContextParser(interfaceInstance, _opt) {
|
|
|
63
63
|
debugProfile("Interface description end");
|
|
64
64
|
debugProfile('Uploading test info to server');
|
|
65
65
|
(0, external_utils_js_namespaceObject.uploadTestInfoToServer)({
|
|
66
|
-
testUrl: description
|
|
67
|
-
serverUrl: _opt.uploadServerUrl
|
|
66
|
+
testUrl: description
|
|
68
67
|
});
|
|
69
68
|
debugProfile('UploadTestInfoToServer end');
|
|
70
69
|
let screenshotBase64 = await interfaceInstance.screenshotBase64();
|
|
@@ -186,7 +185,7 @@ function trimContextByViewport(execution) {
|
|
|
186
185
|
}) : execution.tasks
|
|
187
186
|
};
|
|
188
187
|
}
|
|
189
|
-
const getMidsceneVersion = ()=>"0.28.2
|
|
188
|
+
const getMidsceneVersion = ()=>"0.28.2";
|
|
190
189
|
const parsePrompt = (prompt)=>{
|
|
191
190
|
if ('string' == typeof prompt) return {
|
|
192
191
|
textPrompt: prompt,
|