@midscene/core 1.16.5 → 1.16.6-beta-20261023073257.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/es/agent/agent.mjs +11 -11
- package/dist/es/agent/agent.mjs.map +1 -1
- package/dist/es/agent/insight.mjs.map +1 -1
- package/dist/es/agent/tasks.mjs +72 -39
- package/dist/es/agent/tasks.mjs.map +1 -1
- package/dist/es/agent/utils.mjs +1 -1
- package/dist/es/ai-model/connectivity/run-connectivity-test.mjs +27 -22
- package/dist/es/ai-model/connectivity/run-connectivity-test.mjs.map +1 -1
- package/dist/es/ai-model/index.mjs +2 -2
- package/dist/es/ai-model/model-adapter/resolve.mjs +4 -2
- package/dist/es/ai-model/model-adapter/resolve.mjs.map +1 -1
- package/dist/es/ai-model/models/jev/adapter.mjs +6 -110
- package/dist/es/ai-model/models/jev/adapter.mjs.map +1 -1
- package/dist/es/ai-model/models/jev/boolean.mjs +48 -0
- package/dist/es/ai-model/models/jev/boolean.mjs.map +1 -0
- package/dist/es/ai-model/models/jev/image.mjs +39 -36
- package/dist/es/ai-model/models/jev/image.mjs.map +1 -1
- package/dist/es/ai-model/models/jev/locate.mjs +48 -0
- package/dist/es/ai-model/models/jev/locate.mjs.map +1 -0
- package/dist/es/ai-model/models/jev/planning-action.mjs +35 -0
- package/dist/es/ai-model/models/jev/planning-action.mjs.map +1 -0
- package/dist/es/ai-model/models/jev/planning-context.mjs +38 -0
- package/dist/es/ai-model/models/jev/planning-context.mjs.map +1 -0
- package/dist/es/ai-model/models/jev/planning-decision.mjs +68 -0
- package/dist/es/ai-model/models/jev/planning-decision.mjs.map +1 -0
- package/dist/es/ai-model/models/jev/planning.mjs +19 -131
- package/dist/es/ai-model/models/jev/planning.mjs.map +1 -1
- package/dist/es/ai-model/models/model-fallback.mjs +28 -0
- package/dist/es/ai-model/models/model-fallback.mjs.map +1 -0
- package/dist/es/ai-model/service-caller/call-ai.mjs +27 -24
- package/dist/es/ai-model/service-caller/call-ai.mjs.map +1 -1
- package/dist/es/ai-model/service-caller/codex/call-codex.mjs.map +1 -1
- package/dist/es/ai-model/service-caller/index.mjs +2 -2
- package/dist/es/ai-model/service-caller/model-call.mjs +3 -3
- package/dist/es/ai-model/service-caller/model-call.mjs.map +1 -1
- package/dist/es/ai-model/service-caller/openai/call-openai.mjs +1 -1
- package/dist/es/ai-model/service-caller/openai/call-openai.mjs.map +1 -1
- package/dist/es/ai-model/service-caller/openai/chat-completion/chat-completion.mjs.map +1 -1
- package/dist/es/ai-model/service-caller/openai/openai-client.mjs.map +1 -1
- package/dist/es/ai-model/service-caller/openai/responses/responses.mjs.map +1 -1
- package/dist/es/ai-model/service-caller/system-one/call-system-one.mjs +69 -0
- package/dist/es/ai-model/service-caller/system-one/call-system-one.mjs.map +1 -0
- package/dist/es/ai-model/service-caller/system-one/index.mjs +3 -0
- package/dist/es/ai-model/service-caller/system-one/prepare-system-one.mjs +44 -0
- package/dist/es/ai-model/service-caller/system-one/prepare-system-one.mjs.map +1 -0
- package/dist/es/ai-model/service-caller/system-one/schema.mjs +32 -0
- package/dist/es/ai-model/service-caller/system-one/schema.mjs.map +1 -0
- package/dist/es/ai-model/service-caller/system-one/utils.mjs +34 -0
- package/dist/es/ai-model/service-caller/system-one/utils.mjs.map +1 -0
- package/dist/es/ai-model/service-caller/utils.mjs +2 -2
- package/dist/es/ai-model/service-caller/utils.mjs.map +1 -1
- package/dist/es/ai-model/shared/model-locate-result/factory.mjs +7 -3
- package/dist/es/ai-model/shared/model-locate-result/factory.mjs.map +1 -1
- package/dist/es/ai-model/shared/model-locate-result/pixel-mapper.mjs +10 -4
- package/dist/es/ai-model/shared/model-locate-result/pixel-mapper.mjs.map +1 -1
- package/dist/es/ai-model/shared/model-locate-result/types.mjs.map +1 -1
- package/dist/es/ai-model/shared/model-locate-result/validation.mjs +4 -0
- package/dist/es/ai-model/shared/model-locate-result/validation.mjs.map +1 -1
- package/dist/es/ai-model/workflows/grounding/locate.mjs +2 -2
- package/dist/es/ai-model/workflows/grounding/locate.mjs.map +1 -1
- package/dist/es/ai-model/workflows/grounding/section-locate.mjs +2 -2
- package/dist/es/ai-model/workflows/grounding/section-locate.mjs.map +1 -1
- package/dist/es/ai-model/workflows/insight/boolean.mjs +1 -1
- package/dist/es/ai-model/workflows/insight/boolean.mjs.map +1 -1
- package/dist/es/ai-model/workflows/insight/extraction.mjs +3 -3
- package/dist/es/ai-model/workflows/insight/extraction.mjs.map +1 -1
- package/dist/es/ai-model/workflows/planning/standard-planning.mjs +4 -3
- package/dist/es/ai-model/workflows/planning/standard-planning.mjs.map +1 -1
- package/dist/es/ai-model/workflows/recorder-generation/playwright.mjs +2 -2
- package/dist/es/ai-model/workflows/recorder-generation/playwright.mjs.map +1 -1
- package/dist/es/ai-model/workflows/recorder-generation/yaml.mjs +2 -2
- package/dist/es/ai-model/workflows/recorder-generation/yaml.mjs.map +1 -1
- package/dist/es/device/index.mjs +7 -0
- package/dist/es/device/index.mjs.map +1 -1
- package/dist/es/report-html-template.mjs +1 -1
- package/dist/es/service/index.mjs +2 -1
- package/dist/es/service/index.mjs.map +1 -1
- package/dist/es/types.mjs.map +1 -1
- package/dist/es/utils.mjs +1 -1
- package/dist/lib/agent/agent.js +11 -11
- package/dist/lib/agent/agent.js.map +1 -1
- package/dist/lib/agent/insight.js.map +1 -1
- package/dist/lib/agent/tasks.js +72 -39
- package/dist/lib/agent/tasks.js.map +1 -1
- package/dist/lib/agent/utils.js +1 -1
- package/dist/lib/ai-model/connectivity/run-connectivity-test.js +27 -22
- package/dist/lib/ai-model/connectivity/run-connectivity-test.js.map +1 -1
- package/dist/lib/ai-model/index.js +6 -3
- package/dist/lib/ai-model/model-adapter/resolve.js +4 -2
- package/dist/lib/ai-model/model-adapter/resolve.js.map +1 -1
- package/dist/lib/ai-model/models/jev/adapter.js +6 -110
- package/dist/lib/ai-model/models/jev/adapter.js.map +1 -1
- package/dist/lib/ai-model/models/jev/boolean.js +82 -0
- package/dist/lib/ai-model/models/jev/boolean.js.map +1 -0
- package/dist/lib/ai-model/models/jev/image.js +41 -35
- package/dist/lib/ai-model/models/jev/image.js.map +1 -1
- package/dist/lib/ai-model/models/jev/locate.js +82 -0
- package/dist/lib/ai-model/models/jev/locate.js.map +1 -0
- package/dist/lib/ai-model/models/jev/planning-action.js +69 -0
- package/dist/lib/ai-model/models/jev/planning-action.js.map +1 -0
- package/dist/lib/ai-model/models/jev/planning-context.js +72 -0
- package/dist/lib/ai-model/models/jev/planning-context.js.map +1 -0
- package/dist/lib/ai-model/models/jev/planning-decision.js +102 -0
- package/dist/lib/ai-model/models/jev/planning-decision.js.map +1 -0
- package/dist/lib/ai-model/models/jev/planning.js +19 -131
- package/dist/lib/ai-model/models/jev/planning.js.map +1 -1
- package/dist/lib/ai-model/models/{task-routing.js → model-fallback.js} +11 -11
- package/dist/lib/ai-model/models/model-fallback.js.map +1 -0
- package/dist/lib/ai-model/service-caller/call-ai.js +32 -26
- package/dist/lib/ai-model/service-caller/call-ai.js.map +1 -1
- package/dist/lib/ai-model/service-caller/codex/call-codex.js.map +1 -1
- package/dist/lib/ai-model/service-caller/index.js +6 -3
- package/dist/lib/ai-model/service-caller/model-call.js +2 -2
- package/dist/lib/ai-model/service-caller/model-call.js.map +1 -1
- package/dist/lib/ai-model/service-caller/openai/call-openai.js +1 -1
- package/dist/lib/ai-model/service-caller/openai/call-openai.js.map +1 -1
- package/dist/lib/ai-model/service-caller/openai/chat-completion/chat-completion.js.map +1 -1
- package/dist/lib/ai-model/service-caller/openai/openai-client.js.map +1 -1
- package/dist/lib/ai-model/service-caller/openai/responses/responses.js.map +1 -1
- package/dist/lib/ai-model/service-caller/system-one/call-system-one.js +103 -0
- package/dist/lib/ai-model/service-caller/system-one/call-system-one.js.map +1 -0
- package/dist/lib/ai-model/service-caller/system-one/index.js +42 -0
- package/dist/lib/ai-model/service-caller/system-one/index.js.map +1 -0
- package/dist/lib/ai-model/service-caller/system-one/prepare-system-one.js +78 -0
- package/dist/lib/ai-model/service-caller/system-one/prepare-system-one.js.map +1 -0
- package/dist/lib/ai-model/service-caller/system-one/schema.js +69 -0
- package/dist/lib/ai-model/service-caller/system-one/schema.js.map +1 -0
- package/dist/lib/ai-model/service-caller/system-one/utils.js +68 -0
- package/dist/lib/ai-model/service-caller/system-one/utils.js.map +1 -0
- package/dist/lib/ai-model/service-caller/utils.js +2 -2
- package/dist/lib/ai-model/service-caller/utils.js.map +1 -1
- package/dist/lib/ai-model/shared/model-locate-result/factory.js +7 -3
- package/dist/lib/ai-model/shared/model-locate-result/factory.js.map +1 -1
- package/dist/lib/ai-model/shared/model-locate-result/pixel-mapper.js +10 -4
- package/dist/lib/ai-model/shared/model-locate-result/pixel-mapper.js.map +1 -1
- package/dist/lib/ai-model/shared/model-locate-result/types.js.map +1 -1
- package/dist/lib/ai-model/shared/model-locate-result/validation.js +4 -0
- package/dist/lib/ai-model/shared/model-locate-result/validation.js.map +1 -1
- package/dist/lib/ai-model/workflows/grounding/locate.js +1 -1
- package/dist/lib/ai-model/workflows/grounding/locate.js.map +1 -1
- package/dist/lib/ai-model/workflows/grounding/section-locate.js +1 -1
- package/dist/lib/ai-model/workflows/grounding/section-locate.js.map +1 -1
- package/dist/lib/ai-model/workflows/insight/boolean.js +1 -1
- package/dist/lib/ai-model/workflows/insight/boolean.js.map +1 -1
- package/dist/lib/ai-model/workflows/insight/extraction.js +2 -2
- package/dist/lib/ai-model/workflows/insight/extraction.js.map +1 -1
- package/dist/lib/ai-model/workflows/planning/standard-planning.js +3 -2
- package/dist/lib/ai-model/workflows/planning/standard-planning.js.map +1 -1
- package/dist/lib/ai-model/workflows/recorder-generation/playwright.js +1 -1
- package/dist/lib/ai-model/workflows/recorder-generation/playwright.js.map +1 -1
- package/dist/lib/ai-model/workflows/recorder-generation/yaml.js +1 -1
- package/dist/lib/ai-model/workflows/recorder-generation/yaml.js.map +1 -1
- package/dist/lib/device/index.js +7 -0
- package/dist/lib/device/index.js.map +1 -1
- package/dist/lib/report-html-template.js +1 -1
- package/dist/lib/service/index.js +2 -1
- package/dist/lib/service/index.js.map +1 -1
- package/dist/lib/test-runner/engine/index.js +2 -2
- package/dist/lib/test-runner/node/index.js +2 -2
- package/dist/lib/types.js.map +1 -1
- package/dist/lib/utils.js +1 -1
- package/dist/types/agent/agent.d.ts.map +1 -1
- package/dist/types/agent/insight.d.ts +2 -2
- package/dist/types/agent/insight.d.ts.map +1 -1
- package/dist/types/agent/tasks.d.ts.map +1 -1
- package/dist/types/ai-model/connectivity/run-connectivity-test.d.ts.map +1 -1
- package/dist/types/ai-model/index.d.ts +1 -1
- package/dist/types/ai-model/index.d.ts.map +1 -1
- package/dist/types/ai-model/model-adapter/resolve.d.ts +2 -1
- package/dist/types/ai-model/model-adapter/resolve.d.ts.map +1 -1
- package/dist/types/ai-model/model-adapter/types.d.ts +8 -5
- package/dist/types/ai-model/model-adapter/types.d.ts.map +1 -1
- package/dist/types/ai-model/models/gpt.d.ts +2 -2
- package/dist/types/ai-model/models/jev/adapter.d.ts +4 -5
- package/dist/types/ai-model/models/jev/adapter.d.ts.map +1 -1
- package/dist/types/ai-model/models/jev/boolean.d.ts +3 -0
- package/dist/types/ai-model/models/jev/boolean.d.ts.map +1 -0
- package/dist/types/ai-model/models/jev/image.d.ts +11 -11
- package/dist/types/ai-model/models/jev/image.d.ts.map +1 -1
- package/dist/types/ai-model/models/jev/locate.d.ts +3 -0
- package/dist/types/ai-model/models/jev/locate.d.ts.map +1 -0
- package/dist/types/ai-model/models/jev/planning-action.d.ts +6 -0
- package/dist/types/ai-model/models/jev/planning-action.d.ts.map +1 -0
- package/dist/types/ai-model/models/jev/planning-context.d.ts +23 -0
- package/dist/types/ai-model/models/jev/planning-context.d.ts.map +1 -0
- package/dist/types/ai-model/models/jev/planning-decision.d.ts +35 -0
- package/dist/types/ai-model/models/jev/planning-decision.d.ts.map +1 -0
- package/dist/types/ai-model/models/jev/planning.d.ts.map +1 -1
- package/dist/types/ai-model/models/model-fallback.d.ts +6 -0
- package/dist/types/ai-model/models/model-fallback.d.ts.map +1 -0
- package/dist/types/ai-model/models/registry.d.ts +4 -3
- package/dist/types/ai-model/models/registry.d.ts.map +1 -1
- package/dist/types/ai-model/service-caller/call-ai.d.ts +3 -1
- package/dist/types/ai-model/service-caller/call-ai.d.ts.map +1 -1
- package/dist/types/ai-model/service-caller/codex/call-codex.d.ts +5 -3
- package/dist/types/ai-model/service-caller/codex/call-codex.d.ts.map +1 -1
- package/dist/types/ai-model/service-caller/index.d.ts +1 -1
- package/dist/types/ai-model/service-caller/index.d.ts.map +1 -1
- package/dist/types/ai-model/service-caller/model-call.d.ts +2 -2
- package/dist/types/ai-model/service-caller/model-call.d.ts.map +1 -1
- package/dist/types/ai-model/service-caller/openai/call-openai.d.ts +2 -2
- package/dist/types/ai-model/service-caller/openai/call-openai.d.ts.map +1 -1
- package/dist/types/ai-model/service-caller/openai/chat-completion/chat-completion.d.ts +4 -2
- package/dist/types/ai-model/service-caller/openai/chat-completion/chat-completion.d.ts.map +1 -1
- package/dist/types/ai-model/service-caller/openai/responses/responses.d.ts +4 -2
- package/dist/types/ai-model/service-caller/openai/responses/responses.d.ts.map +1 -1
- package/dist/types/ai-model/service-caller/system-one/call-system-one.d.ts +4 -0
- package/dist/types/ai-model/service-caller/system-one/call-system-one.d.ts.map +1 -0
- package/dist/types/ai-model/service-caller/system-one/index.d.ts +3 -0
- package/dist/types/ai-model/service-caller/system-one/index.d.ts.map +1 -0
- package/dist/types/ai-model/service-caller/system-one/prepare-system-one.d.ts +21 -0
- package/dist/types/ai-model/service-caller/system-one/prepare-system-one.d.ts.map +1 -0
- package/dist/types/ai-model/service-caller/{system-one.d.ts → system-one/schema.d.ts} +1 -22
- package/dist/types/ai-model/service-caller/system-one/schema.d.ts.map +1 -0
- package/dist/types/ai-model/service-caller/system-one/utils.d.ts +6 -0
- package/dist/types/ai-model/service-caller/system-one/utils.d.ts.map +1 -0
- package/dist/types/ai-model/service-caller/types.d.ts +0 -3
- package/dist/types/ai-model/service-caller/types.d.ts.map +1 -1
- package/dist/types/ai-model/service-caller/utils.d.ts +3 -3
- package/dist/types/ai-model/shared/model-locate-result/factory.d.ts.map +1 -1
- package/dist/types/ai-model/shared/model-locate-result/index.d.ts +1 -1
- package/dist/types/ai-model/shared/model-locate-result/index.d.ts.map +1 -1
- package/dist/types/ai-model/shared/model-locate-result/pixel-mapper.d.ts +3 -3
- package/dist/types/ai-model/shared/model-locate-result/pixel-mapper.d.ts.map +1 -1
- package/dist/types/ai-model/shared/model-locate-result/types.d.ts +4 -0
- package/dist/types/ai-model/shared/model-locate-result/types.d.ts.map +1 -1
- package/dist/types/ai-model/shared/model-locate-result/validation.d.ts.map +1 -1
- package/dist/types/ai-model/workflows/grounding/locate.d.ts.map +1 -1
- package/dist/types/ai-model/workflows/grounding/section-locate.d.ts.map +1 -1
- package/dist/types/ai-model/workflows/insight/boolean.d.ts.map +1 -1
- package/dist/types/ai-model/workflows/insight/extraction.d.ts +2 -0
- package/dist/types/ai-model/workflows/insight/extraction.d.ts.map +1 -1
- package/dist/types/ai-model/workflows/planning/standard-planning.d.ts.map +1 -1
- package/dist/types/ai-model/workflows/planning/types.d.ts +2 -1
- package/dist/types/ai-model/workflows/planning/types.d.ts.map +1 -1
- package/dist/types/ai-model/workflows/recorder-generation/playwright.d.ts.map +1 -1
- package/dist/types/ai-model/workflows/recorder-generation/yaml.d.ts.map +1 -1
- package/dist/types/device/index.d.ts +1 -0
- package/dist/types/device/index.d.ts.map +1 -1
- package/dist/types/service/index.d.ts +1 -1
- package/dist/types/service/index.d.ts.map +1 -1
- package/dist/types/types.d.ts +14 -3
- package/dist/types/types.d.ts.map +1 -1
- package/package.json +2 -2
- package/dist/es/ai-model/models/task-routing.mjs +0 -28
- package/dist/es/ai-model/models/task-routing.mjs.map +0 -1
- package/dist/es/ai-model/service-caller/system-one.mjs +0 -163
- package/dist/es/ai-model/service-caller/system-one.mjs.map +0 -1
- package/dist/lib/ai-model/models/task-routing.js.map +0 -1
- package/dist/lib/ai-model/service-caller/system-one.js +0 -206
- package/dist/lib/ai-model/service-caller/system-one.js.map +0 -1
- package/dist/types/ai-model/models/task-routing.d.ts +0 -6
- package/dist/types/ai-model/models/task-routing.d.ts.map +0 -1
- package/dist/types/ai-model/service-caller/system-one.d.ts.map +0 -1
package/dist/es/agent/agent.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { resolveModelForTaskType } from "../ai-model/models/model-fallback.mjs";
|
|
2
2
|
import { INTERNAL_CALL_ID_FIELD } from "../ai-model/service-caller/index.mjs";
|
|
3
3
|
import js_yaml from "js-yaml";
|
|
4
4
|
import { ScreenshotItem } from "../screenshot-item.mjs";
|
|
@@ -124,8 +124,8 @@ class Agent {
|
|
|
124
124
|
resolveReplanningCycleLimit(planningModel) {
|
|
125
125
|
return this.opts.replanningCycleLimit ?? globalConfigManager.getEnvConfigValueAsNumber(MIDSCENE_REPLANNING_CYCLE_LIMIT) ?? planningModel.adapter.planning.defaultReplanningCycleLimit;
|
|
126
126
|
}
|
|
127
|
-
resolveModelRuntime(intent,
|
|
128
|
-
const runtime =
|
|
127
|
+
resolveModelRuntime(intent, taskType) {
|
|
128
|
+
const runtime = resolveModelForTaskType(this.modelConfigManager, intent, taskType);
|
|
129
129
|
return {
|
|
130
130
|
...runtime,
|
|
131
131
|
onUsage: (usage)=>{
|
|
@@ -141,7 +141,7 @@ class Agent {
|
|
|
141
141
|
createInsight(getUIContext) {
|
|
142
142
|
return new Insight({
|
|
143
143
|
createTypeQueryExecution: (...args)=>this.withReportOperation(()=>this.taskExecutor.createTypeQueryExecution(...args))
|
|
144
|
-
}, (
|
|
144
|
+
}, (taskType)=>this.resolveModelRuntime('insight', taskType), (apiName, callContext)=>this.resolveUserContext(apiName, callContext), getUIContext);
|
|
145
145
|
}
|
|
146
146
|
async getActionSpace() {
|
|
147
147
|
return this.fullActionSpace;
|
|
@@ -297,8 +297,8 @@ class Agent {
|
|
|
297
297
|
actionPlan
|
|
298
298
|
].filter(Boolean);
|
|
299
299
|
const title = taskTitleStr(type, locateParamStr(opt?.locate || {}));
|
|
300
|
-
const locateModel = this.resolveModelRuntime('locate');
|
|
301
|
-
const planningModel = this.resolveModelRuntime('planning');
|
|
300
|
+
const locateModel = this.resolveModelRuntime('locate', 'locate');
|
|
301
|
+
const planningModel = this.resolveModelRuntime('planning', 'planning');
|
|
302
302
|
const { output } = await this.taskExecutor.runPlans(title, plans, planningModel, locateModel, {
|
|
303
303
|
abortSignal: abortSignal ?? currentYamlSignal(this)
|
|
304
304
|
});
|
|
@@ -454,8 +454,8 @@ class Agent {
|
|
|
454
454
|
const abortSignal = opt?.abortSignal;
|
|
455
455
|
if (abortSignal?.aborted) throw new Error(`aiAct aborted: ${abortSignal.reason || 'signal already aborted'}`);
|
|
456
456
|
const runAiAct = async ()=>{
|
|
457
|
-
const planningModel = this.resolveModelRuntime('planning');
|
|
458
|
-
const locateModel = this.resolveModelRuntime('locate');
|
|
457
|
+
const planningModel = this.resolveModelRuntime('planning', 'planning');
|
|
458
|
+
const locateModel = this.resolveModelRuntime('locate', 'locate');
|
|
459
459
|
const aiActContext = this.resolveUserContext('aiAct', opt?.context);
|
|
460
460
|
const cachePrompt = buildPromptWithContext(taskPrompt, aiActContext);
|
|
461
461
|
const effort = (()=>{
|
|
@@ -597,8 +597,8 @@ class Agent {
|
|
|
597
597
|
const plans = [
|
|
598
598
|
locatePlan
|
|
599
599
|
];
|
|
600
|
-
const locateModel = this.resolveModelRuntime('locate');
|
|
601
|
-
const planningModel = this.resolveModelRuntime('planning');
|
|
600
|
+
const locateModel = this.resolveModelRuntime('locate', 'locate');
|
|
601
|
+
const planningModel = this.resolveModelRuntime('planning', 'planning');
|
|
602
602
|
const { output } = await this.taskExecutor.runPlans(taskTitleStr('Locate', locateParamStr(locateParam)), plans, planningModel, locateModel, opt?.uiContext ? {
|
|
603
603
|
uiContext: opt.uiContext
|
|
604
604
|
} : void 0);
|
|
@@ -893,7 +893,7 @@ class Agent {
|
|
|
893
893
|
defineActionSleep()
|
|
894
894
|
];
|
|
895
895
|
this.taskExecutor = new TaskExecutor(this.interface, this.service, {
|
|
896
|
-
getDefaultModelRuntime: ()=>this.resolveModelRuntime('default'),
|
|
896
|
+
getDefaultModelRuntime: ()=>this.resolveModelRuntime('default', 'general'),
|
|
897
897
|
taskCache: this.taskCache,
|
|
898
898
|
onTaskStart: this.callbackOnTaskStartTip.bind(this),
|
|
899
899
|
replanningCycleLimit: this.opts.replanningCycleLimit,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent/agent.mjs","sources":["../../../src/agent/agent.ts"],"sourcesContent":["import type { ModelTask } from '@/ai-model/model-adapter/types';\nimport type { ModelRuntime } from '@/ai-model/models';\nimport { resolveModelForTask } from '@/ai-model/models/task-routing';\nimport { INTERNAL_CALL_ID_FIELD } from '@/ai-model/service-caller';\nimport yaml from 'js-yaml';\nimport type { TUserPrompt } from '../ai-model/index';\nimport { ScreenshotItem } from '../screenshot-item';\nimport Service from '../service/index';\nimport {\n hasPendingResourceOperation,\n waitForResourceIdle,\n} from '../test-runner/engine/resource-operations';\nimport type { WorkflowExecutionRecord } from '../test-runner/execution-record';\n// Import types and values directly from their source files to avoid circular dependency\n// DO NOT import from '../index' as it creates a circular dependency:\n// index.ts -> agent/index.ts -> agent/agent.ts -> index.ts\nimport {\n type AIUsageInfo,\n type ActionParam,\n type ActionReturn,\n type AgentAIContextKey,\n type AgentAIContexts,\n type AgentAssertResult,\n type AgentOpt,\n type AgentProgressListener,\n type AgentWaitForOpt,\n type AiActEffort,\n type AiApiName,\n type AssertOptions,\n type DeepThinkOption,\n type DeviceAction,\n ExecutionDump,\n type ExecutionRecorderItem,\n type ExecutionTask,\n type ExecutionTaskLog,\n type InsightAPI,\n type LocateOption,\n type LocateResultElement,\n type OnTaskStartTip,\n type PlanningAction,\n type QueryOptions,\n type RecordToReportOptions,\n type RecordToReportScreenshot,\n type Rect,\n type ReportActionDump,\n type ScrollParam,\n type ServiceAction,\n type ServiceExtractParam,\n type TestStatus,\n type UIContext,\n} from '../types';\nimport type { MidsceneYamlScript } from '../yaml';\nimport {\n YamlExecutionOwnershipError,\n currentYamlSignal,\n enterYamlAction,\n enterYamlExecution,\n hasActiveYamlExecution,\n runInYamlExecutionContext,\n} from '../yaml/execution-session';\n\nimport {\n ScriptPlayer,\n buildDetailedLocateParam,\n buildDetailedLocateParamAndRestParams,\n parseYamlScript,\n} from '../yaml/index';\n\nimport { readFile } from 'node:fs/promises';\nimport { basename, resolve } from 'node:path';\nimport type { AbstractInterface, InputStrategy } from '@/device';\nimport type { TaskRunner } from '@/task-runner';\nimport { isAgentAIContextKey } from '@midscene/shared/agent-tools/agent-context';\nimport { serializeError } from '@midscene/shared/agent-tools/error-formatter';\nimport {\n type ObservationArtifactAdapter,\n observationArtifactAdapterSymbol,\n} from '@midscene/shared/agent-tools/observation-artifact';\nimport {\n type CreateOpenAIClientFn,\n type IModelConfig,\n MIDSCENE_REPLANNING_CYCLE_LIMIT,\n ModelConfigManager,\n type TIntent,\n globalConfigManager,\n globalModelConfigManager,\n} from '@midscene/shared/env';\nimport { getDebug } from '@midscene/shared/logger';\nimport { assert, uuid } from '@midscene/shared/utils';\nimport {\n defineActionRegisterFileChooserAccept,\n defineActionSleep,\n} from '../device';\nimport { ActionReadiness, isActionReadinessError } from './action-readiness';\nimport { normalizeAgentOptions, withAgentDefaults } from './agent-options';\nimport { AgentReportManager } from './agent-report-manager';\nimport { normalizeAgentCacheConfig } from './cache-config';\nimport { FileChooserAccepter } from './file-chooser';\nimport { Insight } from './insight';\nimport { MetricsCollector, type MidsceneUsageMetrics } from './metrics';\nimport { AgentProgressBus } from './progress';\nimport { buildPromptWithContext } from './prompt-context';\nimport { normalizeRecordToReportScreenshot } from './record-to-report';\nimport {\n type RunGherkinScenarioOptions,\n runGherkinScenario,\n} from './run-gherkin-scenario';\nimport { markdownToAiActPrompt } from './run-markdown';\nimport { TaskCache } from './task-cache';\nimport { TaskExecutor, locatePlanForLocate, withFileChooser } from './tasks';\nimport {\n type AgentTestRunnerNodeDefinition,\n commonAgentTestRunnerNodeDefinitions,\n} from './test-runner-nodes';\nimport {\n UIObservationImpl,\n type UIObserver,\n UIObserverImpl,\n type UIObserverOption,\n uiContextFromObservationRecord,\n} from './ui-observer';\nimport {\n type TaskTitleType,\n locateParamStr,\n paramStr,\n taskTitleStr,\n typeStr,\n} from './ui-utils';\nimport {\n commonContextParser,\n normalizeFilePaths,\n normalizeScrollType,\n} from './utils';\n\nconst debug = getDebug('agent');\nconst warn = getDebug('agent', { console: true });\n\nclass AgentScopedModelConfigManager extends ModelConfigManager {\n constructor(\n private readonly baseManager: ModelConfigManager,\n private readonly createOpenAIClient?: CreateOpenAIClientFn,\n ) {\n super();\n }\n\n override getModelConfig(intent: TIntent): IModelConfig {\n return {\n ...this.baseManager.getModelConfig(intent),\n createOpenAIClient: this.createOpenAIClient,\n };\n }\n}\n\nexport type AiActOptions = {\n cacheable?: boolean;\n fileChooserAccept?: string | string[];\n fileChooserAllowedDir?: string;\n effort?: AiActEffort;\n deepThink?: DeepThinkOption;\n deepLocate?: boolean;\n abortSignal?: AbortSignal;\n /**\n * Additional facts, rules, constraints, or output requirements for this AI\n * call. It overrides `aiContexts.aiAct` and `aiContexts.default`; `''`\n * disables inherited user context for this call.\n */\n context?: string;\n};\n\ntype AiActInternalOptions = AiActOptions & {\n _internalReportDisplay?: {\n type?: TaskTitleType;\n prompt?: string;\n };\n};\n\n/**\n * Shared input option type for aiInput(), used consistently across\n * overload signatures and the implementation so fields don't drift.\n */\ntype AgentInputOption = LocateOption & {\n autoDismissKeyboard?: boolean;\n keyboardTypeDelay?: number;\n inputStrategy?: InputStrategy;\n mode?: 'replace' | 'clear' | 'typeOnly' | 'append';\n};\n\nexport class Agent<InterfaceType extends AbstractInterface = AbstractInterface>\n implements InsightAPI\n{\n /** Nodes this Agent class intentionally exposes to Test Runner. */\n static getTestRunnerNodeDefinitions(): readonly AgentTestRunnerNodeDefinition[] {\n return commonAgentTestRunnerNodeDefinitions;\n }\n\n interface: InterfaceType;\n\n service: Service;\n\n private reportManager: AgentReportManager;\n\n get dump(): ReportActionDump {\n return this.reportManager.dump;\n }\n set dump(value: ReportActionDump) {\n this.reportManager.dump = value;\n }\n get reportFile(): string | null | undefined {\n return this.reportManager.reportFile;\n }\n set reportFile(value: string | null | undefined) {\n this.reportManager.reportFile = value;\n }\n get reportFileName(): string | undefined {\n return this.reportManager.reportFileName;\n }\n set reportFileName(value: string | undefined) {\n this.reportManager.reportFileName = value;\n }\n\n /** @internal Runner snapshots retain immutable data and shared image files. */\n _prepareForTestRunner(): void {\n this.reportManager._prepareForTestRunner();\n }\n async _createReportSource(scopeId: string, executionIds?: readonly string[]) {\n return this.reportManager._createReportSource(scopeId, executionIds);\n }\n\n /** @internal The Agent owns one report stream across root YAML invocations. */\n async _writeYamlExecutionReport(\n record: WorkflowExecutionRecord,\n ): Promise<string | undefined> {\n return this.reportManager._writeYamlExecutionReport(record);\n }\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 private readonly metricsCollector = new MetricsCollector();\n\n // Monotonic counter for generating unique dedup keys when a usage has no\n // request_id (e.g. estimated streaming usage).\n private usageCallCounter = 0;\n\n // Usage values already folded into `metricsCollector`, keyed by\n // `${taskId}:${field}` so re-emitted snapshots never double-count.\n private readonly countedUsageKeys = new Set<string>();\n\n // Generic progress bus: every producer (aiAct today, more later) broadcasts\n // through here. Consumers narrow by `event.scope`.\n private readonly progressBus = new AgentProgressBus();\n\n get onDumpUpdate():\n | ((dump: string, executionDump?: ExecutionDump) => void)\n | undefined {\n return this.reportManager.onDumpUpdate;\n }\n set onDumpUpdate(callback:\n | ((dump: string, executionDump?: ExecutionDump) => void)\n | undefined) {\n this.reportManager.onDumpUpdate = callback;\n }\n\n destroyed = false;\n\n private readonly actionReadiness?: ActionReadiness;\n\n modelConfigManager: ModelConfigManager;\n\n /**\n * Frozen page context for consistent AI operations\n */\n private frozenUIContext?: UIContext;\n\n /**\n * Currently active UIObserver (from startObserving). Only one observer may\n * be active at a time since frame sources are device-level singletons.\n */\n private activeObserver: UIObserverImpl | null = null;\n\n /** Observers own temporary frame files until their observation is disposed. */\n private ownedObservers = new Set<UIObserverImpl>();\n\n private get aiContexts(): AgentAIContexts {\n if (!this.opts.aiContexts) {\n this.opts.aiContexts = {};\n }\n return this.opts.aiContexts;\n }\n\n private resolveUserContext(\n apiName: AiApiName,\n callContext?: string,\n ): string | undefined {\n if (callContext !== undefined) {\n return callContext;\n }\n\n const apiContext = this.opts.aiContexts?.[apiName];\n if (apiContext !== undefined) {\n return apiContext;\n }\n\n const defaultContext = this.opts.aiContexts?.default;\n if (defaultContext !== undefined) {\n return defaultContext;\n }\n\n return undefined;\n }\n\n private withContext<T extends { context?: string }>(\n apiName: AiApiName,\n options?: T,\n ): T | undefined {\n const resolvedContext = this.resolveUserContext(apiName, options?.context);\n if (resolvedContext === undefined) {\n return options;\n }\n\n return {\n ...(options ?? ({} as T)),\n context: resolvedContext,\n };\n }\n\n private fullActionSpace: DeviceAction[];\n\n private activeFileChooserAccepter?: FileChooserAccepter;\n\n private activeFileChooserAllowedDir?: string;\n\n // @deprecated use .interface instead\n get page() {\n return this.interface;\n }\n\n /**\n * Fails fast for non-web interfaces when the model family is missing.\n *\n * Early Midscene web usage allowed running without `modelFamily` and falling\n * back to a default bbox parser. Non-web users do not have that compatibility\n * path, so this check helps surface configuration problems before spending a\n * model call.\n *\n * Web flows validate missing locate model family at workflow boundaries:\n * `Service.locate` throws when aiTap/aiType fallback to the default model for\n * direct locate, and generic planning throws when aiAct asks a planning model\n * to return inline locate coordinates. Those checks are intentionally placed\n * where Midscene knows which model role should provide coordinate parsing.\n */\n private assertModelFamilyForNonWebContext() {\n if (\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 }\n }\n\n private resolveReplanningCycleLimit(planningModel: ModelRuntime): number {\n return (\n this.opts.replanningCycleLimit ??\n globalConfigManager.getEnvConfigValueAsNumber(\n MIDSCENE_REPLANNING_CYCLE_LIMIT,\n ) ??\n planningModel.adapter.planning.defaultReplanningCycleLimit\n );\n }\n\n private resolveModelRuntime(intent: TIntent, task?: ModelTask): ModelRuntime {\n const runtime = resolveModelForTask(\n this.modelConfigManager,\n intent,\n task ??\n (intent === 'default'\n ? 'text'\n : intent === 'insight'\n ? 'extract'\n : intent),\n );\n return {\n ...runtime,\n onUsage: (usage) => {\n this.usageCallCounter += 1;\n // buildUsageInfo leaves intent undefined; fill it from the\n // requested role, even when its configuration falls back to default.\n const enriched = usage.intent ? usage : { ...usage, intent };\n this.consumeUsage(\n enriched,\n `callai:${usage.request_id ?? this.usageCallCounter}`,\n );\n },\n };\n }\n\n private createInsight(getUIContext?: () => UIContext): Insight {\n return new Insight(\n {\n createTypeQueryExecution: (...args) =>\n this.withReportOperation(() =>\n this.taskExecutor.createTypeQueryExecution(...args),\n ),\n },\n (task) => this.resolveModelRuntime('insight', task),\n (apiName, callContext) => this.resolveUserContext(apiName, callContext),\n getUIContext,\n );\n }\n\n constructor(interfaceInstance: InterfaceType, opts?: AgentOpt) {\n this.interface = interfaceInstance;\n\n this.opts = withAgentDefaults(opts);\n if (this.opts.waitForActionReady !== undefined) {\n this.actionReadiness = new ActionReadiness(this.opts.waitForActionReady);\n }\n\n normalizeAgentOptions(this.opts, warn);\n\n // Explicit modelConfig is isolated from global configuration.\n // A custom client factory alone still uses the global model values.\n this.modelConfigManager = opts?.modelConfig\n ? new ModelConfigManager(opts.modelConfig, opts.createOpenAIClient)\n : opts?.createOpenAIClient\n ? new AgentScopedModelConfigManager(\n globalModelConfigManager,\n opts.createOpenAIClient,\n )\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 = normalizeAgentCacheConfig(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 cacheDir: cacheConfigObj.cacheDir,\n },\n );\n }\n\n const baseActionSpace = this.interface.actionSpace();\n const fileChooserActions = this.interface.registerFileChooserListener\n ? [\n defineActionRegisterFileChooserAccept(async (files) => {\n if (!this.activeFileChooserAccepter) {\n throw new Error(\n 'RegisterFileChooserAccept can only be used while aiAct is running',\n );\n }\n if (!this.activeFileChooserAllowedDir) {\n throw new Error(\n 'RegisterFileChooserAccept requires aiAct option fileChooserAllowedDir',\n );\n }\n await this.activeFileChooserAccepter.registerFromAllowedDir(\n files,\n this.activeFileChooserAllowedDir,\n );\n }),\n ]\n : [];\n this.fullActionSpace = [\n ...baseActionSpace,\n ...fileChooserActions,\n defineActionSleep(),\n ];\n\n this.taskExecutor = new TaskExecutor(this.interface, this.service, {\n getDefaultModelRuntime: () => this.resolveModelRuntime('default'),\n taskCache: this.taskCache,\n onTaskStart: this.callbackOnTaskStartTip.bind(this),\n replanningCycleLimit: this.opts.replanningCycleLimit,\n waitAfterAction: this.opts.waitAfterAction,\n actionReadiness: this.actionReadiness,\n useDeviceTime: this.opts.useDeviceTime,\n getAbortSignal: () => currentYamlSignal(this),\n operationResource: this,\n actionSpace: this.fullActionSpace,\n hooks: {\n onExecutionCreated: (runner) => {\n this.reportManager.bindRunner(runner);\n },\n onSnapshotChange: async (runner) => {\n this.reportManager.assertRunnerCurrent(runner);\n const executionDump = runner.dump();\n this.appendExecutionDump(executionDump, runner);\n this.collectUsageMetrics(executionDump);\n\n // Persist report updates before notifying listeners so screenshot\n // payloads can be released from memory and serialized as references.\n this.writeOutActionDumps(executionDump);\n await this.reportManager.flushPendingWrites();\n this.reportManager.notifyDumpUpdateListeners(executionDump);\n },\n onProgress: this.progressBus.publish,\n },\n });\n this.reportManager = new AgentReportManager({\n getOptions: () => this.opts,\n getDeviceType: () => this.interface.interfaceType,\n isDestroyed: () => this.destroyed,\n isExternallyBusy: () =>\n Boolean(this.activeObserver) ||\n hasActiveYamlExecution(this) ||\n hasPendingResourceOperation(this),\n });\n\n Object.defineProperty(this, observationArtifactAdapterSymbol, {\n value: {\n exportRecord: async (observation) => {\n assert(\n observation instanceof UIObservationImpl,\n 'Cannot export an observation that was not created by this Midscene runtime',\n );\n return observation.exportRecord();\n },\n loadRecord: (record) => {\n // CLI manifests are validated before this adapter is called. Rebuild\n // once here as a final runtime-boundary check before creating insight.\n uiContextFromObservationRecord(record);\n return new UIObservationImpl(\n record,\n this.createInsight(() => uiContextFromObservationRecord(record)),\n );\n },\n } satisfies ObservationArtifactAdapter,\n });\n }\n\n async getActionSpace(): Promise<DeviceAction[]> {\n return this.fullActionSpace;\n }\n\n private static readonly CONTEXT_RETRY_MAX = 3;\n private static readonly CONTEXT_RETRY_DELAY_MS = 1500;\n\n /**\n * Override in subclasses to indicate which errors are transient and should\n * trigger an automatic retry when building the UI context.\n * Returns `false` by default (no retry).\n */\n protected isRetryableContextError(_error: unknown): boolean {\n return false;\n }\n\n async getUIContext(action?: ServiceAction): Promise<UIContext> {\n // Some non-web flows, such as Android, need an Agent instance before they\n // can call device methods via ADB, so defer missing modelFamily errors\n // until UI context is actually requested.\n this.assertModelFamilyForNonWebContext();\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 const maxRetries = Agent.CONTEXT_RETRY_MAX;\n for (let attempt = 0; ; attempt++) {\n try {\n return await commonContextParser(this.interface, {\n uploadServerUrl: this.modelConfigManager.getUploadTestServerUrl(),\n screenshotShrinkFactor: this.opts.screenshotShrinkFactor,\n });\n } catch (error) {\n if (attempt < maxRetries && this.isRetryableContextError(error)) {\n debug(\n `retryable context error (attempt ${attempt + 1}/${maxRetries}), retrying in ${Agent.CONTEXT_RETRY_DELAY_MS}ms: ${error}`,\n );\n await new Promise((resolve) =>\n setTimeout(resolve, Agent.CONTEXT_RETRY_DELAY_MS),\n );\n continue;\n }\n throw error;\n }\n }\n }\n\n async _snapshotContext(): Promise<UIContext> {\n return await this.getUIContext('locate');\n }\n\n /**\n * Start observing the screen in the background and return a fixed insight\n * surface when the observation is stopped:\n *\n * ```ts\n * const observer = await agent.startObserving();\n * await agent.aiAct('submit the form');\n * const observation = await observer.stop();\n * await observation.aiAssert('a success toast appeared during the process');\n * ```\n *\n * Frames come from the device's continuous frame source when available\n * (scrcpy on Android, WDA MJPEG on iOS — both opt-in; CDP screencast on\n * web) and fall back to plain screenshots otherwise. Sampling is capped at\n * 5fps, the buffer is bounded and self-thinning, decoding is deferred to\n * the end, and all buffered frames (up to `maxFrames`) are sent to\n * the model at insight time. To control token cost for long windows,\n * increase `intervalMs` or decrease `maxFrames`.\n * Awaiting `startObserving()` guarantees one baseline frame is captured\n * before your next action.\n */\n async startObserving(opt?: UIObserverOption): Promise<UIObserver> {\n this.assertReportWritable();\n // A frozen context pins perception to a single snapshot; observing a\n // window of frames contradicts that. Fail fast instead of silently\n // producing an all-identical sequence.\n assert(\n !this.frozenUIContext,\n 'startObserving() cannot be used while the UI context is frozen (call unfreezePageContext() first)',\n );\n // Frame sources are device-level singletons — two concurrent observers\n // would conflict (scrcpy stream, WDA MJPEG port, CDP screencast).\n assert(\n !this.activeObserver,\n 'An observation window is already active on this agent. ' +\n 'Stop the existing observer first (await observer.stop()) before starting a new one.',\n );\n const observer = new UIObserverImpl(\n {\n openFrameSource: async () =>\n (await this.interface.openFrameSource?.()) ?? undefined,\n // Fallback single-frame capture. Deliberately bypasses getUIContext so\n // the observation loop never pollutes the TaskRunner context cache.\n captureRawScreenshot: () => this.interface.screenshotBase64(),\n capturePreparedRepresentative: () => this.getUIContext('assert'),\n createInsight: (record) =>\n this.createInsight(() => uiContextFromObservationRecord(record)),\n onStopped: () => {\n if (this.activeObserver === observer) {\n this.activeObserver = null;\n }\n },\n onDisposed: () => this.ownedObservers.delete(observer),\n screenshotShrinkFactor: this.opts.screenshotShrinkFactor,\n },\n opt,\n );\n // Mark as active BEFORE the async start() so concurrent calls hit the\n // assert guard above. If start() throws, clear the reference below.\n this.activeObserver = observer;\n this.ownedObservers.add(observer);\n try {\n await observer.start();\n } catch (error) {\n this.activeObserver = null;\n this.ownedObservers.delete(observer);\n await observer.dispose().catch((disposeError) => {\n debug(`error disposing failed observer start: ${disposeError}`);\n });\n throw error;\n }\n return observer;\n }\n\n /**\n * @deprecated Use `setAIContext('aiAct', context)` instead.\n */\n async setAIActionContext(prompt: string) {\n warn(\n 'setAIActionContext() is deprecated; use setAIContext(\"aiAct\", context) instead.',\n );\n this.setAIContext('aiAct', prompt);\n }\n\n /**\n * @deprecated Use `setAIContext('aiAct', context)` instead.\n */\n async setAIActContext(prompt: string) {\n warn(\n 'setAIActContext() is deprecated; use setAIContext(\"aiAct\", context) instead.',\n );\n this.setAIContext('aiAct', prompt);\n }\n\n /**\n * Set Agent-level AI guidance. Use `default` as the shared fallback for all\n * AI-powered APIs, or an API name to override that fallback for the API.\n * API-specific values are not automatically merged with `default`.\n * Passing `undefined` removes the selected value; an API then falls back to\n * `default`, while removing `default` disables the shared fallback. Passing\n * `''` keeps an explicit empty value and therefore prevents an API from using\n * `default`.\n */\n setAIContext(target: AgentAIContextKey, context: string | undefined): void {\n if (!isAgentAIContextKey(target)) {\n throw new TypeError(`Unknown Agent context key: ${String(target)}`);\n }\n if (context !== undefined && typeof context !== 'string') {\n throw new TypeError('Agent context must be a string or undefined');\n }\n\n this.aiContexts[target] = context;\n\n if (target === 'aiAct') {\n if (context === undefined) {\n this.opts.aiActContext = undefined;\n this.opts.aiActionContext = undefined;\n } else {\n this.opts.aiActContext = context;\n this.opts.aiActionContext = context;\n }\n }\n }\n\n private assertReportWritable(): void {\n this.reportManager.assertReportWritable();\n }\n\n private async withReportOperation<T>(\n operation: () => Promise<T>,\n ): Promise<T> {\n return this.reportManager.withReportOperation(operation);\n }\n\n /**\n * Finalize the preceding report and reset execution records for a new report.\n * Historical artifacts are retained; this Agent and its device stay connected.\n * Await this method before executing again. Concurrent resets share one reset.\n */\n async resetDump(): Promise<ReportActionDump> {\n return this.reportManager.resetDump();\n }\n\n /**\n * Seal the current report and release its in-memory records without\n * disconnecting the device. Export in-memory data before calling this method.\n * Repeated calls return the same result and never rewrite published artifacts.\n */\n async finalizeReport(): Promise<string | undefined> {\n return this.reportManager.finalizeReport();\n }\n\n appendExecutionDump(execution: ExecutionDump, runner?: TaskRunner) {\n this.reportManager.appendExecutionDump(execution, runner);\n }\n\n /**\n * Fold any not-yet-counted task usage from an execution dump into the\n * instance metrics. Snapshots are re-emitted as tasks progress, so each\n * usage value is keyed by `${taskId}:${field}` and counted at most once.\n */\n private collectUsageMetrics(execution: ExecutionDump) {\n for (const task of execution.tasks) {\n this.consumeUsage(task.usage, `${task.taskId}:usage`);\n this.consumeUsage(task.searchAreaUsage, `${task.taskId}:searchAreaUsage`);\n }\n }\n\n private consumeUsage(usage: AIUsageInfo | undefined, key: string) {\n if (!usage) {\n return;\n }\n // Dedup key priority:\n // 1. request_id — provider-issued, stable across onUsage and task dump paths\n // 2. INTERNAL_CALL_ID_FIELD — callAI-generated internal id, covers\n // providers that don't return a request_id\n // 3. caller-provided key (taskId:field or callai:counter)\n let dedupKey: string;\n if (usage.request_id) {\n dedupKey = `req:${usage.request_id}`;\n } else if ((usage as any)[INTERNAL_CALL_ID_FIELD]) {\n dedupKey = `int:${(usage as any)[INTERNAL_CALL_ID_FIELD]}`;\n } else {\n dedupKey = key;\n }\n if (this.countedUsageKeys.has(dedupKey)) {\n return;\n }\n this.countedUsageKeys.add(dedupKey);\n this.metricsCollector.add(usage);\n if (this.opts.onLLMUsage) {\n try {\n this.opts.onLLMUsage(usage);\n } catch (error) {\n warn(`onLLMUsage listener threw, ignoring: ${error}`);\n }\n }\n }\n\n /**\n * Aggregated LLM usage accumulated by this agent since it was created.\n */\n get metrics(): MidsceneUsageMetrics {\n return this.metricsCollector.snapshot();\n }\n\n dumpDataString(opt?: { inlineScreenshots?: boolean }) {\n return this.reportManager.dumpDataString(opt);\n }\n\n reportHTMLString(opt?: { inlineScreenshots?: boolean }) {\n return this.reportManager.reportHTMLString(() => this.dumpDataString(opt));\n }\n\n writeOutActionDumps(executionDump?: ExecutionDump) {\n this.reportManager.writeOutActionDumps(executionDump);\n }\n\n /** Persist current report data without disposing this Agent or its device. */\n async flushReport(): Promise<string | undefined> {\n return this.reportManager.flushReport();\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 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 abortSignal?: AbortSignal,\n ) {\n return this.withReportOperation(() =>\n this.executeActionInActionSpace<T>(type, opt, abortSignal),\n );\n }\n\n private async executeActionInActionSpace<T>(\n type: string,\n opt?: T,\n abortSignal?: AbortSignal,\n ) {\n debug('callActionInActionSpace', type, ',', opt);\n\n const clonedActionParam =\n opt && typeof opt === 'object' && !Array.isArray(opt)\n ? { ...opt }\n : opt || {};\n\n const actionPlan: PlanningAction<T> = {\n type: type as any,\n // Planning resolves locate/from/to in place. Keep the caller's inputs\n // intact so YAML and Test execution facts retain the original prompts.\n param: clonedActionParam 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 locateModel = this.resolveModelRuntime('locate');\n const planningModel = this.resolveModelRuntime('planning');\n\n const { output } = await this.taskExecutor.runPlans(\n title,\n plans,\n planningModel,\n locateModel,\n { abortSignal: abortSignal ?? currentYamlSignal(this) },\n );\n return output;\n }\n\n async aiTap(\n locatePrompt: TUserPrompt,\n opt?: LocateOption & { fileChooserAccept?: string | string[] },\n ): Promise<void> {\n await this.withReportOperation(async () => {\n assert(locatePrompt, 'missing locate prompt for tap');\n\n const detailedLocateParam = buildDetailedLocateParam(\n locatePrompt,\n this.withContext('aiTap', opt),\n );\n\n const fileChooserAccept = opt?.fileChooserAccept\n ? this.normalizeFileInput(opt.fileChooserAccept)\n : undefined;\n\n await withFileChooser(this.interface, fileChooserAccept, async () => {\n await this.callActionInActionSpace('Tap', {\n locate: detailedLocateParam,\n });\n });\n });\n }\n\n async aiRightClick(\n locatePrompt: TUserPrompt,\n opt?: LocateOption,\n ): Promise<void> {\n assert(locatePrompt, 'missing locate prompt for right click');\n\n const detailedLocateParam = buildDetailedLocateParam(\n locatePrompt,\n this.withContext('aiRightClick', opt),\n );\n\n await this.callActionInActionSpace('RightClick', {\n locate: detailedLocateParam,\n });\n }\n\n async aiDoubleClick(\n locatePrompt: TUserPrompt,\n opt?: LocateOption,\n ): Promise<void> {\n assert(locatePrompt, 'missing locate prompt for double click');\n\n const detailedLocateParam = buildDetailedLocateParam(\n locatePrompt,\n this.withContext('aiDoubleClick', opt),\n );\n\n await this.callActionInActionSpace('DoubleClick', {\n locate: detailedLocateParam,\n });\n }\n\n async aiHover(locatePrompt: TUserPrompt, opt?: LocateOption): Promise<void> {\n assert(locatePrompt, 'missing locate prompt for hover');\n\n const detailedLocateParam = buildDetailedLocateParam(\n locatePrompt,\n this.withContext('aiHover', opt),\n );\n\n await 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: AgentInputOption & { value: string | number },\n ): Promise<void>;\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?: AgentInputOption,\n ): Promise<void>;\n\n // Implementation\n async aiInput(\n locatePromptOrValue: TUserPrompt | string | number,\n locatePromptOrOpt:\n | TUserPrompt\n | (AgentInputOption & { value: string | number })\n | undefined,\n optOrUndefined?: AgentInputOption,\n ) {\n let value: string | number;\n let locatePrompt: TUserPrompt;\n let opt: (AgentInputOption & { value: string | number }) | 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 AgentInputOption & {\n value: string | number;\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 { locateParam, restParams } = buildDetailedLocateParamAndRestParams(\n locatePrompt,\n this.withContext('aiInput', opt),\n );\n\n // Convert value to string to ensure consistency\n const stringValue = typeof value === 'number' ? String(value) : value;\n\n // backward compat: convert deprecated 'append' to 'typeOnly'\n const mode = opt?.mode === 'append' ? 'typeOnly' : opt?.mode;\n\n await this.callActionInActionSpace('Input', {\n ...restParams,\n value: stringValue,\n locate: locateParam,\n mode,\n });\n }\n\n // New signature\n async aiKeyboardPress(\n locatePrompt: TUserPrompt | undefined,\n opt: LocateOption & { keyName: string },\n ): Promise<void>;\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<void>;\n\n // Implementation\n async aiKeyboardPress(\n locatePromptOrKeyName: TUserPrompt | string | undefined,\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 { locateParam, restParams } = buildDetailedLocateParamAndRestParams(\n locatePrompt || '',\n this.withContext('aiKeyboardPress', opt),\n );\n\n await this.callActionInActionSpace('KeyboardPress', {\n ...restParams,\n locate: locateParam,\n });\n }\n\n // New signature\n async aiScroll(\n locatePrompt: TUserPrompt | undefined,\n opt: LocateOption & ScrollParam,\n ): Promise<void>;\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<void>;\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 const isLocatePromptLike = (value: unknown): value is TUserPrompt => {\n if (\n typeof value === 'string' ||\n typeof value === 'undefined' ||\n value === null\n ) {\n return true;\n }\n\n return typeof value === 'object' && value !== null && 'prompt' in value;\n };\n\n // Check if using new signature (first param is locatePrompt, second is options)\n if (\n isLocatePromptLike(locatePromptOrScrollParam) &&\n typeof locatePromptOrOpt === 'object' &&\n locatePromptOrOpt !== null\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 if (opt) {\n const normalizedScrollType = normalizeScrollType(\n (opt as ScrollParam).scrollType,\n );\n\n if (normalizedScrollType !== (opt as ScrollParam).scrollType) {\n (opt as ScrollParam) = {\n ...(opt || {}),\n scrollType: normalizedScrollType as ScrollParam['scrollType'],\n };\n }\n }\n\n const { locateParam, restParams } = buildDetailedLocateParamAndRestParams(\n locatePrompt || '',\n this.withContext('aiScroll', opt),\n );\n\n await this.callActionInActionSpace('Scroll', {\n ...restParams,\n locate: locateParam,\n });\n }\n\n async aiPinch(\n locatePrompt: TUserPrompt | undefined,\n opt: LocateOption & {\n direction: 'in' | 'out';\n distance?: number;\n duration?: number;\n },\n ): Promise<void> {\n const { locateParam, restParams } = buildDetailedLocateParamAndRestParams(\n locatePrompt || '',\n this.withContext('aiPinch', opt),\n );\n\n await this.callActionInActionSpace('Pinch', {\n ...restParams,\n locate: locateParam,\n });\n }\n\n async aiLongPress(\n locatePrompt: TUserPrompt,\n opt?: LocateOption & { duration?: number },\n ): Promise<void> {\n assert(locatePrompt, 'missing locate prompt for long press');\n\n const { locateParam, restParams } = buildDetailedLocateParamAndRestParams(\n locatePrompt,\n this.withContext('aiLongPress', opt),\n );\n\n await this.callActionInActionSpace('LongPress', {\n ...restParams,\n locate: locateParam,\n });\n }\n\n async aiClearInput(\n locatePrompt: TUserPrompt,\n opt?: LocateOption,\n ): Promise<void> {\n assert(locatePrompt, 'missing locate prompt for clear input');\n\n const detailedLocateParam = buildDetailedLocateParam(\n locatePrompt,\n this.withContext('aiClearInput', opt),\n );\n\n await this.callActionInActionSpace('ClearInput', {\n locate: detailedLocateParam,\n });\n }\n\n async aiAct(\n taskPrompt: TUserPrompt,\n opt?: AiActOptions,\n ): Promise<string | undefined> {\n return this.withReportOperation(() => this.executeAiAct(taskPrompt, opt));\n }\n\n private async executeAiAct(\n taskPrompt: TUserPrompt,\n opt?: AiActOptions,\n ): Promise<string | undefined> {\n const internalOptions = opt as AiActInternalOptions | undefined;\n const internalReportDisplay = internalOptions?._internalReportDisplay;\n const taskPromptText =\n typeof taskPrompt === 'string' ? taskPrompt : taskPrompt.prompt;\n const reportPrompt = internalReportDisplay?.prompt || taskPromptText;\n const fileChooserAccept = opt?.fileChooserAccept\n ? this.normalizeFileInput(opt.fileChooserAccept)\n : undefined;\n\n const abortSignal = opt?.abortSignal;\n if (abortSignal?.aborted) {\n throw new Error(\n `aiAct aborted: ${abortSignal.reason || 'signal already aborted'}`,\n );\n }\n\n const runAiAct = async () => {\n const planningModel = this.resolveModelRuntime('planning');\n const locateModel = this.resolveModelRuntime('locate');\n const aiActContext = this.resolveUserContext('aiAct', opt?.context);\n const cachePrompt = buildPromptWithContext(taskPrompt, aiActContext);\n // Resolve the public planning controls at the API boundary. Internal\n // aiAct plumbing only uses effort from this point onward. The explicit\n // effort option takes precedence over deepThink when both are provided.\n const effort: AiActEffort = (() => {\n const resolvedEffort =\n opt?.effort ?? (opt?.deepThink === true ? 'deepThink' : 'balance');\n\n if (opt?.effort !== undefined && opt.deepThink !== undefined) {\n warn(\n 'When both \"effort\" and \"deepThink\" are provided, \"effort\" takes precedence.',\n );\n }\n\n if (\n resolvedEffort === 'fast' &&\n planningModel.adapter.planning.kind === 'custom'\n ) {\n throw new Error(\n `The \"fast\" aiAct effort is not supported with custom planning adapters (modelFamily: ${planningModel.config.modelFamily ?? 'unknown'}).`,\n );\n }\n\n if (\n resolvedEffort === 'deepThink' &&\n planningModel.adapter.planning.kind === 'custom'\n ) {\n warn(\n `The \"deepThink\" aiAct effort is not supported with custom planning adapters (modelFamily: ${planningModel.config.modelFamily ?? 'unknown'}). It will be ignored.`,\n );\n return 'balance';\n }\n\n return resolvedEffort;\n })();\n\n let deepLocate = opt?.deepLocate;\n if (\n deepLocate &&\n !planningModel.adapter.planning.supportsActionDeepLocate\n ) {\n warn(\n `The \"deepLocate\" option is not supported for aiAct with the current planning adapter (modelFamily: ${planningModel.config.modelFamily ?? 'unknown'}). It will be ignored.`,\n );\n deepLocate = false;\n }\n\n const cacheable = opt?.cacheable;\n const replanningCycleLimit =\n this.resolveReplanningCycleLimit(planningModel);\n const planCacheEnabled = planningModel.adapter.planning.cacheEnabled;\n const matchedCache =\n !planCacheEnabled || cacheable === false\n ? undefined\n : this.taskCache?.matchPlanCache(cachePrompt);\n let cachedYamlFailed = false;\n if (\n matchedCache?.cacheUsable &&\n this.taskCache?.isCacheResultUsed &&\n matchedCache.cacheContent?.yamlWorkflow?.trim()\n ) {\n const yaml = matchedCache.cacheContent.yamlWorkflow;\n try {\n // log into report file\n await this.taskExecutor.loadYamlFlowAsPlanning(\n taskPrompt,\n yaml,\n internalReportDisplay,\n );\n\n debug('matched cache, will call .runYaml to run the action');\n await runInYamlExecutionContext(async () => {\n const replay = enterYamlExecution(this);\n const leaveAction = abortSignal\n ? enterYamlAction(this, abortSignal)\n : undefined;\n try {\n await this.runYaml(yaml);\n } finally {\n leaveAction?.();\n replay.finish();\n }\n });\n return;\n } catch (error) {\n if (\n error instanceof YamlExecutionOwnershipError ||\n isActionReadinessError(error)\n )\n throw error;\n abortSignal?.throwIfAborted();\n cachedYamlFailed = true;\n warn(\n `cached aiAct plan failed, will replan and disable the stale cache: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n }\n\n // If cache matched but is not executable, fall through to normal execution\n const { output: actionOutput } = await this.taskExecutor.action(\n taskPrompt,\n planningModel,\n locateModel,\n aiActContext,\n cacheable,\n replanningCycleLimit,\n effort,\n undefined,\n deepLocate,\n abortSignal,\n internalReportDisplay,\n );\n\n // update cache\n if (this.taskCache && cacheable !== false) {\n const yamlFlow = cachedYamlFailed ? [] : actionOutput?.yamlFlow;\n\n if (!cachedYamlFailed && !yamlFlow?.length) {\n return actionOutput?.output;\n }\n\n const yamlFlowToCache = yamlFlow ?? [];\n const yamlContent: MidsceneYamlScript = {\n tasks: [\n {\n name: reportPrompt,\n flow: yamlFlowToCache,\n },\n ],\n };\n const yamlFlowStr = yaml.dump(yamlContent);\n this.taskCache.updateOrAppendCacheRecord(\n {\n type: 'plan',\n prompt: cachePrompt,\n yamlWorkflow: yamlFlowStr,\n },\n matchedCache,\n );\n }\n\n return actionOutput?.output;\n };\n\n const fileChooserAccepter = this.interface.registerFileChooserListener\n ? new FileChooserAccepter(this.interface)\n : undefined;\n this.activeFileChooserAccepter = fileChooserAccepter;\n this.activeFileChooserAllowedDir = opt?.fileChooserAllowedDir\n ? resolve(opt.fileChooserAllowedDir)\n : undefined;\n let aiActError: { error: unknown } | undefined;\n let fileChooserHandlingError: Error | undefined;\n let result: string | undefined;\n try {\n if (fileChooserAccept?.length) {\n if (!fileChooserAccepter) {\n throw new Error(\n `File upload is not supported on ${this.interface.interfaceType}`,\n );\n }\n await fileChooserAccepter.register(fileChooserAccept);\n }\n result = await runAiAct();\n } catch (error) {\n aiActError = { error };\n } finally {\n this.activeFileChooserAccepter = undefined;\n this.activeFileChooserAllowedDir = undefined;\n try {\n fileChooserHandlingError = await fileChooserAccepter?.clear();\n } catch (error) {\n warn(`Failed to clear file chooser registration: ${error}`);\n }\n }\n\n if (aiActError) {\n throw aiActError.error;\n }\n if (fileChooserHandlingError) {\n throw fileChooserHandlingError;\n }\n return result;\n }\n\n async runMarkdown(\n markdownPath: string,\n opt?: AiActOptions,\n ): Promise<string | undefined> {\n return this.withReportOperation(() =>\n this.executeMarkdown(markdownPath, opt),\n );\n }\n\n private async executeMarkdown(\n markdownPath: string,\n opt?: AiActOptions,\n ): Promise<string | undefined> {\n const markdown = await readFile(markdownPath, 'utf-8');\n const { prompt } = await markdownToAiActPrompt(markdown, markdownPath);\n return this.aiAct(prompt, {\n ...opt,\n _internalReportDisplay: {\n type: 'Markdown',\n prompt: basename(markdownPath),\n },\n } as AiActOptions);\n }\n\n async runGherkinScenario(\n scenarioText: string,\n opt?: RunGherkinScenarioOptions,\n ): Promise<void> {\n return this.withReportOperation(() =>\n runGherkinScenario(this, scenarioText, opt),\n );\n }\n\n /**\n * @deprecated Use {@link Agent.aiAct} instead.\n */\n async aiAction(taskPrompt: TUserPrompt, opt?: AiActOptions) {\n return this.aiAct(taskPrompt, opt);\n }\n\n async aiQuery<ReturnType = any>(\n demand: ServiceExtractParam,\n opt?: QueryOptions,\n ): Promise<ReturnType> {\n return this.createInsight().aiQuery<ReturnType>(demand, opt);\n }\n\n async aiBoolean(prompt: TUserPrompt, opt?: QueryOptions): Promise<boolean> {\n return this.createInsight().aiBoolean(prompt, opt);\n }\n\n async aiNumber(prompt: TUserPrompt, opt?: QueryOptions): Promise<number> {\n return this.createInsight().aiNumber(prompt, opt);\n }\n\n async aiString(prompt: TUserPrompt, opt?: QueryOptions): Promise<string> {\n return this.createInsight().aiString(prompt, opt);\n }\n\n async aiAsk(prompt: TUserPrompt, opt?: QueryOptions): Promise<string> {\n return this.createInsight().aiAsk(prompt, opt);\n }\n\n /**\n * Locate a target in screenshot coordinates. Preserve the model-provided rect\n * when available; otherwise, generate an approximate 8x8 compatibility box.\n * Do not rely on rect for strict element boundaries. Prefer center for the target.\n */\n async aiLocate(prompt: TUserPrompt, opt?: LocateOption) {\n return this.withReportOperation(() => this.executeLocate(prompt, opt));\n }\n\n private async executeLocate(prompt: TUserPrompt, opt?: LocateOption) {\n const locateParam = buildDetailedLocateParam(\n prompt,\n this.withContext('aiLocate', opt),\n );\n assert(locateParam, 'cannot get locate param for aiLocate');\n const locatePlan = locatePlanForLocate(locateParam);\n const plans = [locatePlan];\n const locateModel = this.resolveModelRuntime('locate');\n const planningModel = this.resolveModelRuntime('planning');\n\n const { output } = await this.taskExecutor.runPlans(\n taskTitleStr('Locate', locateParamStr(locateParam)),\n plans,\n planningModel,\n locateModel,\n opt?.uiContext ? { uiContext: opt.uiContext } : undefined,\n );\n\n const { element } = output;\n\n return {\n rect: element\n ? (element.rect ?? {\n left: Math.max(element.center[0] - 3.5, 0),\n top: Math.max(element.center[1] - 3.5, 0),\n width: 8,\n height: 8,\n })\n : undefined,\n center: element?.center,\n dpr: element?.dpr,\n } as Pick<LocateResultElement, 'center' | 'dpr'> & {\n rect: Rect;\n };\n }\n\n async aiAssert(\n assertion: TUserPrompt,\n msg?: string,\n opt?: AssertOptions,\n ): Promise<AgentAssertResult | undefined> {\n return this.createInsight().aiAssert(assertion, msg, opt);\n }\n\n async aiWaitFor(assertion: TUserPrompt, opt?: AgentWaitForOpt) {\n const modelRuntime = this.resolveModelRuntime('insight', 'boolean');\n const options = this.withContext('aiWaitFor', opt);\n await this.withReportOperation(() =>\n this.taskExecutor.waitFor(\n assertion,\n {\n ...options,\n timeoutMs: options?.timeoutMs || 15 * 1000,\n checkIntervalMs: options?.checkIntervalMs || 3 * 1000,\n },\n modelRuntime,\n ),\n );\n }\n\n async ai(...args: Parameters<typeof this.aiAct>) {\n return this.aiAct(...args);\n }\n\n async runYaml(\n yamlScriptContent: string,\n options?: { abortSignal?: AbortSignal },\n ): Promise<{\n result: Record<string, any>;\n }> {\n return this.withReportOperation(() =>\n this.executeYaml(yamlScriptContent, options),\n );\n }\n\n private async executeYaml(\n yamlScriptContent: string,\n options?: { abortSignal?: AbortSignal },\n ): Promise<{ result: Record<string, any> }> {\n if (this.destroyed)\n throw new Error('Cannot run YAML using a destroyed Agent.');\n const script = parseYamlScript(yamlScriptContent, 'yaml');\n const player = new ScriptPlayer(\n script,\n async () => {\n return { agent: this, freeFn: [] };\n },\n undefined,\n undefined,\n options?.abortSignal,\n );\n await player.run();\n\n if (player.status === 'error') {\n const readinessFailure = player.taskStatusList.find((task) =>\n isActionReadinessError(task.error),\n );\n if (readinessFailure) throw readinessFailure.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.withReportOperation(() =>\n this.interface.evaluateJavaScript!(script),\n );\n }\n\n /**\n * Add a dump update listener\n * @param listener Listener function\n * @returns A remove function that can be called to remove this listener\n */\n addDumpUpdateListener(\n listener: (dump: string, executionDump?: ExecutionDump) => void,\n ): () => void {\n return this.reportManager.addDumpUpdateListener(listener);\n }\n\n /** Remove a dump update listener. */\n removeDumpUpdateListener(\n listener: (dump: string, executionDump?: ExecutionDump) => void,\n ): void {\n this.reportManager.removeDumpUpdateListener(listener);\n }\n\n /** Clear all dump update listeners. */\n clearDumpUpdateListeners(): void {\n this.reportManager.clearDumpUpdateListeners();\n }\n\n /**\n * Subscribe to the generic agent progress bus. The listener receives every\n * progress event regardless of producer; narrow by `event.scope` to handle a\n * specific producer (e.g. `'aiAct'`).\n * @param listener Listener function\n * @returns A remove function that can be called to remove this listener\n */\n addProgressListener(listener: AgentProgressListener): () => void {\n return this.progressBus.subscribe(listener);\n }\n\n /**\n * Remove a progress listener added via {@link addProgressListener}.\n */\n removeProgressListener(listener: AgentProgressListener): void {\n this.progressBus.unsubscribe(listener);\n }\n\n /**\n * Clear all generic progress listeners.\n */\n clearProgressListeners(): void {\n this.progressBus.clear();\n }\n\n private notifyDumpUpdateListeners(executionDump?: ExecutionDump) {\n this.reportManager.notifyDumpUpdateListeners(executionDump);\n }\n\n async destroy() {\n // Early return if already destroyed\n if (this.destroyed) {\n return;\n }\n\n this.destroyed = true;\n\n // A Runner cancellation can finish before a non-cooperative device call.\n // Keep the public owner from disposing the interface until that call has\n // actually settled.\n await waitForResourceIdle(this);\n await this.reportManager.waitForOperations();\n\n // Observers own observation frame files until explicitly disposed.\n for (const observer of this.ownedObservers) {\n try {\n await observer.dispose();\n } catch (error) {\n debug(`error disposing unexported observer during destroy: ${error}`);\n }\n }\n this.ownedObservers.clear();\n this.activeObserver = null;\n\n let interfaceDestroyError: unknown;\n try {\n await this.interface.destroy?.();\n } catch (error) {\n interfaceDestroyError = error;\n }\n\n await this.reportManager.waitForReset();\n // Owned YAML cleanup runs before its record includes cleanup errors. The\n // player publishes that record and its source snapshot before finalizing.\n if (!hasActiveYamlExecution(this)) await this.finalizeReport();\n\n if (interfaceDestroyError) {\n throw interfaceDestroyError;\n }\n }\n\n /**\n * Wait for a finite, positive duration in milliseconds and record it as a\n * Sleep task with the standard UI snapshots. Does not invoke device action\n * hooks or call a model, but standard UI capture requires valid model\n * configuration. Recorded elapsed time includes screenshot overhead.\n * Initial UI capture failure rejects before waiting; a failed final\n * screenshot does not fail an otherwise completed wait.\n */\n async sleep(\n ms: number,\n options?: { abortSignal?: AbortSignal },\n ): Promise<void> {\n options?.abortSignal?.throwIfAborted();\n await this.withReportOperation(() =>\n this.taskExecutor.sleep(ms, options?.abortSignal),\n );\n }\n\n async recordToReport(title?: string, opt?: RecordToReportOptions) {\n return this.withReportOperation(() => this.writeRecordToReport(title, opt));\n }\n\n private async writeRecordToReport(\n title?: string,\n opt?: RecordToReportOptions,\n ) {\n const now = Date.now();\n const screenshots = opt?.screenshots;\n const screenshotBase64 = opt?.screenshotBase64;\n const hasScreenshots = screenshots !== undefined;\n const hasScreenshotBase64 = screenshotBase64 !== undefined;\n if (hasScreenshots && !Array.isArray(screenshots)) {\n throw new Error('recordToReport: screenshots must be an array');\n }\n if (hasScreenshotBase64 && typeof screenshotBase64 !== 'string') {\n throw new Error('recordToReport: screenshotBase64 must be a string');\n }\n if (hasScreenshots && hasScreenshotBase64) {\n throw new Error(\n 'recordToReport: provide only one of screenshots or screenshotBase64',\n );\n }\n if (opt && 'subType' in opt) {\n throw new Error('recordToReport: subType is not supported');\n }\n const customScreenshots = hasScreenshots ? screenshots : undefined;\n if (customScreenshots && customScreenshots.length === 0) {\n throw new Error('recordToReport: screenshots cannot be empty');\n }\n const screenshotInputs: RecordToReportScreenshot[] =\n customScreenshots ??\n (hasScreenshotBase64\n ? [{ base64: screenshotBase64 }]\n : [{ base64: await this.interface.screenshotBase64() }]);\n\n // 1. build recorder\n const recorder: ExecutionRecorderItem[] = screenshotInputs.map(\n (screenshotInput, index) => {\n const normalizedScreenshotInput = normalizeRecordToReportScreenshot(\n screenshotInput,\n index,\n );\n const ts = now + index;\n return {\n type: 'screenshot',\n ts,\n screenshot: ScreenshotItem.create(\n normalizedScreenshotInput.base64,\n ts,\n ),\n description: normalizedScreenshotInput.description,\n };\n },\n );\n // 2. build ExecutionTaskLog\n const task: ExecutionTaskLog = {\n taskId: uuid(),\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 // 3. build ExecutionDump\n const executionDump = new ExecutionDump({\n id: uuid(),\n logTime: now,\n name: `Log - ${title || 'untitled'}`,\n description: opt?.content || '',\n tasks: [task],\n });\n // 4. append to execution dump\n this.appendExecutionDump(executionDump);\n\n this.writeOutActionDumps(executionDump);\n await this.reportManager.flushPendingWrites();\n\n // Call all registered dump update listeners\n this.notifyDumpUpdateListeners(executionDump);\n }\n\n async recordErrorToReport(\n title: string,\n opt: {\n /** Any thrown value; normalized before it is stored in the report. */\n error: unknown;\n content?: string;\n screenshotBase64?: string;\n },\n ) {\n return this.withReportOperation(() => this.writeErrorToReport(title, opt));\n }\n\n private async writeErrorToReport(\n title: string,\n opt: { error: unknown; content?: string; screenshotBase64?: string },\n ) {\n const now = Date.now();\n const error = serializeError(opt.error);\n const recorder: ExecutionRecorderItem[] = [];\n const base64 =\n opt.screenshotBase64 ?? (await this.interface.screenshotBase64());\n if (base64) {\n recorder.push({\n type: 'screenshot',\n ts: now,\n screenshot: ScreenshotItem.create(base64, now),\n });\n }\n\n const task: ExecutionTaskLog = {\n taskId: uuid(),\n type: 'Log',\n subType: 'Error',\n status: 'failed',\n recorder,\n timing: {\n start: now,\n end: now,\n cost: 0,\n },\n param: {\n content: opt.content || '',\n },\n error,\n errorMessage: error.message,\n errorStack: error.stack,\n executor: async () => {},\n };\n\n const executionDump = new ExecutionDump({\n id: uuid(),\n logTime: now,\n name: title,\n description: opt.content || error.message,\n tasks: [task],\n });\n\n this.appendExecutionDump(executionDump);\n this.writeOutActionDumps(executionDump);\n await this.reportManager.flushPendingWrites();\n this.notifyDumpUpdateListeners(executionDump);\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 return {\n groupName,\n groupDescription,\n executions: executions || [],\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 private normalizeFileInput(files: string | string[]): string[] {\n const filesArray = Array.isArray(files) ? files : [files];\n return normalizeFilePaths(filesArray);\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":["debug","getDebug","warn","AgentScopedModelConfigManager","ModelConfigManager","intent","baseManager","createOpenAIClient","Agent","commonAgentTestRunnerNodeDefinitions","value","scopeId","executionIds","record","callback","apiName","callContext","undefined","apiContext","defaultContext","options","resolvedContext","planningModel","globalConfigManager","MIDSCENE_REPLANNING_CYCLE_LIMIT","task","runtime","resolveModelForTask","usage","enriched","getUIContext","Insight","args","_error","action","maxRetries","attempt","commonContextParser","error","Promise","resolve","setTimeout","opt","assert","observer","UIObserverImpl","uiContextFromObservationRecord","disposeError","prompt","target","context","isAgentAIContextKey","TypeError","String","operation","execution","runner","key","dedupKey","INTERNAL_CALL_ID_FIELD","executionDump","param","paramStr","tip","typeStr","name","type","abortSignal","clonedActionParam","Array","actionPlan","plans","Boolean","title","taskTitleStr","locateParamStr","locateModel","output","currentYamlSignal","locatePrompt","detailedLocateParam","buildDetailedLocateParam","fileChooserAccept","withFileChooser","locatePromptOrValue","locatePromptOrOpt","optOrUndefined","optWithValue","locateParam","restParams","buildDetailedLocateParamAndRestParams","stringValue","mode","locatePromptOrKeyName","keyName","locatePromptOrScrollParam","scrollParam","isLocatePromptLike","normalizedScrollType","normalizeScrollType","taskPrompt","internalOptions","internalReportDisplay","taskPromptText","reportPrompt","Error","runAiAct","aiActContext","cachePrompt","buildPromptWithContext","effort","resolvedEffort","deepLocate","cacheable","replanningCycleLimit","planCacheEnabled","matchedCache","cachedYamlFailed","yaml","runInYamlExecutionContext","replay","enterYamlExecution","leaveAction","enterYamlAction","YamlExecutionOwnershipError","isActionReadinessError","actionOutput","yamlFlow","yamlFlowToCache","yamlContent","yamlFlowStr","fileChooserAccepter","FileChooserAccepter","aiActError","fileChooserHandlingError","result","markdownPath","markdown","readFile","markdownToAiActPrompt","basename","scenarioText","runGherkinScenario","demand","locatePlan","locatePlanForLocate","element","Math","assertion","msg","modelRuntime","yamlScriptContent","script","parseYamlScript","player","ScriptPlayer","readinessFailure","errors","listener","waitForResourceIdle","interfaceDestroyError","hasActiveYamlExecution","ms","now","Date","screenshots","screenshotBase64","hasScreenshots","hasScreenshotBase64","customScreenshots","screenshotInputs","recorder","screenshotInput","index","normalizedScreenshotInput","normalizeRecordToReportScreenshot","ts","ScreenshotItem","uuid","ExecutionDump","serializeError","base64","groupName","groupDescription","executions","files","filesArray","normalizeFilePaths","interfaceInstance","opts","MetricsCollector","Set","AgentProgressBus","withAgentDefaults","ActionReadiness","normalizeAgentOptions","globalModelConfigManager","Service","cacheConfigObj","normalizeAgentCacheConfig","TaskCache","baseActionSpace","fileChooserActions","defineActionRegisterFileChooserAccept","defineActionSleep","TaskExecutor","AgentReportManager","hasPendingResourceOperation","Object","observationArtifactAdapterSymbol","observation","UIObservationImpl","createAgent"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"agent/agent.mjs","sources":["../../../src/agent/agent.ts"],"sourcesContent":["import type { ModelTaskType } from '@/ai-model/model-adapter/types';\nimport type { ModelRuntime } from '@/ai-model/models';\nimport { resolveModelForTaskType } from '@/ai-model/models/model-fallback';\nimport { INTERNAL_CALL_ID_FIELD } from '@/ai-model/service-caller';\nimport yaml from 'js-yaml';\nimport type { TUserPrompt } from '../ai-model/index';\nimport { ScreenshotItem } from '../screenshot-item';\nimport Service from '../service/index';\nimport {\n hasPendingResourceOperation,\n waitForResourceIdle,\n} from '../test-runner/engine/resource-operations';\nimport type { WorkflowExecutionRecord } from '../test-runner/execution-record';\n// Import types and values directly from their source files to avoid circular dependency\n// DO NOT import from '../index' as it creates a circular dependency:\n// index.ts -> agent/index.ts -> agent/agent.ts -> index.ts\nimport {\n type AIUsageInfo,\n type ActionParam,\n type ActionReturn,\n type AgentAIContextKey,\n type AgentAIContexts,\n type AgentAssertResult,\n type AgentOpt,\n type AgentProgressListener,\n type AgentWaitForOpt,\n type AiActEffort,\n type AiApiName,\n type AssertOptions,\n type DeepThinkOption,\n type DeviceAction,\n ExecutionDump,\n type ExecutionRecorderItem,\n type ExecutionTask,\n type ExecutionTaskLog,\n type InsightAPI,\n type LocateOption,\n type LocateResultElement,\n type OnTaskStartTip,\n type PlanningAction,\n type QueryOptions,\n type RecordToReportOptions,\n type RecordToReportScreenshot,\n type Rect,\n type ReportActionDump,\n type ScrollParam,\n type ServiceAction,\n type ServiceExtractParam,\n type TestStatus,\n type UIContext,\n} from '../types';\nimport type { MidsceneYamlScript } from '../yaml';\nimport {\n YamlExecutionOwnershipError,\n currentYamlSignal,\n enterYamlAction,\n enterYamlExecution,\n hasActiveYamlExecution,\n runInYamlExecutionContext,\n} from '../yaml/execution-session';\n\nimport {\n ScriptPlayer,\n buildDetailedLocateParam,\n buildDetailedLocateParamAndRestParams,\n parseYamlScript,\n} from '../yaml/index';\n\nimport { readFile } from 'node:fs/promises';\nimport { basename, resolve } from 'node:path';\nimport type { AbstractInterface, InputStrategy } from '@/device';\nimport type { TaskRunner } from '@/task-runner';\nimport { isAgentAIContextKey } from '@midscene/shared/agent-tools/agent-context';\nimport { serializeError } from '@midscene/shared/agent-tools/error-formatter';\nimport {\n type ObservationArtifactAdapter,\n observationArtifactAdapterSymbol,\n} from '@midscene/shared/agent-tools/observation-artifact';\nimport {\n type CreateOpenAIClientFn,\n type IModelConfig,\n MIDSCENE_REPLANNING_CYCLE_LIMIT,\n ModelConfigManager,\n type TIntent,\n globalConfigManager,\n globalModelConfigManager,\n} from '@midscene/shared/env';\nimport { getDebug } from '@midscene/shared/logger';\nimport { assert, uuid } from '@midscene/shared/utils';\nimport {\n defineActionRegisterFileChooserAccept,\n defineActionSleep,\n} from '../device';\nimport { ActionReadiness, isActionReadinessError } from './action-readiness';\nimport { normalizeAgentOptions, withAgentDefaults } from './agent-options';\nimport { AgentReportManager } from './agent-report-manager';\nimport { normalizeAgentCacheConfig } from './cache-config';\nimport { FileChooserAccepter } from './file-chooser';\nimport { Insight } from './insight';\nimport { MetricsCollector, type MidsceneUsageMetrics } from './metrics';\nimport { AgentProgressBus } from './progress';\nimport { buildPromptWithContext } from './prompt-context';\nimport { normalizeRecordToReportScreenshot } from './record-to-report';\nimport {\n type RunGherkinScenarioOptions,\n runGherkinScenario,\n} from './run-gherkin-scenario';\nimport { markdownToAiActPrompt } from './run-markdown';\nimport { TaskCache } from './task-cache';\nimport { TaskExecutor, locatePlanForLocate, withFileChooser } from './tasks';\nimport {\n type AgentTestRunnerNodeDefinition,\n commonAgentTestRunnerNodeDefinitions,\n} from './test-runner-nodes';\nimport {\n UIObservationImpl,\n type UIObserver,\n UIObserverImpl,\n type UIObserverOption,\n uiContextFromObservationRecord,\n} from './ui-observer';\nimport {\n type TaskTitleType,\n locateParamStr,\n paramStr,\n taskTitleStr,\n typeStr,\n} from './ui-utils';\nimport {\n commonContextParser,\n normalizeFilePaths,\n normalizeScrollType,\n} from './utils';\n\nconst debug = getDebug('agent');\nconst warn = getDebug('agent', { console: true });\n\nclass AgentScopedModelConfigManager extends ModelConfigManager {\n constructor(\n private readonly baseManager: ModelConfigManager,\n private readonly createOpenAIClient?: CreateOpenAIClientFn,\n ) {\n super();\n }\n\n override getModelConfig(intent: TIntent): IModelConfig {\n return {\n ...this.baseManager.getModelConfig(intent),\n createOpenAIClient: this.createOpenAIClient,\n };\n }\n}\n\nexport type AiActOptions = {\n cacheable?: boolean;\n fileChooserAccept?: string | string[];\n fileChooserAllowedDir?: string;\n effort?: AiActEffort;\n deepThink?: DeepThinkOption;\n deepLocate?: boolean;\n abortSignal?: AbortSignal;\n /**\n * Additional facts, rules, constraints, or output requirements for this AI\n * call. It overrides `aiContexts.aiAct` and `aiContexts.default`; `''`\n * disables inherited user context for this call.\n */\n context?: string;\n};\n\ntype AiActInternalOptions = AiActOptions & {\n _internalReportDisplay?: {\n type?: TaskTitleType;\n prompt?: string;\n };\n};\n\n/**\n * Shared input option type for aiInput(), used consistently across\n * overload signatures and the implementation so fields don't drift.\n */\ntype AgentInputOption = LocateOption & {\n autoDismissKeyboard?: boolean;\n keyboardTypeDelay?: number;\n inputStrategy?: InputStrategy;\n mode?: 'replace' | 'clear' | 'typeOnly' | 'append';\n};\n\nexport class Agent<InterfaceType extends AbstractInterface = AbstractInterface>\n implements InsightAPI\n{\n /** Nodes this Agent class intentionally exposes to Test Runner. */\n static getTestRunnerNodeDefinitions(): readonly AgentTestRunnerNodeDefinition[] {\n return commonAgentTestRunnerNodeDefinitions;\n }\n\n interface: InterfaceType;\n\n service: Service;\n\n private reportManager: AgentReportManager;\n\n get dump(): ReportActionDump {\n return this.reportManager.dump;\n }\n set dump(value: ReportActionDump) {\n this.reportManager.dump = value;\n }\n get reportFile(): string | null | undefined {\n return this.reportManager.reportFile;\n }\n set reportFile(value: string | null | undefined) {\n this.reportManager.reportFile = value;\n }\n get reportFileName(): string | undefined {\n return this.reportManager.reportFileName;\n }\n set reportFileName(value: string | undefined) {\n this.reportManager.reportFileName = value;\n }\n\n /** @internal Runner snapshots retain immutable data and shared image files. */\n _prepareForTestRunner(): void {\n this.reportManager._prepareForTestRunner();\n }\n async _createReportSource(scopeId: string, executionIds?: readonly string[]) {\n return this.reportManager._createReportSource(scopeId, executionIds);\n }\n\n /** @internal The Agent owns one report stream across root YAML invocations. */\n async _writeYamlExecutionReport(\n record: WorkflowExecutionRecord,\n ): Promise<string | undefined> {\n return this.reportManager._writeYamlExecutionReport(record);\n }\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 private readonly metricsCollector = new MetricsCollector();\n\n // Monotonic counter for generating unique dedup keys when a usage has no\n // request_id (e.g. estimated streaming usage).\n private usageCallCounter = 0;\n\n // Usage values already folded into `metricsCollector`, keyed by\n // `${taskId}:${field}` so re-emitted snapshots never double-count.\n private readonly countedUsageKeys = new Set<string>();\n\n // Generic progress bus: every producer (aiAct today, more later) broadcasts\n // through here. Consumers narrow by `event.scope`.\n private readonly progressBus = new AgentProgressBus();\n\n get onDumpUpdate():\n | ((dump: string, executionDump?: ExecutionDump) => void)\n | undefined {\n return this.reportManager.onDumpUpdate;\n }\n set onDumpUpdate(callback:\n | ((dump: string, executionDump?: ExecutionDump) => void)\n | undefined) {\n this.reportManager.onDumpUpdate = callback;\n }\n\n destroyed = false;\n\n private readonly actionReadiness?: ActionReadiness;\n\n modelConfigManager: ModelConfigManager;\n\n /**\n * Frozen page context for consistent AI operations\n */\n private frozenUIContext?: UIContext;\n\n /**\n * Currently active UIObserver (from startObserving). Only one observer may\n * be active at a time since frame sources are device-level singletons.\n */\n private activeObserver: UIObserverImpl | null = null;\n\n /** Observers own temporary frame files until their observation is disposed. */\n private ownedObservers = new Set<UIObserverImpl>();\n\n private get aiContexts(): AgentAIContexts {\n if (!this.opts.aiContexts) {\n this.opts.aiContexts = {};\n }\n return this.opts.aiContexts;\n }\n\n private resolveUserContext(\n apiName: AiApiName,\n callContext?: string,\n ): string | undefined {\n if (callContext !== undefined) {\n return callContext;\n }\n\n const apiContext = this.opts.aiContexts?.[apiName];\n if (apiContext !== undefined) {\n return apiContext;\n }\n\n const defaultContext = this.opts.aiContexts?.default;\n if (defaultContext !== undefined) {\n return defaultContext;\n }\n\n return undefined;\n }\n\n private withContext<T extends { context?: string }>(\n apiName: AiApiName,\n options?: T,\n ): T | undefined {\n const resolvedContext = this.resolveUserContext(apiName, options?.context);\n if (resolvedContext === undefined) {\n return options;\n }\n\n return {\n ...(options ?? ({} as T)),\n context: resolvedContext,\n };\n }\n\n private fullActionSpace: DeviceAction[];\n\n private activeFileChooserAccepter?: FileChooserAccepter;\n\n private activeFileChooserAllowedDir?: string;\n\n // @deprecated use .interface instead\n get page() {\n return this.interface;\n }\n\n /**\n * Fails fast for non-web interfaces when the model family is missing.\n *\n * Early Midscene web usage allowed running without `modelFamily` and falling\n * back to a default bbox parser. Non-web users do not have that compatibility\n * path, so this check helps surface configuration problems before spending a\n * model call.\n *\n * Web flows validate missing locate model family at workflow boundaries:\n * `Service.locate` throws when aiTap/aiType fallback to the default model for\n * direct locate, and generic planning throws when aiAct asks a planning model\n * to return inline locate coordinates. Those checks are intentionally placed\n * where Midscene knows which model role should provide coordinate parsing.\n */\n private assertModelFamilyForNonWebContext() {\n if (\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 }\n }\n\n private resolveReplanningCycleLimit(planningModel: ModelRuntime): number {\n return (\n this.opts.replanningCycleLimit ??\n globalConfigManager.getEnvConfigValueAsNumber(\n MIDSCENE_REPLANNING_CYCLE_LIMIT,\n ) ??\n planningModel.adapter.planning.defaultReplanningCycleLimit\n );\n }\n\n private resolveModelRuntime(\n intent: TIntent,\n taskType: ModelTaskType,\n ): ModelRuntime {\n const runtime = resolveModelForTaskType(\n this.modelConfigManager,\n intent,\n taskType,\n );\n return {\n ...runtime,\n onUsage: (usage) => {\n this.usageCallCounter += 1;\n // buildUsageInfo leaves intent undefined; fill it from the\n // requested role, even when its configuration falls back to default.\n const enriched = usage.intent ? usage : { ...usage, intent };\n this.consumeUsage(\n enriched,\n `callai:${usage.request_id ?? this.usageCallCounter}`,\n );\n },\n };\n }\n\n private createInsight(getUIContext?: () => UIContext): Insight {\n return new Insight(\n {\n createTypeQueryExecution: (...args) =>\n this.withReportOperation(() =>\n this.taskExecutor.createTypeQueryExecution(...args),\n ),\n },\n (taskType) => this.resolveModelRuntime('insight', taskType),\n (apiName, callContext) => this.resolveUserContext(apiName, callContext),\n getUIContext,\n );\n }\n\n constructor(interfaceInstance: InterfaceType, opts?: AgentOpt) {\n this.interface = interfaceInstance;\n\n this.opts = withAgentDefaults(opts);\n if (this.opts.waitForActionReady !== undefined) {\n this.actionReadiness = new ActionReadiness(this.opts.waitForActionReady);\n }\n\n normalizeAgentOptions(this.opts, warn);\n\n // Explicit modelConfig is isolated from global configuration.\n // A custom client factory alone still uses the global model values.\n this.modelConfigManager = opts?.modelConfig\n ? new ModelConfigManager(opts.modelConfig, opts.createOpenAIClient)\n : opts?.createOpenAIClient\n ? new AgentScopedModelConfigManager(\n globalModelConfigManager,\n opts.createOpenAIClient,\n )\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 = normalizeAgentCacheConfig(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 cacheDir: cacheConfigObj.cacheDir,\n },\n );\n }\n\n const baseActionSpace = this.interface.actionSpace();\n const fileChooserActions = this.interface.registerFileChooserListener\n ? [\n defineActionRegisterFileChooserAccept(async (files) => {\n if (!this.activeFileChooserAccepter) {\n throw new Error(\n 'RegisterFileChooserAccept can only be used while aiAct is running',\n );\n }\n if (!this.activeFileChooserAllowedDir) {\n throw new Error(\n 'RegisterFileChooserAccept requires aiAct option fileChooserAllowedDir',\n );\n }\n await this.activeFileChooserAccepter.registerFromAllowedDir(\n files,\n this.activeFileChooserAllowedDir,\n );\n }),\n ]\n : [];\n this.fullActionSpace = [\n ...baseActionSpace,\n ...fileChooserActions,\n defineActionSleep(),\n ];\n\n this.taskExecutor = new TaskExecutor(this.interface, this.service, {\n getDefaultModelRuntime: () =>\n this.resolveModelRuntime('default', 'general'),\n taskCache: this.taskCache,\n onTaskStart: this.callbackOnTaskStartTip.bind(this),\n replanningCycleLimit: this.opts.replanningCycleLimit,\n waitAfterAction: this.opts.waitAfterAction,\n actionReadiness: this.actionReadiness,\n useDeviceTime: this.opts.useDeviceTime,\n getAbortSignal: () => currentYamlSignal(this),\n operationResource: this,\n actionSpace: this.fullActionSpace,\n hooks: {\n onExecutionCreated: (runner) => {\n this.reportManager.bindRunner(runner);\n },\n onSnapshotChange: async (runner) => {\n this.reportManager.assertRunnerCurrent(runner);\n const executionDump = runner.dump();\n this.appendExecutionDump(executionDump, runner);\n this.collectUsageMetrics(executionDump);\n\n // Persist report updates before notifying listeners so screenshot\n // payloads can be released from memory and serialized as references.\n this.writeOutActionDumps(executionDump);\n await this.reportManager.flushPendingWrites();\n this.reportManager.notifyDumpUpdateListeners(executionDump);\n },\n onProgress: this.progressBus.publish,\n },\n });\n this.reportManager = new AgentReportManager({\n getOptions: () => this.opts,\n getDeviceType: () => this.interface.interfaceType,\n isDestroyed: () => this.destroyed,\n isExternallyBusy: () =>\n Boolean(this.activeObserver) ||\n hasActiveYamlExecution(this) ||\n hasPendingResourceOperation(this),\n });\n\n Object.defineProperty(this, observationArtifactAdapterSymbol, {\n value: {\n exportRecord: async (observation) => {\n assert(\n observation instanceof UIObservationImpl,\n 'Cannot export an observation that was not created by this Midscene runtime',\n );\n return observation.exportRecord();\n },\n loadRecord: (record) => {\n // CLI manifests are validated before this adapter is called. Rebuild\n // once here as a final runtime-boundary check before creating insight.\n uiContextFromObservationRecord(record);\n return new UIObservationImpl(\n record,\n this.createInsight(() => uiContextFromObservationRecord(record)),\n );\n },\n } satisfies ObservationArtifactAdapter,\n });\n }\n\n async getActionSpace(): Promise<DeviceAction[]> {\n return this.fullActionSpace;\n }\n\n private static readonly CONTEXT_RETRY_MAX = 3;\n private static readonly CONTEXT_RETRY_DELAY_MS = 1500;\n\n /**\n * Override in subclasses to indicate which errors are transient and should\n * trigger an automatic retry when building the UI context.\n * Returns `false` by default (no retry).\n */\n protected isRetryableContextError(_error: unknown): boolean {\n return false;\n }\n\n async getUIContext(action?: ServiceAction): Promise<UIContext> {\n // Some non-web flows, such as Android, need an Agent instance before they\n // can call device methods via ADB, so defer missing modelFamily errors\n // until UI context is actually requested.\n this.assertModelFamilyForNonWebContext();\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 const maxRetries = Agent.CONTEXT_RETRY_MAX;\n for (let attempt = 0; ; attempt++) {\n try {\n return await commonContextParser(this.interface, {\n uploadServerUrl: this.modelConfigManager.getUploadTestServerUrl(),\n screenshotShrinkFactor: this.opts.screenshotShrinkFactor,\n });\n } catch (error) {\n if (attempt < maxRetries && this.isRetryableContextError(error)) {\n debug(\n `retryable context error (attempt ${attempt + 1}/${maxRetries}), retrying in ${Agent.CONTEXT_RETRY_DELAY_MS}ms: ${error}`,\n );\n await new Promise((resolve) =>\n setTimeout(resolve, Agent.CONTEXT_RETRY_DELAY_MS),\n );\n continue;\n }\n throw error;\n }\n }\n }\n\n async _snapshotContext(): Promise<UIContext> {\n return await this.getUIContext('locate');\n }\n\n /**\n * Start observing the screen in the background and return a fixed insight\n * surface when the observation is stopped:\n *\n * ```ts\n * const observer = await agent.startObserving();\n * await agent.aiAct('submit the form');\n * const observation = await observer.stop();\n * await observation.aiAssert('a success toast appeared during the process');\n * ```\n *\n * Frames come from the device's continuous frame source when available\n * (scrcpy on Android, WDA MJPEG on iOS — both opt-in; CDP screencast on\n * web) and fall back to plain screenshots otherwise. Sampling is capped at\n * 5fps, the buffer is bounded and self-thinning, decoding is deferred to\n * the end, and all buffered frames (up to `maxFrames`) are sent to\n * the model at insight time. To control token cost for long windows,\n * increase `intervalMs` or decrease `maxFrames`.\n * Awaiting `startObserving()` guarantees one baseline frame is captured\n * before your next action.\n */\n async startObserving(opt?: UIObserverOption): Promise<UIObserver> {\n this.assertReportWritable();\n // A frozen context pins perception to a single snapshot; observing a\n // window of frames contradicts that. Fail fast instead of silently\n // producing an all-identical sequence.\n assert(\n !this.frozenUIContext,\n 'startObserving() cannot be used while the UI context is frozen (call unfreezePageContext() first)',\n );\n // Frame sources are device-level singletons — two concurrent observers\n // would conflict (scrcpy stream, WDA MJPEG port, CDP screencast).\n assert(\n !this.activeObserver,\n 'An observation window is already active on this agent. ' +\n 'Stop the existing observer first (await observer.stop()) before starting a new one.',\n );\n const observer = new UIObserverImpl(\n {\n openFrameSource: async () =>\n (await this.interface.openFrameSource?.()) ?? undefined,\n // Fallback single-frame capture. Deliberately bypasses getUIContext so\n // the observation loop never pollutes the TaskRunner context cache.\n captureRawScreenshot: () => this.interface.screenshotBase64(),\n capturePreparedRepresentative: () => this.getUIContext('assert'),\n createInsight: (record) =>\n this.createInsight(() => uiContextFromObservationRecord(record)),\n onStopped: () => {\n if (this.activeObserver === observer) {\n this.activeObserver = null;\n }\n },\n onDisposed: () => this.ownedObservers.delete(observer),\n screenshotShrinkFactor: this.opts.screenshotShrinkFactor,\n },\n opt,\n );\n // Mark as active BEFORE the async start() so concurrent calls hit the\n // assert guard above. If start() throws, clear the reference below.\n this.activeObserver = observer;\n this.ownedObservers.add(observer);\n try {\n await observer.start();\n } catch (error) {\n this.activeObserver = null;\n this.ownedObservers.delete(observer);\n await observer.dispose().catch((disposeError) => {\n debug(`error disposing failed observer start: ${disposeError}`);\n });\n throw error;\n }\n return observer;\n }\n\n /**\n * @deprecated Use `setAIContext('aiAct', context)` instead.\n */\n async setAIActionContext(prompt: string) {\n warn(\n 'setAIActionContext() is deprecated; use setAIContext(\"aiAct\", context) instead.',\n );\n this.setAIContext('aiAct', prompt);\n }\n\n /**\n * @deprecated Use `setAIContext('aiAct', context)` instead.\n */\n async setAIActContext(prompt: string) {\n warn(\n 'setAIActContext() is deprecated; use setAIContext(\"aiAct\", context) instead.',\n );\n this.setAIContext('aiAct', prompt);\n }\n\n /**\n * Set Agent-level AI guidance. Use `default` as the shared fallback for all\n * AI-powered APIs, or an API name to override that fallback for the API.\n * API-specific values are not automatically merged with `default`.\n * Passing `undefined` removes the selected value; an API then falls back to\n * `default`, while removing `default` disables the shared fallback. Passing\n * `''` keeps an explicit empty value and therefore prevents an API from using\n * `default`.\n */\n setAIContext(target: AgentAIContextKey, context: string | undefined): void {\n if (!isAgentAIContextKey(target)) {\n throw new TypeError(`Unknown Agent context key: ${String(target)}`);\n }\n if (context !== undefined && typeof context !== 'string') {\n throw new TypeError('Agent context must be a string or undefined');\n }\n\n this.aiContexts[target] = context;\n\n if (target === 'aiAct') {\n if (context === undefined) {\n this.opts.aiActContext = undefined;\n this.opts.aiActionContext = undefined;\n } else {\n this.opts.aiActContext = context;\n this.opts.aiActionContext = context;\n }\n }\n }\n\n private assertReportWritable(): void {\n this.reportManager.assertReportWritable();\n }\n\n private async withReportOperation<T>(\n operation: () => Promise<T>,\n ): Promise<T> {\n return this.reportManager.withReportOperation(operation);\n }\n\n /**\n * Finalize the preceding report and reset execution records for a new report.\n * Historical artifacts are retained; this Agent and its device stay connected.\n * Await this method before executing again. Concurrent resets share one reset.\n */\n async resetDump(): Promise<ReportActionDump> {\n return this.reportManager.resetDump();\n }\n\n /**\n * Seal the current report and release its in-memory records without\n * disconnecting the device. Export in-memory data before calling this method.\n * Repeated calls return the same result and never rewrite published artifacts.\n */\n async finalizeReport(): Promise<string | undefined> {\n return this.reportManager.finalizeReport();\n }\n\n appendExecutionDump(execution: ExecutionDump, runner?: TaskRunner) {\n this.reportManager.appendExecutionDump(execution, runner);\n }\n\n /**\n * Fold any not-yet-counted task usage from an execution dump into the\n * instance metrics. Snapshots are re-emitted as tasks progress, so each\n * usage value is keyed by `${taskId}:${field}` and counted at most once.\n */\n private collectUsageMetrics(execution: ExecutionDump) {\n for (const task of execution.tasks) {\n this.consumeUsage(task.usage, `${task.taskId}:usage`);\n this.consumeUsage(task.searchAreaUsage, `${task.taskId}:searchAreaUsage`);\n }\n }\n\n private consumeUsage(usage: AIUsageInfo | undefined, key: string) {\n if (!usage) {\n return;\n }\n // Dedup key priority:\n // 1. request_id — provider-issued, stable across onUsage and task dump paths\n // 2. INTERNAL_CALL_ID_FIELD — callGenerativeAI-generated internal id, covers\n // providers that don't return a request_id\n // 3. caller-provided key (taskId:field or callai:counter)\n let dedupKey: string;\n if (usage.request_id) {\n dedupKey = `req:${usage.request_id}`;\n } else if ((usage as any)[INTERNAL_CALL_ID_FIELD]) {\n dedupKey = `int:${(usage as any)[INTERNAL_CALL_ID_FIELD]}`;\n } else {\n dedupKey = key;\n }\n if (this.countedUsageKeys.has(dedupKey)) {\n return;\n }\n this.countedUsageKeys.add(dedupKey);\n this.metricsCollector.add(usage);\n if (this.opts.onLLMUsage) {\n try {\n this.opts.onLLMUsage(usage);\n } catch (error) {\n warn(`onLLMUsage listener threw, ignoring: ${error}`);\n }\n }\n }\n\n /**\n * Aggregated LLM usage accumulated by this agent since it was created.\n */\n get metrics(): MidsceneUsageMetrics {\n return this.metricsCollector.snapshot();\n }\n\n dumpDataString(opt?: { inlineScreenshots?: boolean }) {\n return this.reportManager.dumpDataString(opt);\n }\n\n reportHTMLString(opt?: { inlineScreenshots?: boolean }) {\n return this.reportManager.reportHTMLString(() => this.dumpDataString(opt));\n }\n\n writeOutActionDumps(executionDump?: ExecutionDump) {\n this.reportManager.writeOutActionDumps(executionDump);\n }\n\n /** Persist current report data without disposing this Agent or its device. */\n async flushReport(): Promise<string | undefined> {\n return this.reportManager.flushReport();\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 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 abortSignal?: AbortSignal,\n ) {\n return this.withReportOperation(() =>\n this.executeActionInActionSpace<T>(type, opt, abortSignal),\n );\n }\n\n private async executeActionInActionSpace<T>(\n type: string,\n opt?: T,\n abortSignal?: AbortSignal,\n ) {\n debug('callActionInActionSpace', type, ',', opt);\n\n const clonedActionParam =\n opt && typeof opt === 'object' && !Array.isArray(opt)\n ? { ...opt }\n : opt || {};\n\n const actionPlan: PlanningAction<T> = {\n type: type as any,\n // Planning resolves locate/from/to in place. Keep the caller's inputs\n // intact so YAML and Test execution facts retain the original prompts.\n param: clonedActionParam 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 locateModel = this.resolveModelRuntime('locate', 'locate');\n const planningModel = this.resolveModelRuntime('planning', 'planning');\n\n const { output } = await this.taskExecutor.runPlans(\n title,\n plans,\n planningModel,\n locateModel,\n { abortSignal: abortSignal ?? currentYamlSignal(this) },\n );\n return output;\n }\n\n async aiTap(\n locatePrompt: TUserPrompt,\n opt?: LocateOption & { fileChooserAccept?: string | string[] },\n ): Promise<void> {\n await this.withReportOperation(async () => {\n assert(locatePrompt, 'missing locate prompt for tap');\n\n const detailedLocateParam = buildDetailedLocateParam(\n locatePrompt,\n this.withContext('aiTap', opt),\n );\n\n const fileChooserAccept = opt?.fileChooserAccept\n ? this.normalizeFileInput(opt.fileChooserAccept)\n : undefined;\n\n await withFileChooser(this.interface, fileChooserAccept, async () => {\n await this.callActionInActionSpace('Tap', {\n locate: detailedLocateParam,\n });\n });\n });\n }\n\n async aiRightClick(\n locatePrompt: TUserPrompt,\n opt?: LocateOption,\n ): Promise<void> {\n assert(locatePrompt, 'missing locate prompt for right click');\n\n const detailedLocateParam = buildDetailedLocateParam(\n locatePrompt,\n this.withContext('aiRightClick', opt),\n );\n\n await this.callActionInActionSpace('RightClick', {\n locate: detailedLocateParam,\n });\n }\n\n async aiDoubleClick(\n locatePrompt: TUserPrompt,\n opt?: LocateOption,\n ): Promise<void> {\n assert(locatePrompt, 'missing locate prompt for double click');\n\n const detailedLocateParam = buildDetailedLocateParam(\n locatePrompt,\n this.withContext('aiDoubleClick', opt),\n );\n\n await this.callActionInActionSpace('DoubleClick', {\n locate: detailedLocateParam,\n });\n }\n\n async aiHover(locatePrompt: TUserPrompt, opt?: LocateOption): Promise<void> {\n assert(locatePrompt, 'missing locate prompt for hover');\n\n const detailedLocateParam = buildDetailedLocateParam(\n locatePrompt,\n this.withContext('aiHover', opt),\n );\n\n await 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: AgentInputOption & { value: string | number },\n ): Promise<void>;\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?: AgentInputOption,\n ): Promise<void>;\n\n // Implementation\n async aiInput(\n locatePromptOrValue: TUserPrompt | string | number,\n locatePromptOrOpt:\n | TUserPrompt\n | (AgentInputOption & { value: string | number })\n | undefined,\n optOrUndefined?: AgentInputOption,\n ) {\n let value: string | number;\n let locatePrompt: TUserPrompt;\n let opt: (AgentInputOption & { value: string | number }) | 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 AgentInputOption & {\n value: string | number;\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 { locateParam, restParams } = buildDetailedLocateParamAndRestParams(\n locatePrompt,\n this.withContext('aiInput', opt),\n );\n\n // Convert value to string to ensure consistency\n const stringValue = typeof value === 'number' ? String(value) : value;\n\n // backward compat: convert deprecated 'append' to 'typeOnly'\n const mode = opt?.mode === 'append' ? 'typeOnly' : opt?.mode;\n\n await this.callActionInActionSpace('Input', {\n ...restParams,\n value: stringValue,\n locate: locateParam,\n mode,\n });\n }\n\n // New signature\n async aiKeyboardPress(\n locatePrompt: TUserPrompt | undefined,\n opt: LocateOption & { keyName: string },\n ): Promise<void>;\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<void>;\n\n // Implementation\n async aiKeyboardPress(\n locatePromptOrKeyName: TUserPrompt | string | undefined,\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 { locateParam, restParams } = buildDetailedLocateParamAndRestParams(\n locatePrompt || '',\n this.withContext('aiKeyboardPress', opt),\n );\n\n await this.callActionInActionSpace('KeyboardPress', {\n ...restParams,\n locate: locateParam,\n });\n }\n\n // New signature\n async aiScroll(\n locatePrompt: TUserPrompt | undefined,\n opt: LocateOption & ScrollParam,\n ): Promise<void>;\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<void>;\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 const isLocatePromptLike = (value: unknown): value is TUserPrompt => {\n if (\n typeof value === 'string' ||\n typeof value === 'undefined' ||\n value === null\n ) {\n return true;\n }\n\n return typeof value === 'object' && value !== null && 'prompt' in value;\n };\n\n // Check if using new signature (first param is locatePrompt, second is options)\n if (\n isLocatePromptLike(locatePromptOrScrollParam) &&\n typeof locatePromptOrOpt === 'object' &&\n locatePromptOrOpt !== null\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 if (opt) {\n const normalizedScrollType = normalizeScrollType(\n (opt as ScrollParam).scrollType,\n );\n\n if (normalizedScrollType !== (opt as ScrollParam).scrollType) {\n (opt as ScrollParam) = {\n ...(opt || {}),\n scrollType: normalizedScrollType as ScrollParam['scrollType'],\n };\n }\n }\n\n const { locateParam, restParams } = buildDetailedLocateParamAndRestParams(\n locatePrompt || '',\n this.withContext('aiScroll', opt),\n );\n\n await this.callActionInActionSpace('Scroll', {\n ...restParams,\n locate: locateParam,\n });\n }\n\n async aiPinch(\n locatePrompt: TUserPrompt | undefined,\n opt: LocateOption & {\n direction: 'in' | 'out';\n distance?: number;\n duration?: number;\n },\n ): Promise<void> {\n const { locateParam, restParams } = buildDetailedLocateParamAndRestParams(\n locatePrompt || '',\n this.withContext('aiPinch', opt),\n );\n\n await this.callActionInActionSpace('Pinch', {\n ...restParams,\n locate: locateParam,\n });\n }\n\n async aiLongPress(\n locatePrompt: TUserPrompt,\n opt?: LocateOption & { duration?: number },\n ): Promise<void> {\n assert(locatePrompt, 'missing locate prompt for long press');\n\n const { locateParam, restParams } = buildDetailedLocateParamAndRestParams(\n locatePrompt,\n this.withContext('aiLongPress', opt),\n );\n\n await this.callActionInActionSpace('LongPress', {\n ...restParams,\n locate: locateParam,\n });\n }\n\n async aiClearInput(\n locatePrompt: TUserPrompt,\n opt?: LocateOption,\n ): Promise<void> {\n assert(locatePrompt, 'missing locate prompt for clear input');\n\n const detailedLocateParam = buildDetailedLocateParam(\n locatePrompt,\n this.withContext('aiClearInput', opt),\n );\n\n await this.callActionInActionSpace('ClearInput', {\n locate: detailedLocateParam,\n });\n }\n\n async aiAct(\n taskPrompt: TUserPrompt,\n opt?: AiActOptions,\n ): Promise<string | undefined> {\n return this.withReportOperation(() => this.executeAiAct(taskPrompt, opt));\n }\n\n private async executeAiAct(\n taskPrompt: TUserPrompt,\n opt?: AiActOptions,\n ): Promise<string | undefined> {\n const internalOptions = opt as AiActInternalOptions | undefined;\n const internalReportDisplay = internalOptions?._internalReportDisplay;\n const taskPromptText =\n typeof taskPrompt === 'string' ? taskPrompt : taskPrompt.prompt;\n const reportPrompt = internalReportDisplay?.prompt || taskPromptText;\n const fileChooserAccept = opt?.fileChooserAccept\n ? this.normalizeFileInput(opt.fileChooserAccept)\n : undefined;\n\n const abortSignal = opt?.abortSignal;\n if (abortSignal?.aborted) {\n throw new Error(\n `aiAct aborted: ${abortSignal.reason || 'signal already aborted'}`,\n );\n }\n\n const runAiAct = async () => {\n const planningModel = this.resolveModelRuntime('planning', 'planning');\n const locateModel = this.resolveModelRuntime('locate', 'locate');\n const aiActContext = this.resolveUserContext('aiAct', opt?.context);\n const cachePrompt = buildPromptWithContext(taskPrompt, aiActContext);\n // Resolve the public planning controls at the API boundary. Internal\n // aiAct plumbing only uses effort from this point onward. The explicit\n // effort option takes precedence over deepThink when both are provided.\n const effort: AiActEffort = (() => {\n const resolvedEffort =\n opt?.effort ?? (opt?.deepThink === true ? 'deepThink' : 'balance');\n\n if (opt?.effort !== undefined && opt.deepThink !== undefined) {\n warn(\n 'When both \"effort\" and \"deepThink\" are provided, \"effort\" takes precedence.',\n );\n }\n\n if (\n resolvedEffort === 'fast' &&\n planningModel.adapter.planning.kind === 'custom'\n ) {\n throw new Error(\n `The \"fast\" aiAct effort is not supported with custom planning adapters (modelFamily: ${planningModel.config.modelFamily ?? 'unknown'}).`,\n );\n }\n\n if (\n resolvedEffort === 'deepThink' &&\n planningModel.adapter.planning.kind === 'custom'\n ) {\n warn(\n `The \"deepThink\" aiAct effort is not supported with custom planning adapters (modelFamily: ${planningModel.config.modelFamily ?? 'unknown'}). It will be ignored.`,\n );\n return 'balance';\n }\n\n return resolvedEffort;\n })();\n\n let deepLocate = opt?.deepLocate;\n if (\n deepLocate &&\n !planningModel.adapter.planning.supportsActionDeepLocate\n ) {\n warn(\n `The \"deepLocate\" option is not supported for aiAct with the current planning adapter (modelFamily: ${planningModel.config.modelFamily ?? 'unknown'}). It will be ignored.`,\n );\n deepLocate = false;\n }\n\n const cacheable = opt?.cacheable;\n const replanningCycleLimit =\n this.resolveReplanningCycleLimit(planningModel);\n const planCacheEnabled = planningModel.adapter.planning.cacheEnabled;\n const matchedCache =\n !planCacheEnabled || cacheable === false\n ? undefined\n : this.taskCache?.matchPlanCache(cachePrompt);\n let cachedYamlFailed = false;\n if (\n matchedCache?.cacheUsable &&\n this.taskCache?.isCacheResultUsed &&\n matchedCache.cacheContent?.yamlWorkflow?.trim()\n ) {\n const yaml = matchedCache.cacheContent.yamlWorkflow;\n try {\n // log into report file\n await this.taskExecutor.loadYamlFlowAsPlanning(\n taskPrompt,\n yaml,\n internalReportDisplay,\n );\n\n debug('matched cache, will call .runYaml to run the action');\n await runInYamlExecutionContext(async () => {\n const replay = enterYamlExecution(this);\n const leaveAction = abortSignal\n ? enterYamlAction(this, abortSignal)\n : undefined;\n try {\n await this.runYaml(yaml);\n } finally {\n leaveAction?.();\n replay.finish();\n }\n });\n return;\n } catch (error) {\n if (\n error instanceof YamlExecutionOwnershipError ||\n isActionReadinessError(error)\n )\n throw error;\n abortSignal?.throwIfAborted();\n cachedYamlFailed = true;\n warn(\n `cached aiAct plan failed, will replan and disable the stale cache: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n }\n\n // If cache matched but is not executable, fall through to normal execution\n const { output: actionOutput } = await this.taskExecutor.action(\n taskPrompt,\n planningModel,\n locateModel,\n aiActContext,\n cacheable,\n replanningCycleLimit,\n effort,\n undefined,\n deepLocate,\n abortSignal,\n internalReportDisplay,\n );\n\n // update cache\n if (this.taskCache && cacheable !== false) {\n const yamlFlow = cachedYamlFailed ? [] : actionOutput?.yamlFlow;\n\n if (!cachedYamlFailed && !yamlFlow?.length) {\n return actionOutput?.output;\n }\n\n const yamlFlowToCache = yamlFlow ?? [];\n const yamlContent: MidsceneYamlScript = {\n tasks: [\n {\n name: reportPrompt,\n flow: yamlFlowToCache,\n },\n ],\n };\n const yamlFlowStr = yaml.dump(yamlContent);\n this.taskCache.updateOrAppendCacheRecord(\n {\n type: 'plan',\n prompt: cachePrompt,\n yamlWorkflow: yamlFlowStr,\n },\n matchedCache,\n );\n }\n\n return actionOutput?.output;\n };\n\n const fileChooserAccepter = this.interface.registerFileChooserListener\n ? new FileChooserAccepter(this.interface)\n : undefined;\n this.activeFileChooserAccepter = fileChooserAccepter;\n this.activeFileChooserAllowedDir = opt?.fileChooserAllowedDir\n ? resolve(opt.fileChooserAllowedDir)\n : undefined;\n let aiActError: { error: unknown } | undefined;\n let fileChooserHandlingError: Error | undefined;\n let result: string | undefined;\n try {\n if (fileChooserAccept?.length) {\n if (!fileChooserAccepter) {\n throw new Error(\n `File upload is not supported on ${this.interface.interfaceType}`,\n );\n }\n await fileChooserAccepter.register(fileChooserAccept);\n }\n result = await runAiAct();\n } catch (error) {\n aiActError = { error };\n } finally {\n this.activeFileChooserAccepter = undefined;\n this.activeFileChooserAllowedDir = undefined;\n try {\n fileChooserHandlingError = await fileChooserAccepter?.clear();\n } catch (error) {\n warn(`Failed to clear file chooser registration: ${error}`);\n }\n }\n\n if (aiActError) {\n throw aiActError.error;\n }\n if (fileChooserHandlingError) {\n throw fileChooserHandlingError;\n }\n return result;\n }\n\n async runMarkdown(\n markdownPath: string,\n opt?: AiActOptions,\n ): Promise<string | undefined> {\n return this.withReportOperation(() =>\n this.executeMarkdown(markdownPath, opt),\n );\n }\n\n private async executeMarkdown(\n markdownPath: string,\n opt?: AiActOptions,\n ): Promise<string | undefined> {\n const markdown = await readFile(markdownPath, 'utf-8');\n const { prompt } = await markdownToAiActPrompt(markdown, markdownPath);\n return this.aiAct(prompt, {\n ...opt,\n _internalReportDisplay: {\n type: 'Markdown',\n prompt: basename(markdownPath),\n },\n } as AiActOptions);\n }\n\n async runGherkinScenario(\n scenarioText: string,\n opt?: RunGherkinScenarioOptions,\n ): Promise<void> {\n return this.withReportOperation(() =>\n runGherkinScenario(this, scenarioText, opt),\n );\n }\n\n /**\n * @deprecated Use {@link Agent.aiAct} instead.\n */\n async aiAction(taskPrompt: TUserPrompt, opt?: AiActOptions) {\n return this.aiAct(taskPrompt, opt);\n }\n\n async aiQuery<ReturnType = any>(\n demand: ServiceExtractParam,\n opt?: QueryOptions,\n ): Promise<ReturnType> {\n return this.createInsight().aiQuery<ReturnType>(demand, opt);\n }\n\n async aiBoolean(prompt: TUserPrompt, opt?: QueryOptions): Promise<boolean> {\n return this.createInsight().aiBoolean(prompt, opt);\n }\n\n async aiNumber(prompt: TUserPrompt, opt?: QueryOptions): Promise<number> {\n return this.createInsight().aiNumber(prompt, opt);\n }\n\n async aiString(prompt: TUserPrompt, opt?: QueryOptions): Promise<string> {\n return this.createInsight().aiString(prompt, opt);\n }\n\n async aiAsk(prompt: TUserPrompt, opt?: QueryOptions): Promise<string> {\n return this.createInsight().aiAsk(prompt, opt);\n }\n\n /**\n * Locate a target in screenshot coordinates. Preserve the model-provided rect\n * when available; otherwise, generate an approximate 8x8 compatibility box.\n * Do not rely on rect for strict element boundaries. Prefer center for the target.\n */\n async aiLocate(prompt: TUserPrompt, opt?: LocateOption) {\n return this.withReportOperation(() => this.executeLocate(prompt, opt));\n }\n\n private async executeLocate(prompt: TUserPrompt, opt?: LocateOption) {\n const locateParam = buildDetailedLocateParam(\n prompt,\n this.withContext('aiLocate', opt),\n );\n assert(locateParam, 'cannot get locate param for aiLocate');\n const locatePlan = locatePlanForLocate(locateParam);\n const plans = [locatePlan];\n const locateModel = this.resolveModelRuntime('locate', 'locate');\n const planningModel = this.resolveModelRuntime('planning', 'planning');\n\n const { output } = await this.taskExecutor.runPlans(\n taskTitleStr('Locate', locateParamStr(locateParam)),\n plans,\n planningModel,\n locateModel,\n opt?.uiContext ? { uiContext: opt.uiContext } : undefined,\n );\n\n const { element } = output;\n\n return {\n rect: element\n ? (element.rect ?? {\n left: Math.max(element.center[0] - 3.5, 0),\n top: Math.max(element.center[1] - 3.5, 0),\n width: 8,\n height: 8,\n })\n : undefined,\n center: element?.center,\n dpr: element?.dpr,\n } as Pick<LocateResultElement, 'center' | 'dpr'> & {\n rect: Rect;\n };\n }\n\n async aiAssert(\n assertion: TUserPrompt,\n msg?: string,\n opt?: AssertOptions,\n ): Promise<AgentAssertResult | undefined> {\n return this.createInsight().aiAssert(assertion, msg, opt);\n }\n\n async aiWaitFor(assertion: TUserPrompt, opt?: AgentWaitForOpt) {\n const modelRuntime = this.resolveModelRuntime('insight', 'boolean');\n const options = this.withContext('aiWaitFor', opt);\n await this.withReportOperation(() =>\n this.taskExecutor.waitFor(\n assertion,\n {\n ...options,\n timeoutMs: options?.timeoutMs || 15 * 1000,\n checkIntervalMs: options?.checkIntervalMs || 3 * 1000,\n },\n modelRuntime,\n ),\n );\n }\n\n async ai(...args: Parameters<typeof this.aiAct>) {\n return this.aiAct(...args);\n }\n\n async runYaml(\n yamlScriptContent: string,\n options?: { abortSignal?: AbortSignal },\n ): Promise<{\n result: Record<string, any>;\n }> {\n return this.withReportOperation(() =>\n this.executeYaml(yamlScriptContent, options),\n );\n }\n\n private async executeYaml(\n yamlScriptContent: string,\n options?: { abortSignal?: AbortSignal },\n ): Promise<{ result: Record<string, any> }> {\n if (this.destroyed)\n throw new Error('Cannot run YAML using a destroyed Agent.');\n const script = parseYamlScript(yamlScriptContent, 'yaml');\n const player = new ScriptPlayer(\n script,\n async () => {\n return { agent: this, freeFn: [] };\n },\n undefined,\n undefined,\n options?.abortSignal,\n );\n await player.run();\n\n if (player.status === 'error') {\n const readinessFailure = player.taskStatusList.find((task) =>\n isActionReadinessError(task.error),\n );\n if (readinessFailure) throw readinessFailure.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.withReportOperation(() =>\n this.interface.evaluateJavaScript!(script),\n );\n }\n\n /**\n * Add a dump update listener\n * @param listener Listener function\n * @returns A remove function that can be called to remove this listener\n */\n addDumpUpdateListener(\n listener: (dump: string, executionDump?: ExecutionDump) => void,\n ): () => void {\n return this.reportManager.addDumpUpdateListener(listener);\n }\n\n /** Remove a dump update listener. */\n removeDumpUpdateListener(\n listener: (dump: string, executionDump?: ExecutionDump) => void,\n ): void {\n this.reportManager.removeDumpUpdateListener(listener);\n }\n\n /** Clear all dump update listeners. */\n clearDumpUpdateListeners(): void {\n this.reportManager.clearDumpUpdateListeners();\n }\n\n /**\n * Subscribe to the generic agent progress bus. The listener receives every\n * progress event regardless of producer; narrow by `event.scope` to handle a\n * specific producer (e.g. `'aiAct'`).\n * @param listener Listener function\n * @returns A remove function that can be called to remove this listener\n */\n addProgressListener(listener: AgentProgressListener): () => void {\n return this.progressBus.subscribe(listener);\n }\n\n /**\n * Remove a progress listener added via {@link addProgressListener}.\n */\n removeProgressListener(listener: AgentProgressListener): void {\n this.progressBus.unsubscribe(listener);\n }\n\n /**\n * Clear all generic progress listeners.\n */\n clearProgressListeners(): void {\n this.progressBus.clear();\n }\n\n private notifyDumpUpdateListeners(executionDump?: ExecutionDump) {\n this.reportManager.notifyDumpUpdateListeners(executionDump);\n }\n\n async destroy() {\n // Early return if already destroyed\n if (this.destroyed) {\n return;\n }\n\n this.destroyed = true;\n\n // A Runner cancellation can finish before a non-cooperative device call.\n // Keep the public owner from disposing the interface until that call has\n // actually settled.\n await waitForResourceIdle(this);\n await this.reportManager.waitForOperations();\n\n // Observers own observation frame files until explicitly disposed.\n for (const observer of this.ownedObservers) {\n try {\n await observer.dispose();\n } catch (error) {\n debug(`error disposing unexported observer during destroy: ${error}`);\n }\n }\n this.ownedObservers.clear();\n this.activeObserver = null;\n\n let interfaceDestroyError: unknown;\n try {\n await this.interface.destroy?.();\n } catch (error) {\n interfaceDestroyError = error;\n }\n\n await this.reportManager.waitForReset();\n // Owned YAML cleanup runs before its record includes cleanup errors. The\n // player publishes that record and its source snapshot before finalizing.\n if (!hasActiveYamlExecution(this)) await this.finalizeReport();\n\n if (interfaceDestroyError) {\n throw interfaceDestroyError;\n }\n }\n\n /**\n * Wait for a finite, positive duration in milliseconds and record it as a\n * Sleep task with the standard UI snapshots. Does not invoke device action\n * hooks or call a model, but standard UI capture requires valid model\n * configuration. Recorded elapsed time includes screenshot overhead.\n * Initial UI capture failure rejects before waiting; a failed final\n * screenshot does not fail an otherwise completed wait.\n */\n async sleep(\n ms: number,\n options?: { abortSignal?: AbortSignal },\n ): Promise<void> {\n options?.abortSignal?.throwIfAborted();\n await this.withReportOperation(() =>\n this.taskExecutor.sleep(ms, options?.abortSignal),\n );\n }\n\n async recordToReport(title?: string, opt?: RecordToReportOptions) {\n return this.withReportOperation(() => this.writeRecordToReport(title, opt));\n }\n\n private async writeRecordToReport(\n title?: string,\n opt?: RecordToReportOptions,\n ) {\n const now = Date.now();\n const screenshots = opt?.screenshots;\n const screenshotBase64 = opt?.screenshotBase64;\n const hasScreenshots = screenshots !== undefined;\n const hasScreenshotBase64 = screenshotBase64 !== undefined;\n if (hasScreenshots && !Array.isArray(screenshots)) {\n throw new Error('recordToReport: screenshots must be an array');\n }\n if (hasScreenshotBase64 && typeof screenshotBase64 !== 'string') {\n throw new Error('recordToReport: screenshotBase64 must be a string');\n }\n if (hasScreenshots && hasScreenshotBase64) {\n throw new Error(\n 'recordToReport: provide only one of screenshots or screenshotBase64',\n );\n }\n if (opt && 'subType' in opt) {\n throw new Error('recordToReport: subType is not supported');\n }\n const customScreenshots = hasScreenshots ? screenshots : undefined;\n if (customScreenshots && customScreenshots.length === 0) {\n throw new Error('recordToReport: screenshots cannot be empty');\n }\n const screenshotInputs: RecordToReportScreenshot[] =\n customScreenshots ??\n (hasScreenshotBase64\n ? [{ base64: screenshotBase64 }]\n : [{ base64: await this.interface.screenshotBase64() }]);\n\n // 1. build recorder\n const recorder: ExecutionRecorderItem[] = screenshotInputs.map(\n (screenshotInput, index) => {\n const normalizedScreenshotInput = normalizeRecordToReportScreenshot(\n screenshotInput,\n index,\n );\n const ts = now + index;\n return {\n type: 'screenshot',\n ts,\n screenshot: ScreenshotItem.create(\n normalizedScreenshotInput.base64,\n ts,\n ),\n description: normalizedScreenshotInput.description,\n };\n },\n );\n // 2. build ExecutionTaskLog\n const task: ExecutionTaskLog = {\n taskId: uuid(),\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 // 3. build ExecutionDump\n const executionDump = new ExecutionDump({\n id: uuid(),\n logTime: now,\n name: `Log - ${title || 'untitled'}`,\n description: opt?.content || '',\n tasks: [task],\n });\n // 4. append to execution dump\n this.appendExecutionDump(executionDump);\n\n this.writeOutActionDumps(executionDump);\n await this.reportManager.flushPendingWrites();\n\n // Call all registered dump update listeners\n this.notifyDumpUpdateListeners(executionDump);\n }\n\n async recordErrorToReport(\n title: string,\n opt: {\n /** Any thrown value; normalized before it is stored in the report. */\n error: unknown;\n content?: string;\n screenshotBase64?: string;\n },\n ) {\n return this.withReportOperation(() => this.writeErrorToReport(title, opt));\n }\n\n private async writeErrorToReport(\n title: string,\n opt: { error: unknown; content?: string; screenshotBase64?: string },\n ) {\n const now = Date.now();\n const error = serializeError(opt.error);\n const recorder: ExecutionRecorderItem[] = [];\n const base64 =\n opt.screenshotBase64 ?? (await this.interface.screenshotBase64());\n if (base64) {\n recorder.push({\n type: 'screenshot',\n ts: now,\n screenshot: ScreenshotItem.create(base64, now),\n });\n }\n\n const task: ExecutionTaskLog = {\n taskId: uuid(),\n type: 'Log',\n subType: 'Error',\n status: 'failed',\n recorder,\n timing: {\n start: now,\n end: now,\n cost: 0,\n },\n param: {\n content: opt.content || '',\n },\n error,\n errorMessage: error.message,\n errorStack: error.stack,\n executor: async () => {},\n };\n\n const executionDump = new ExecutionDump({\n id: uuid(),\n logTime: now,\n name: title,\n description: opt.content || error.message,\n tasks: [task],\n });\n\n this.appendExecutionDump(executionDump);\n this.writeOutActionDumps(executionDump);\n await this.reportManager.flushPendingWrites();\n this.notifyDumpUpdateListeners(executionDump);\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 return {\n groupName,\n groupDescription,\n executions: executions || [],\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 private normalizeFileInput(files: string | string[]): string[] {\n const filesArray = Array.isArray(files) ? files : [files];\n return normalizeFilePaths(filesArray);\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":["debug","getDebug","warn","AgentScopedModelConfigManager","ModelConfigManager","intent","baseManager","createOpenAIClient","Agent","commonAgentTestRunnerNodeDefinitions","value","scopeId","executionIds","record","callback","apiName","callContext","undefined","apiContext","defaultContext","options","resolvedContext","planningModel","globalConfigManager","MIDSCENE_REPLANNING_CYCLE_LIMIT","taskType","runtime","resolveModelForTaskType","usage","enriched","getUIContext","Insight","args","_error","action","maxRetries","attempt","commonContextParser","error","Promise","resolve","setTimeout","opt","assert","observer","UIObserverImpl","uiContextFromObservationRecord","disposeError","prompt","target","context","isAgentAIContextKey","TypeError","String","operation","execution","runner","task","key","dedupKey","INTERNAL_CALL_ID_FIELD","executionDump","param","paramStr","tip","typeStr","name","type","abortSignal","clonedActionParam","Array","actionPlan","plans","Boolean","title","taskTitleStr","locateParamStr","locateModel","output","currentYamlSignal","locatePrompt","detailedLocateParam","buildDetailedLocateParam","fileChooserAccept","withFileChooser","locatePromptOrValue","locatePromptOrOpt","optOrUndefined","optWithValue","locateParam","restParams","buildDetailedLocateParamAndRestParams","stringValue","mode","locatePromptOrKeyName","keyName","locatePromptOrScrollParam","scrollParam","isLocatePromptLike","normalizedScrollType","normalizeScrollType","taskPrompt","internalOptions","internalReportDisplay","taskPromptText","reportPrompt","Error","runAiAct","aiActContext","cachePrompt","buildPromptWithContext","effort","resolvedEffort","deepLocate","cacheable","replanningCycleLimit","planCacheEnabled","matchedCache","cachedYamlFailed","yaml","runInYamlExecutionContext","replay","enterYamlExecution","leaveAction","enterYamlAction","YamlExecutionOwnershipError","isActionReadinessError","actionOutput","yamlFlow","yamlFlowToCache","yamlContent","yamlFlowStr","fileChooserAccepter","FileChooserAccepter","aiActError","fileChooserHandlingError","result","markdownPath","markdown","readFile","markdownToAiActPrompt","basename","scenarioText","runGherkinScenario","demand","locatePlan","locatePlanForLocate","element","Math","assertion","msg","modelRuntime","yamlScriptContent","script","parseYamlScript","player","ScriptPlayer","readinessFailure","errors","listener","waitForResourceIdle","interfaceDestroyError","hasActiveYamlExecution","ms","now","Date","screenshots","screenshotBase64","hasScreenshots","hasScreenshotBase64","customScreenshots","screenshotInputs","recorder","screenshotInput","index","normalizedScreenshotInput","normalizeRecordToReportScreenshot","ts","ScreenshotItem","uuid","ExecutionDump","serializeError","base64","groupName","groupDescription","executions","files","filesArray","normalizeFilePaths","interfaceInstance","opts","MetricsCollector","Set","AgentProgressBus","withAgentDefaults","ActionReadiness","normalizeAgentOptions","globalModelConfigManager","Service","cacheConfigObj","normalizeAgentCacheConfig","TaskCache","baseActionSpace","fileChooserActions","defineActionRegisterFileChooserAccept","defineActionSleep","TaskExecutor","AgentReportManager","hasPendingResourceOperation","Object","observationArtifactAdapterSymbol","observation","UIObservationImpl","createAgent"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent/insight.mjs","sources":["../../../src/agent/insight.ts"],"sourcesContent":["import type { TUserPrompt } from '@/ai-model/index';\nimport type { ModelTask } from '@/ai-model/model-adapter/types';\nimport type { ModelRuntime } from '@/ai-model/models';\nimport type {\n AgentAssertResult,\n AssertOptions,\n InsightAPI,\n QueryOptions,\n ServiceExtractParam,\n UIContext,\n} from '@/types';\nimport type { AiApiName } from '@midscene/shared/agent-tools/agent-context';\nimport { TaskExecutionError, type TaskExecutor } from './tasks';\nimport { parsePrompt } from './utils';\n\nconst defaultQueryOptions: QueryOptions = {\n domIncluded: false,\n screenshotIncluded: true,\n};\n\ntype InsightTaskExecutor = Pick<TaskExecutor, 'createTypeQueryExecution'>;\n\ntype InsightContextOptions = { context?: string };\n\n/** Execute read-only AI operations against either live or fixed UI context. */\nexport class Insight implements InsightAPI {\n constructor(\n private readonly taskExecutor: InsightTaskExecutor,\n private readonly resolveModelRuntime: (task?: ModelTask) => ModelRuntime,\n private readonly resolveAgentContext: (\n apiName: AiApiName,\n callContext?: string,\n ) => string | undefined,\n private readonly getUIContext?: () => UIContext,\n ) {}\n\n private resolveContext(\n apiName: AiApiName,\n options?: InsightContextOptions,\n ): string | undefined {\n return this.resolveAgentContext(apiName, options?.context);\n }\n\n private withContext<T extends InsightContextOptions>(\n apiName: AiApiName,\n options: T,\n ): T {\n const resolvedContext = this.resolveContext(apiName, options);\n if (resolvedContext === undefined) {\n return options;\n }\n\n return {\n ...options,\n context: resolvedContext,\n };\n }\n\n private executionOptions(\n options?: AssertOptions,\n includeAbortSignal = false,\n ): { abortSignal?: AbortSignal; uiContext?: UIContext } | undefined {\n const uiContext = this.getUIContext?.();\n if (!uiContext && !includeAbortSignal && !options?.abortSignal) {\n return undefined;\n }\n return {\n ...(includeAbortSignal || options?.abortSignal\n ? { abortSignal: options?.abortSignal }\n : {}),\n ...(uiContext ? { uiContext } : {}),\n };\n }\n\n async aiQuery<ReturnType = any>(\n demand: ServiceExtractParam,\n options: QueryOptions = defaultQueryOptions,\n ): Promise<ReturnType> {\n const modelRuntime = this.resolveModelRuntime('extract');\n const executionOptions = this.executionOptions();\n const serviceOptions = this.withContext('aiQuery', options);\n const { output } = executionOptions\n ? await this.taskExecutor.createTypeQueryExecution(\n 'Query',\n demand,\n modelRuntime,\n serviceOptions,\n undefined,\n executionOptions,\n )\n : await this.taskExecutor.createTypeQueryExecution(\n 'Query',\n demand,\n modelRuntime,\n serviceOptions,\n );\n return output as ReturnType;\n }\n\n async aiBoolean(\n prompt: TUserPrompt,\n options: QueryOptions = defaultQueryOptions,\n ): Promise<boolean> {\n return this.queryPrimitive('Boolean', 'aiBoolean', prompt, options);\n }\n\n async aiNumber(\n prompt: TUserPrompt,\n options: QueryOptions = defaultQueryOptions,\n ): Promise<number> {\n return this.queryPrimitive('Number', 'aiNumber', prompt, options);\n }\n\n async aiString(\n prompt: TUserPrompt,\n options: QueryOptions = defaultQueryOptions,\n ): Promise<string> {\n return this.queryPrimitive('String', 'aiString', prompt, options);\n }\n\n async aiAsk(\n prompt: TUserPrompt,\n options: QueryOptions = defaultQueryOptions,\n ): Promise<string> {\n return this.queryPrimitive('String', 'aiAsk', prompt, options);\n }\n\n private async queryPrimitive<ReturnType>(\n type: 'Boolean' | 'Number' | 'String',\n apiName: 'aiBoolean' | 'aiNumber' | 'aiString' | 'aiAsk',\n prompt: TUserPrompt,\n options: QueryOptions,\n ): Promise<ReturnType> {\n const { textPrompt, multimodalPrompt } = parsePrompt(prompt);\n const serviceOptions = this.withContext(apiName, options);\n const { output } = await this.taskExecutor.createTypeQueryExecution(\n type,\n textPrompt,\n this.resolveModelRuntime(type === 'Boolean' ? 'boolean' : 'extract'),\n serviceOptions,\n multimodalPrompt,\n this.executionOptions(),\n );\n return output as ReturnType;\n }\n\n async aiAssert(\n assertion: TUserPrompt,\n message?: string,\n options?: AssertOptions,\n ): Promise<AgentAssertResult | undefined> {\n const contextOptions = this.withContext('aiAssert', options ?? {});\n const serviceOptions: QueryOptions = {\n domIncluded: options?.domIncluded ?? defaultQueryOptions.domIncluded,\n screenshotIncluded:\n options?.screenshotIncluded ?? defaultQueryOptions.screenshotIncluded,\n ...(contextOptions.context !== undefined\n ? { context: contextOptions.context }\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 this.resolveModelRuntime('boolean'),\n serviceOptions,\n multimodalPrompt,\n this.executionOptions(options, true),\n );\n\n const pass = Boolean(output);\n const failureMessage = pass\n ? undefined\n : `Assertion failed: ${message || assertionText}\\nReason: ${thought || '(no_reason)'}`;\n\n if (options?.keepRawResponse) {\n return { pass, thought, message: failureMessage };\n }\n if (!pass) {\n throw new Error(failureMessage);\n }\n } catch (error) {\n if (error instanceof TaskExecutionError) {\n const thought = error.task?.thought;\n const diagnosticMessage =\n error.task?.errorMessage || error.cause.message;\n const reason = thought || diagnosticMessage || '(no_reason)';\n const failureMessage = `Assertion failed: ${message || assertionText}\\nReason: ${reason}`;\n\n if (options?.keepRawResponse) {\n return { pass: false, thought, message: failureMessage };\n }\n throw new Error(failureMessage, { cause: error.cause });\n }\n throw error;\n }\n }\n}\n"],"names":["defaultQueryOptions","Insight","apiName","options","resolvedContext","undefined","includeAbortSignal","uiContext","demand","modelRuntime","executionOptions","serviceOptions","output","prompt","type","textPrompt","multimodalPrompt","parsePrompt","assertion","message","contextOptions","assertionText","thought","pass","Boolean","failureMessage","Error","error","TaskExecutionError","diagnosticMessage","reason","taskExecutor","resolveModelRuntime","resolveAgentContext","getUIContext"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"agent/insight.mjs","sources":["../../../src/agent/insight.ts"],"sourcesContent":["import type { TUserPrompt } from '@/ai-model/index';\nimport type { ModelTaskType } from '@/ai-model/model-adapter/types';\nimport type { ModelRuntime } from '@/ai-model/models';\nimport type {\n AgentAssertResult,\n AssertOptions,\n InsightAPI,\n QueryOptions,\n ServiceExtractParam,\n UIContext,\n} from '@/types';\nimport type { AiApiName } from '@midscene/shared/agent-tools/agent-context';\nimport { TaskExecutionError, type TaskExecutor } from './tasks';\nimport { parsePrompt } from './utils';\n\nconst defaultQueryOptions: QueryOptions = {\n domIncluded: false,\n screenshotIncluded: true,\n};\n\ntype InsightTaskExecutor = Pick<TaskExecutor, 'createTypeQueryExecution'>;\n\ntype InsightContextOptions = { context?: string };\n\n/** Execute read-only AI operations against either live or fixed UI context. */\nexport class Insight implements InsightAPI {\n constructor(\n private readonly taskExecutor: InsightTaskExecutor,\n private readonly resolveModelRuntime: (\n taskType: ModelTaskType,\n ) => ModelRuntime,\n private readonly resolveAgentContext: (\n apiName: AiApiName,\n callContext?: string,\n ) => string | undefined,\n private readonly getUIContext?: () => UIContext,\n ) {}\n\n private resolveContext(\n apiName: AiApiName,\n options?: InsightContextOptions,\n ): string | undefined {\n return this.resolveAgentContext(apiName, options?.context);\n }\n\n private withContext<T extends InsightContextOptions>(\n apiName: AiApiName,\n options: T,\n ): T {\n const resolvedContext = this.resolveContext(apiName, options);\n if (resolvedContext === undefined) {\n return options;\n }\n\n return {\n ...options,\n context: resolvedContext,\n };\n }\n\n private executionOptions(\n options?: AssertOptions,\n includeAbortSignal = false,\n ): { abortSignal?: AbortSignal; uiContext?: UIContext } | undefined {\n const uiContext = this.getUIContext?.();\n if (!uiContext && !includeAbortSignal && !options?.abortSignal) {\n return undefined;\n }\n return {\n ...(includeAbortSignal || options?.abortSignal\n ? { abortSignal: options?.abortSignal }\n : {}),\n ...(uiContext ? { uiContext } : {}),\n };\n }\n\n async aiQuery<ReturnType = any>(\n demand: ServiceExtractParam,\n options: QueryOptions = defaultQueryOptions,\n ): Promise<ReturnType> {\n const modelRuntime = this.resolveModelRuntime('extract');\n const executionOptions = this.executionOptions();\n const serviceOptions = this.withContext('aiQuery', options);\n const { output } = executionOptions\n ? await this.taskExecutor.createTypeQueryExecution(\n 'Query',\n demand,\n modelRuntime,\n serviceOptions,\n undefined,\n executionOptions,\n )\n : await this.taskExecutor.createTypeQueryExecution(\n 'Query',\n demand,\n modelRuntime,\n serviceOptions,\n );\n return output as ReturnType;\n }\n\n async aiBoolean(\n prompt: TUserPrompt,\n options: QueryOptions = defaultQueryOptions,\n ): Promise<boolean> {\n return this.queryPrimitive('Boolean', 'aiBoolean', prompt, options);\n }\n\n async aiNumber(\n prompt: TUserPrompt,\n options: QueryOptions = defaultQueryOptions,\n ): Promise<number> {\n return this.queryPrimitive('Number', 'aiNumber', prompt, options);\n }\n\n async aiString(\n prompt: TUserPrompt,\n options: QueryOptions = defaultQueryOptions,\n ): Promise<string> {\n return this.queryPrimitive('String', 'aiString', prompt, options);\n }\n\n async aiAsk(\n prompt: TUserPrompt,\n options: QueryOptions = defaultQueryOptions,\n ): Promise<string> {\n return this.queryPrimitive('String', 'aiAsk', prompt, options);\n }\n\n private async queryPrimitive<ReturnType>(\n type: 'Boolean' | 'Number' | 'String',\n apiName: 'aiBoolean' | 'aiNumber' | 'aiString' | 'aiAsk',\n prompt: TUserPrompt,\n options: QueryOptions,\n ): Promise<ReturnType> {\n const { textPrompt, multimodalPrompt } = parsePrompt(prompt);\n const serviceOptions = this.withContext(apiName, options);\n const { output } = await this.taskExecutor.createTypeQueryExecution(\n type,\n textPrompt,\n this.resolveModelRuntime(type === 'Boolean' ? 'boolean' : 'extract'),\n serviceOptions,\n multimodalPrompt,\n this.executionOptions(),\n );\n return output as ReturnType;\n }\n\n async aiAssert(\n assertion: TUserPrompt,\n message?: string,\n options?: AssertOptions,\n ): Promise<AgentAssertResult | undefined> {\n const contextOptions = this.withContext('aiAssert', options ?? {});\n const serviceOptions: QueryOptions = {\n domIncluded: options?.domIncluded ?? defaultQueryOptions.domIncluded,\n screenshotIncluded:\n options?.screenshotIncluded ?? defaultQueryOptions.screenshotIncluded,\n ...(contextOptions.context !== undefined\n ? { context: contextOptions.context }\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 this.resolveModelRuntime('boolean'),\n serviceOptions,\n multimodalPrompt,\n this.executionOptions(options, true),\n );\n\n const pass = Boolean(output);\n const failureMessage = pass\n ? undefined\n : `Assertion failed: ${message || assertionText}\\nReason: ${thought || '(no_reason)'}`;\n\n if (options?.keepRawResponse) {\n return { pass, thought, message: failureMessage };\n }\n if (!pass) {\n throw new Error(failureMessage);\n }\n } catch (error) {\n if (error instanceof TaskExecutionError) {\n const thought = error.task?.thought;\n const diagnosticMessage =\n error.task?.errorMessage || error.cause.message;\n const reason = thought || diagnosticMessage || '(no_reason)';\n const failureMessage = `Assertion failed: ${message || assertionText}\\nReason: ${reason}`;\n\n if (options?.keepRawResponse) {\n return { pass: false, thought, message: failureMessage };\n }\n throw new Error(failureMessage, { cause: error.cause });\n }\n throw error;\n }\n }\n}\n"],"names":["defaultQueryOptions","Insight","apiName","options","resolvedContext","undefined","includeAbortSignal","uiContext","demand","modelRuntime","executionOptions","serviceOptions","output","prompt","type","textPrompt","multimodalPrompt","parsePrompt","assertion","message","contextOptions","assertionText","thought","pass","Boolean","failureMessage","Error","error","TaskExecutionError","diagnosticMessage","reason","taskExecutor","resolveModelRuntime","resolveAgentContext","getUIContext"],"mappings":"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"}
|