@aiscene/core 8.1.2 → 9.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. package/dist/es/agent/agent.mjs +26 -11
  2. package/dist/es/agent/agent.mjs.map +1 -1
  3. package/dist/es/agent/task-builder.mjs +4 -2
  4. package/dist/es/agent/task-builder.mjs.map +1 -1
  5. package/dist/es/agent/tasks.mjs +26 -14
  6. package/dist/es/agent/tasks.mjs.map +1 -1
  7. package/dist/es/agent/ui-utils.mjs +13 -1
  8. package/dist/es/agent/ui-utils.mjs.map +1 -1
  9. package/dist/es/agent/usage-intent.mjs +18 -0
  10. package/dist/es/agent/usage-intent.mjs.map +1 -0
  11. package/dist/es/agent/utils.mjs +9 -26
  12. package/dist/es/agent/utils.mjs.map +1 -1
  13. package/dist/es/ai-model/auto-glm/planning.mjs.map +1 -1
  14. package/dist/es/ai-model/inspect.mjs +2 -4
  15. package/dist/es/ai-model/inspect.mjs.map +1 -1
  16. package/dist/es/ai-model/llm-planning.mjs +1 -3
  17. package/dist/es/ai-model/llm-planning.mjs.map +1 -1
  18. package/dist/es/ai-model/prompt/extraction.mjs +0 -2
  19. package/dist/es/ai-model/prompt/extraction.mjs.map +1 -1
  20. package/dist/es/ai-model/prompt/llm-planning.mjs +18 -0
  21. package/dist/es/ai-model/prompt/llm-planning.mjs.map +1 -1
  22. package/dist/es/ai-model/prompt/playwright-generator.mjs +4 -4
  23. package/dist/es/ai-model/prompt/playwright-generator.mjs.map +1 -1
  24. package/dist/es/ai-model/service-caller/codex-app-server.mjs +12 -12
  25. package/dist/es/ai-model/service-caller/codex-app-server.mjs.map +1 -1
  26. package/dist/es/ai-model/service-caller/index.mjs +148 -118
  27. package/dist/es/ai-model/service-caller/index.mjs.map +1 -1
  28. package/dist/es/ai-model/service-caller/request-timeout.mjs +49 -0
  29. package/dist/es/ai-model/service-caller/request-timeout.mjs.map +1 -0
  30. package/dist/es/ai-model/ui-tars-planning.mjs.map +1 -1
  31. package/dist/es/common.mjs +16 -3
  32. package/dist/es/common.mjs.map +1 -1
  33. package/dist/es/device/index.mjs +171 -30
  34. package/dist/es/device/index.mjs.map +1 -1
  35. package/dist/es/dump/screenshot-store.mjs +7 -6
  36. package/dist/es/dump/screenshot-store.mjs.map +1 -1
  37. package/dist/es/index.mjs +2 -2
  38. package/dist/es/index.mjs.map +1 -1
  39. package/dist/es/report-generator.mjs +25 -25
  40. package/dist/es/report-generator.mjs.map +1 -1
  41. package/dist/es/report.mjs +20 -1
  42. package/dist/es/report.mjs.map +1 -1
  43. package/dist/es/skill/index.mjs +3 -4
  44. package/dist/es/skill/index.mjs.map +1 -1
  45. package/dist/es/types.mjs +20 -1
  46. package/dist/es/types.mjs.map +1 -1
  47. package/dist/es/utils.mjs +2 -2
  48. package/dist/es/yaml/player.mjs +2 -17
  49. package/dist/es/yaml/player.mjs.map +1 -1
  50. package/dist/lib/agent/agent.js +26 -11
  51. package/dist/lib/agent/agent.js.map +1 -1
  52. package/dist/lib/agent/task-builder.js +4 -2
  53. package/dist/lib/agent/task-builder.js.map +1 -1
  54. package/dist/lib/agent/tasks.js +25 -13
  55. package/dist/lib/agent/tasks.js.map +1 -1
  56. package/dist/lib/agent/ui-utils.js +13 -1
  57. package/dist/lib/agent/ui-utils.js.map +1 -1
  58. package/dist/lib/agent/usage-intent.js +52 -0
  59. package/dist/lib/agent/usage-intent.js.map +1 -0
  60. package/dist/lib/agent/utils.js +9 -26
  61. package/dist/lib/agent/utils.js.map +1 -1
  62. package/dist/lib/ai-model/auto-glm/planning.js.map +1 -1
  63. package/dist/lib/ai-model/inspect.js +2 -4
  64. package/dist/lib/ai-model/inspect.js.map +1 -1
  65. package/dist/lib/ai-model/llm-planning.js +1 -3
  66. package/dist/lib/ai-model/llm-planning.js.map +1 -1
  67. package/dist/lib/ai-model/prompt/extraction.js +0 -2
  68. package/dist/lib/ai-model/prompt/extraction.js.map +1 -1
  69. package/dist/lib/ai-model/prompt/llm-planning.js +18 -0
  70. package/dist/lib/ai-model/prompt/llm-planning.js.map +1 -1
  71. package/dist/lib/ai-model/prompt/playwright-generator.js +4 -4
  72. package/dist/lib/ai-model/prompt/playwright-generator.js.map +1 -1
  73. package/dist/lib/ai-model/service-caller/codex-app-server.js +12 -12
  74. package/dist/lib/ai-model/service-caller/codex-app-server.js.map +1 -1
  75. package/dist/lib/ai-model/service-caller/index.js +148 -118
  76. package/dist/lib/ai-model/service-caller/index.js.map +1 -1
  77. package/dist/lib/ai-model/service-caller/request-timeout.js +95 -0
  78. package/dist/lib/ai-model/service-caller/request-timeout.js.map +1 -0
  79. package/dist/lib/ai-model/ui-tars-planning.js.map +1 -1
  80. package/dist/lib/common.js +16 -3
  81. package/dist/lib/common.js.map +1 -1
  82. package/dist/lib/device/index.js +176 -29
  83. package/dist/lib/device/index.js.map +1 -1
  84. package/dist/lib/dump/screenshot-store.js +6 -5
  85. package/dist/lib/dump/screenshot-store.js.map +1 -1
  86. package/dist/lib/index.js +7 -1
  87. package/dist/lib/index.js.map +1 -1
  88. package/dist/lib/report-generator.js +23 -23
  89. package/dist/lib/report-generator.js.map +1 -1
  90. package/dist/lib/report.js +19 -0
  91. package/dist/lib/report.js.map +1 -1
  92. package/dist/lib/skill/index.js +3 -4
  93. package/dist/lib/skill/index.js.map +1 -1
  94. package/dist/lib/types.js +33 -6
  95. package/dist/lib/types.js.map +1 -1
  96. package/dist/lib/utils.js +2 -2
  97. package/dist/lib/yaml/player.js +2 -17
  98. package/dist/lib/yaml/player.js.map +1 -1
  99. package/dist/types/agent/agent.d.ts +4 -0
  100. package/dist/types/agent/tasks.d.ts +8 -7
  101. package/dist/types/agent/usage-intent.d.ts +3 -0
  102. package/dist/types/ai-model/llm-planning.d.ts +2 -2
  103. package/dist/types/ai-model/service-caller/codex-app-server.d.ts +5 -5
  104. package/dist/types/ai-model/service-caller/index.d.ts +1 -4
  105. package/dist/types/ai-model/service-caller/request-timeout.d.ts +32 -0
  106. package/dist/types/device/device-options.d.ts +11 -1
  107. package/dist/types/device/index.d.ts +195 -24
  108. package/dist/types/dump/screenshot-store.d.ts +2 -2
  109. package/dist/types/index.d.ts +1 -2
  110. package/dist/types/report-generator.d.ts +7 -0
  111. package/dist/types/types.d.ts +50 -4
  112. package/package.json +2 -2
@@ -220,7 +220,7 @@ class ScriptPlayer {
220
220
  } else if ('aiScroll' in flowItem) {
221
221
  const { aiScroll, ...scrollTask } = flowItem;
222
222
  const { locate, ...scrollOptions } = scrollTask;
223
- const locatePrompt = locate ?? aiScroll;
223
+ const locatePrompt = locate ?? aiScroll ?? void 0;
224
224
  await agent.aiScroll(locatePrompt, scrollOptions);
225
225
  } else if ('aiTap' in flowItem) {
226
226
  const { aiTap, prompt, locate, ...tapOptions } = flowItem;
@@ -261,22 +261,7 @@ class ScriptPlayer {
261
261
  const schemaIsStringParam = isStringParamSchema(matchedAction.paramSchema);
262
262
  let stringParamToCall;
263
263
  const specialActionParamToCall = 'string' == typeof actionParamForMatchedAction ? buildShortcutActionParam(matchedAction.name, matchedAction.interfaceAlias, actionParamForMatchedAction) : void 0;
264
- if ('string' == typeof actionParamForMatchedAction && ('Launch' === matchedAction.name || 'launch' === matchedAction.interfaceAlias) && 'function' == typeof agent.launch) {
265
- debug(`Calling agent.launch with: ${actionParamForMatchedAction}`);
266
- const result = await agent.launch(actionParamForMatchedAction);
267
- const resultName = flowItem.name;
268
- if (void 0 !== result) this.setResult(resultName, result);
269
- } else if ('string' == typeof actionParamForMatchedAction && ('Terminate' === matchedAction.name || 'terminate' === matchedAction.interfaceAlias) && 'function' == typeof agent.terminate) {
270
- debug(`Calling agent.terminate with: ${actionParamForMatchedAction}`);
271
- const result = await agent.terminate(actionParamForMatchedAction);
272
- const resultName = flowItem.name;
273
- if (void 0 !== result) this.setResult(resultName, result);
274
- } else if ('string' == typeof actionParamForMatchedAction && ('RunAdbShell' === matchedAction.name || 'runAdbShell' === matchedAction.interfaceAlias) && 'function' == typeof agent.runAdbShell) {
275
- debug(`Calling agent.runAdbShell with: ${actionParamForMatchedAction}`);
276
- const result = await agent.runAdbShell(actionParamForMatchedAction);
277
- const resultName = flowItem.name;
278
- if (void 0 !== result) this.setResult(resultName, result);
279
- } else if (specialActionParamToCall) {
264
+ if (specialActionParamToCall) {
280
265
  debug(`matchedAction: ${matchedAction.name}`, `flowParams: ${JSON.stringify(specialActionParamToCall)}`);
281
266
  const result = await agent.callActionInActionSpace(matchedAction.name, specialActionParamToCall);
282
267
  const resultName = flowItem.name;
@@ -1 +1 @@
1
- {"version":3,"file":"yaml/player.mjs","sources":["../../../src/yaml/player.ts"],"sourcesContent":["import { existsSync, mkdirSync, writeFileSync } from 'node:fs';\nimport { basename, dirname, join, resolve } from 'node:path';\nimport { assert, ifInBrowser, ifInWorker } from '@aiscene/shared/utils';\nimport { type ZodTypeAny, z } from 'zod';\n\n// previous defined yaml flow, as a helper\ninterface MidsceneYamlFlowItemAIInput extends LocateOption {\n // previous version\n // aiInput: string; // value to input\n // locate: TUserPrompt; // where to input\n aiInput: TUserPrompt | undefined; // where to input\n value: string | number; // value to input\n}\n\ninterface MidsceneYamlFlowItemAIKeyboardPress extends LocateOption {\n // previous version\n // aiKeyboardPress: string;\n // locate?: TUserPrompt; // where to press, optional\n aiKeyboardPress: TUserPrompt | undefined; // where to press\n keyName: string; // key to press\n}\n\ninterface MidsceneYamlFlowItemAIScroll extends LocateOption, ScrollParam {\n // previous version\n // aiScroll: null;\n // locate?: TUserPrompt; // which area to scroll, optional\n aiScroll: TUserPrompt | undefined; // which area to scroll\n}\n\nimport type { Agent } from '@/agent/agent';\nimport type { TUserPrompt } from '@/common';\nimport type {\n DeviceAction,\n FreeFn,\n LocateOption,\n MidsceneYamlFlowItemAIAction,\n MidsceneYamlFlowItemAIAssert,\n MidsceneYamlFlowItemAIWaitFor,\n MidsceneYamlFlowItemEvaluateJavaScript,\n MidsceneYamlFlowItemLogScreenshot,\n MidsceneYamlFlowItemSleep,\n MidsceneYamlScript,\n MidsceneYamlScriptEnv,\n ScriptPlayerStatusValue,\n ScriptPlayerTaskStatus,\n ScrollParam,\n} from '@/types';\nimport { getMidsceneRunSubDir } from '@aiscene/shared/common';\nimport { getDebug } from '@aiscene/shared/logger';\nimport {\n buildDetailedLocateParam,\n buildDetailedLocateParamAndRestParams,\n} from './utils';\n\nconst debug = getDebug('yaml-player');\nconst aiTaskHandlerMap = {\n aiQuery: 'aiQuery',\n aiNumber: 'aiNumber',\n aiString: 'aiString',\n aiBoolean: 'aiBoolean',\n aiAsk: 'aiAsk',\n aiLocate: 'aiLocate',\n} as const;\n\ntype AISimpleTaskKey = keyof typeof aiTaskHandlerMap;\n\nconst isStringParamSchema = (schema?: ZodTypeAny): boolean => {\n if (!schema) {\n return false;\n }\n\n const schemaDef = (schema as any)?._def;\n if (!schemaDef?.typeName) {\n return false;\n }\n\n switch (schemaDef.typeName) {\n case z.ZodFirstPartyTypeKind.ZodString:\n case z.ZodFirstPartyTypeKind.ZodEnum:\n case z.ZodFirstPartyTypeKind.ZodNativeEnum:\n return true;\n case z.ZodFirstPartyTypeKind.ZodLiteral:\n return typeof schemaDef.value === 'string';\n case z.ZodFirstPartyTypeKind.ZodOptional:\n case z.ZodFirstPartyTypeKind.ZodNullable:\n case z.ZodFirstPartyTypeKind.ZodDefault:\n return isStringParamSchema(schemaDef.innerType);\n case z.ZodFirstPartyTypeKind.ZodEffects:\n return isStringParamSchema(schemaDef.schema);\n case z.ZodFirstPartyTypeKind.ZodPipeline:\n return isStringParamSchema(schemaDef.out);\n case z.ZodFirstPartyTypeKind.ZodUnion: {\n const options = schemaDef.options as ZodTypeAny[] | undefined;\n return Array.isArray(options)\n ? options.every((option) => isStringParamSchema(option))\n : false;\n }\n default:\n return false;\n }\n};\n\nconst buildShortcutActionParam = (\n actionName: string,\n interfaceAlias: string | undefined,\n value: string,\n) => {\n if (actionName === 'Launch' || interfaceAlias === 'launch') {\n return { uri: value };\n }\n\n if (actionName === 'Terminate' || interfaceAlias === 'terminate') {\n return { uri: value };\n }\n\n if (actionName === 'RunAdbShell' || interfaceAlias === 'runAdbShell') {\n return { command: value };\n }\n\n return undefined;\n};\nexport class ScriptPlayer<T extends MidsceneYamlScriptEnv> {\n public currentTaskIndex?: number;\n public taskStatusList: ScriptPlayerTaskStatus[] = [];\n public status: ScriptPlayerStatusValue = 'init';\n public reportFile?: string | null;\n public result: Record<string, any>;\n private unnamedResultIndex = 0;\n public output?: string | null;\n public unstableLogContent?: string | null;\n public errorInSetup?: Error;\n private interfaceAgent: Agent | null = null;\n public agentStatusTip?: string;\n public target?: MidsceneYamlScriptEnv;\n private actionSpace: DeviceAction[] = [];\n private scriptPath?: string;\n constructor(\n private script: MidsceneYamlScript,\n private setupAgent: (platform: T) => Promise<{\n agent: Agent;\n freeFn: FreeFn[];\n }>,\n public onTaskStatusChange?: (taskStatus: ScriptPlayerTaskStatus) => void,\n scriptPath?: string,\n ) {\n this.scriptPath = scriptPath;\n this.result = {};\n const resolvedAiActContext =\n script.agent?.aiActContext ?? script.agent?.aiActionContext;\n\n if (resolvedAiActContext !== undefined && script.agent) {\n if (\n script.agent.aiActContext === undefined &&\n script.agent.aiActionContext !== undefined\n ) {\n console.warn(\n 'agent.aiActionContext is deprecated, please use agent.aiActContext instead. The legacy name is still accepted for backward compatibility.',\n );\n }\n\n script.agent.aiActContext = resolvedAiActContext;\n }\n\n this.target =\n script.target ||\n script.web ||\n script.android ||\n script.ios ||\n script.computer ||\n script.config;\n\n if (ifInBrowser || ifInWorker) {\n this.output = undefined;\n debug('output is undefined in browser or worker');\n } else if (this.target?.output) {\n this.output = resolve(process.cwd(), this.target.output);\n debug('setting output by config.output', this.output);\n } else {\n const scriptName = this.scriptPath\n ? basename(this.scriptPath, '.yaml').replace(/\\.(ya?ml)$/i, '')\n : 'script';\n this.output = join(\n getMidsceneRunSubDir('output'),\n `${scriptName}-${Date.now()}.json`,\n );\n debug('setting output by script path', this.output);\n }\n\n if (ifInBrowser || ifInWorker) {\n this.unstableLogContent = undefined;\n } else if (typeof this.target?.unstableLogContent === 'string') {\n this.unstableLogContent = resolve(\n process.cwd(),\n this.target.unstableLogContent,\n );\n } else if (this.target?.unstableLogContent === true) {\n this.unstableLogContent = join(\n getMidsceneRunSubDir('output'),\n 'unstableLogContent.json',\n );\n }\n\n this.taskStatusList = (script.tasks || []).map((task, taskIndex) => ({\n ...task,\n index: taskIndex,\n status: 'init',\n totalSteps: task.flow?.length || 0,\n }));\n }\n\n private setResult(key: string | undefined, value: any) {\n const keyToUse = key || this.unnamedResultIndex++;\n if (this.result[keyToUse]) {\n console.warn(`result key ${keyToUse} already exists, will overwrite`);\n }\n this.result[keyToUse] = value;\n\n return this.flushResult();\n }\n\n private setPlayerStatus(status: ScriptPlayerStatusValue, error?: Error) {\n this.status = status;\n this.errorInSetup = error;\n }\n\n private notifyCurrentTaskStatusChange(taskIndex?: number) {\n const taskIndexToNotify =\n typeof taskIndex === 'number' ? taskIndex : this.currentTaskIndex;\n\n if (typeof taskIndexToNotify !== 'number') {\n return;\n }\n\n const taskStatus = this.taskStatusList[taskIndexToNotify];\n if (this.onTaskStatusChange) {\n this.onTaskStatusChange(taskStatus);\n }\n }\n\n private async setTaskStatus(\n index: number,\n statusValue: ScriptPlayerStatusValue,\n error?: Error,\n ) {\n this.taskStatusList[index].status = statusValue;\n if (error) {\n this.taskStatusList[index].error = error;\n }\n\n this.notifyCurrentTaskStatusChange(index);\n }\n\n private setTaskIndex(taskIndex: number) {\n this.currentTaskIndex = taskIndex;\n }\n\n private flushResult() {\n if (this.output) {\n const output = resolve(process.cwd(), this.output);\n const outputDir = dirname(output);\n if (!existsSync(outputDir)) {\n mkdirSync(outputDir, { recursive: true });\n }\n writeFileSync(output, JSON.stringify(this.result || {}, undefined, 2));\n }\n }\n\n private flushUnstableLogContent() {\n if (this.unstableLogContent) {\n const content = this.interfaceAgent?._unstableLogContent();\n const filePath = resolve(process.cwd(), this.unstableLogContent);\n const outputDir = dirname(filePath);\n if (!existsSync(outputDir)) {\n mkdirSync(outputDir, { recursive: true });\n }\n writeFileSync(filePath, JSON.stringify(content, null, 2));\n }\n }\n\n async playTask(taskStatus: ScriptPlayerTaskStatus, agent: Agent) {\n const { flow } = taskStatus;\n assert(flow, 'missing flow in task');\n\n for (const flowItemIndex in flow) {\n const currentStep = Number.parseInt(flowItemIndex, 10);\n taskStatus.currentStep = currentStep;\n const flowItem = flow[flowItemIndex];\n\n // Skip Finalize action from cache - it's a planning-only marker\n if ('Finalize' in flowItem) {\n continue;\n }\n\n debug(\n `playing step ${flowItemIndex}, flowItem=${JSON.stringify(flowItem)}`,\n );\n const simpleAIKey = (\n Object.keys(aiTaskHandlerMap) as AISimpleTaskKey[]\n ).find((key) => Object.prototype.hasOwnProperty.call(flowItem, key));\n if (\n 'aiAct' in (flowItem as MidsceneYamlFlowItemAIAction) ||\n 'aiAction' in (flowItem as MidsceneYamlFlowItemAIAction) ||\n 'ai' in (flowItem as MidsceneYamlFlowItemAIAction)\n ) {\n const actionTask = flowItem as MidsceneYamlFlowItemAIAction;\n const { aiAct, aiAction, ai, ...actionOptions } = actionTask;\n const prompt = aiAct || aiAction || ai;\n assert(prompt, 'missing prompt for ai (aiAct)');\n await agent.aiAct(prompt, actionOptions);\n } else if ('aiAssert' in (flowItem as MidsceneYamlFlowItemAIAssert)) {\n const assertTask = flowItem as MidsceneYamlFlowItemAIAssert;\n const {\n aiAssert: prompt,\n errorMessage: msg,\n name,\n ...restOpts\n } = assertTask;\n assert(prompt, 'missing prompt for aiAssert');\n const { pass, thought, message } =\n (await agent.aiAssert(prompt, msg, {\n ...restOpts,\n keepRawResponse: true,\n })) || {};\n\n this.setResult(name, {\n pass,\n thought,\n message,\n });\n\n if (!pass) {\n throw new Error(message);\n }\n } else if (simpleAIKey) {\n const {\n [simpleAIKey]: prompt,\n name,\n ...options\n } = flowItem as Record<string, any>;\n assert(prompt, `missing prompt for ${simpleAIKey}`);\n const agentMethod = (agent as any)[aiTaskHandlerMap[simpleAIKey]];\n assert(\n typeof agentMethod === 'function',\n `missing agent method for ${simpleAIKey}`,\n );\n const aiResult = await agentMethod.call(agent, prompt, options);\n this.setResult(name, aiResult);\n } else if ('aiWaitFor' in (flowItem as MidsceneYamlFlowItemAIWaitFor)) {\n const waitForTask = flowItem as MidsceneYamlFlowItemAIWaitFor;\n const { aiWaitFor, timeout, ...restWaitForOpts } = waitForTask;\n const prompt = aiWaitFor;\n assert(prompt, 'missing prompt for aiWaitFor');\n const waitForOptions = {\n ...restWaitForOpts,\n ...(timeout !== undefined ? { timeout, timeoutMs: timeout } : {}),\n };\n await agent.aiWaitFor(prompt, waitForOptions);\n } else if ('sleep' in (flowItem as MidsceneYamlFlowItemSleep)) {\n const sleepTask = flowItem as MidsceneYamlFlowItemSleep;\n const ms = sleepTask.sleep;\n let msNumber = ms;\n if (typeof ms === 'string') {\n msNumber = Number.parseInt(ms, 10);\n }\n assert(\n msNumber && msNumber > 0,\n `ms for sleep must be greater than 0, but got ${ms}`,\n );\n await new Promise((resolve) => setTimeout(resolve, msNumber));\n } else if (\n 'javascript' in (flowItem as MidsceneYamlFlowItemEvaluateJavaScript)\n ) {\n const evaluateJavaScriptTask =\n flowItem as MidsceneYamlFlowItemEvaluateJavaScript;\n\n const result = await agent.evaluateJavaScript(\n evaluateJavaScriptTask.javascript,\n );\n this.setResult(evaluateJavaScriptTask.name, result);\n } else if (\n 'logScreenshot' in (flowItem as MidsceneYamlFlowItemLogScreenshot) ||\n 'recordToReport' in (flowItem as MidsceneYamlFlowItemLogScreenshot)\n ) {\n const recordTask = flowItem as MidsceneYamlFlowItemLogScreenshot;\n const title =\n recordTask.recordToReport ?? recordTask.logScreenshot ?? 'untitled';\n const content = recordTask.content || '';\n await agent.recordToReport(title, { content });\n } else if ('aiInput' in (flowItem as MidsceneYamlFlowItemAIInput)) {\n // may be input empty string ''\n const {\n aiInput,\n value: rawValue,\n ...inputTask\n } = flowItem as MidsceneYamlFlowItemAIInput;\n\n // Compatibility with previous version:\n // Old format: { aiInput: string (value), locate: TUserPrompt }\n // New format - 1: { aiInput: TUserPrompt, value: string | number }\n // New format - 2: { aiInput: undefined, locate: TUserPrompt, value: string | number }\n let locatePrompt: TUserPrompt | undefined;\n let value: string | number | undefined;\n if ((inputTask as any).locate) {\n // Old format - aiInput is the value, locate is the prompt\n // Keep backward compatibility: empty string is treated as no value\n value = (aiInput as string | number) || rawValue;\n locatePrompt = (inputTask as any).locate;\n } else {\n // New format - aiInput is the prompt, value is the value\n locatePrompt = aiInput || '';\n value = rawValue;\n }\n\n // Convert value to string for Input action\n await agent.callActionInActionSpace('Input', {\n ...inputTask,\n ...(value !== undefined ? { value: String(value) } : {}),\n ...(locatePrompt\n ? { locate: buildDetailedLocateParam(locatePrompt, inputTask) }\n : {}),\n });\n } else if (\n 'aiKeyboardPress' in (flowItem as MidsceneYamlFlowItemAIKeyboardPress)\n ) {\n const { aiKeyboardPress, ...keyboardPressTask } =\n flowItem as MidsceneYamlFlowItemAIKeyboardPress;\n\n // Compatibility with previous version:\n // Old format: { aiKeyboardPress: string (key), locate?: TUserPrompt }\n // New format - 1: { aiKeyboardPress: TUserPrompt, keyName: string }\n // New format - 2: { aiKeyboardPress: , locate?: TUserPrompt, keyName: string }\n let locatePrompt: TUserPrompt | undefined;\n let keyName: string | undefined;\n if ((keyboardPressTask as any).locate) {\n // Old format - aiKeyboardPress is the key, locate is the prompt\n keyName = aiKeyboardPress as string;\n locatePrompt = (keyboardPressTask as any).locate;\n } else if (keyboardPressTask.keyName) {\n // New format - aiKeyboardPress is the prompt, key is the key\n keyName = keyboardPressTask.keyName;\n locatePrompt = aiKeyboardPress;\n } else {\n keyName = aiKeyboardPress as string;\n }\n\n await agent.callActionInActionSpace('KeyboardPress', {\n ...keyboardPressTask,\n ...(keyName ? { keyName } : {}),\n ...(locatePrompt\n ? {\n locate: buildDetailedLocateParam(\n locatePrompt,\n keyboardPressTask,\n ),\n }\n : {}),\n });\n } else if ('aiScroll' in (flowItem as MidsceneYamlFlowItemAIScroll)) {\n const { aiScroll, ...scrollTask } =\n flowItem as MidsceneYamlFlowItemAIScroll;\n\n // Compatibility with previous version:\n // Old format: { aiScroll: null, locate?: TUserPrompt, direction, scrollType, distance? }\n // New format - 1: { aiScroll: TUserPrompt, direction, scrollType, distance? }\n // New format - 2: { aiScroll: undefined, locate: TUserPrompt, direction, scrollType, distance? }\n const { locate, ...scrollOptions } = scrollTask as any;\n const locatePrompt: TUserPrompt | undefined = locate ?? aiScroll;\n\n await agent.aiScroll(locatePrompt, scrollOptions);\n } else if ('aiTap' in flowItem) {\n const { aiTap, prompt, locate, ...tapOptions } = flowItem as any;\n\n let locatePrompt: TUserPrompt;\n let opts = tapOptions;\n // Support both formats:\n // 1. { aiTap: null, locate: { prompt, images, ... } } (locate as sibling key)\n // 2. { aiTap: { locate: { prompt, images, ... } } } (locate nested in aiTap)\n const locateObj =\n locate ??\n (typeof aiTap === 'object' && aiTap !== null\n ? aiTap.locate\n : undefined);\n\n if (typeof aiTap === 'string' && aiTap) {\n // User YAML: aiTap: 'search input box'\n locatePrompt = aiTap;\n } else if (typeof locateObj === 'object' && locateObj?.prompt) {\n // buildYamlFlowFromPlans: { aiTap: '', locate: { prompt, deepLocate, cacheable } }\n const { prompt: lp, ...locateOpts } = locateObj;\n locatePrompt = lp;\n opts = { ...locateOpts, ...tapOptions };\n } else {\n // User YAML: aiTap: { prompt: '...' } or aiTap: null + prompt: '...'\n locatePrompt = aiTap?.prompt || prompt || locateObj;\n }\n\n assert(locatePrompt, 'missing prompt for aiTap');\n await agent.aiTap(locatePrompt, opts);\n } else {\n // generic action, find the action in actionSpace\n\n /* for aiRightClick, the parameters are a flattened data for the 'locate', these are all valid data\n\n - aiRightClick: 'search input box'\n - aiRightClick: 'search input box'\n deepLocate: true\n cacheable: false\n - aiRightClick:\n prompt: 'search input box'\n - aiRightClick:\n prompt: 'search input box'\n deepLocate: true\n cacheable: false\n */\n\n const actionSpace = this.actionSpace;\n let locatePromptShortcut: string | undefined;\n let actionParamForMatchedAction: unknown;\n const matchedAction = actionSpace.find((action) => {\n const actionInterfaceAlias = action.interfaceAlias;\n if (\n actionInterfaceAlias &&\n Object.prototype.hasOwnProperty.call(flowItem, actionInterfaceAlias)\n ) {\n actionParamForMatchedAction =\n flowItem[actionInterfaceAlias as keyof typeof flowItem];\n if (typeof actionParamForMatchedAction === 'string') {\n locatePromptShortcut = actionParamForMatchedAction;\n }\n return true;\n }\n\n const keyOfActionInActionSpace = action.name;\n if (\n Object.prototype.hasOwnProperty.call(\n flowItem,\n keyOfActionInActionSpace,\n )\n ) {\n actionParamForMatchedAction =\n flowItem[keyOfActionInActionSpace as keyof typeof flowItem];\n if (typeof actionParamForMatchedAction === 'string') {\n locatePromptShortcut = actionParamForMatchedAction;\n }\n return true;\n }\n\n return false;\n });\n\n assert(\n matchedAction,\n `unknown flowItem in yaml: ${JSON.stringify(flowItem)}`,\n );\n\n const schemaIsStringParam = isStringParamSchema(\n matchedAction.paramSchema,\n );\n let stringParamToCall: string | undefined;\n const specialActionParamToCall =\n typeof actionParamForMatchedAction === 'string'\n ? buildShortcutActionParam(\n matchedAction.name,\n matchedAction.interfaceAlias,\n actionParamForMatchedAction,\n )\n : undefined;\n if (\n typeof actionParamForMatchedAction === 'string' &&\n (matchedAction.name === 'Launch' ||\n matchedAction.interfaceAlias === 'launch') &&\n typeof (agent as any).launch === 'function'\n ) {\n // Call agent.launch directly for Launch action with string param\n debug(`Calling agent.launch with: ${actionParamForMatchedAction}`);\n const result = await (agent as any).launch(\n actionParamForMatchedAction,\n );\n\n const resultName = (flowItem as any).name;\n if (result !== undefined) {\n this.setResult(resultName, result);\n }\n } else if (\n typeof actionParamForMatchedAction === 'string' &&\n (matchedAction.name === 'Terminate' ||\n matchedAction.interfaceAlias === 'terminate') &&\n typeof (agent as any).terminate === 'function'\n ) {\n // Call agent.terminate directly for Terminate action with string param\n debug(`Calling agent.terminate with: ${actionParamForMatchedAction}`);\n const result = await (agent as any).terminate(\n actionParamForMatchedAction,\n );\n\n const resultName = (flowItem as any).name;\n if (result !== undefined) {\n this.setResult(resultName, result);\n }\n } else if (\n typeof actionParamForMatchedAction === 'string' &&\n (matchedAction.name === 'RunAdbShell' ||\n matchedAction.interfaceAlias === 'runAdbShell') &&\n typeof (agent as any).runAdbShell === 'function'\n ) {\n // Call agent.runAdbShell directly for RunAdbShell action with string param\n debug(\n `Calling agent.runAdbShell with: ${actionParamForMatchedAction}`,\n );\n const result = await (agent as any).runAdbShell(\n actionParamForMatchedAction,\n );\n\n const resultName = (flowItem as any).name;\n if (result !== undefined) {\n this.setResult(resultName, result);\n }\n } else if (specialActionParamToCall) {\n debug(\n `matchedAction: ${matchedAction.name}`,\n `flowParams: ${JSON.stringify(specialActionParamToCall)}`,\n );\n const result = await agent.callActionInActionSpace(\n matchedAction.name,\n specialActionParamToCall,\n );\n\n const resultName = (flowItem as any).name;\n if (result !== undefined) {\n this.setResult(resultName, result);\n }\n } else if (\n typeof actionParamForMatchedAction === 'string' &&\n schemaIsStringParam\n ) {\n if (matchedAction.paramSchema) {\n const parseResult = matchedAction.paramSchema.safeParse(\n actionParamForMatchedAction,\n );\n if (parseResult.success && typeof parseResult.data === 'string') {\n stringParamToCall = parseResult.data;\n } else if (!parseResult.success) {\n debug(\n `parse failed for action ${matchedAction.name} with string param`,\n parseResult.error,\n );\n stringParamToCall = actionParamForMatchedAction;\n }\n } else {\n stringParamToCall = actionParamForMatchedAction;\n }\n\n if (stringParamToCall !== undefined) {\n debug(\n `matchedAction: ${matchedAction.name}`,\n `flowParams: ${JSON.stringify(stringParamToCall)}`,\n );\n const result = await agent.callActionInActionSpace(\n matchedAction.name,\n stringParamToCall,\n );\n\n // Store result if there's a name property in flowItem\n const resultName = (flowItem as any).name;\n if (result !== undefined) {\n this.setResult(resultName, result);\n }\n }\n } else {\n // Determine the source for parameter extraction:\n // - If we have a locatePromptShortcut, use the flowItem (for actions like aiTap with prompt)\n // - Otherwise, use actionParamForMatchedAction (for actions like runWdaRequest with structured params)\n const sourceForParams =\n locatePromptShortcut &&\n typeof actionParamForMatchedAction === 'string'\n ? { ...flowItem, prompt: locatePromptShortcut }\n : typeof actionParamForMatchedAction === 'object' &&\n actionParamForMatchedAction !== null\n ? actionParamForMatchedAction\n : flowItem;\n\n const { locateParam, restParams } =\n buildDetailedLocateParamAndRestParams(\n locatePromptShortcut || '',\n sourceForParams as LocateOption,\n [\n matchedAction.name,\n matchedAction.interfaceAlias || '_never_mind_',\n ],\n );\n\n const flowParams = {\n ...restParams,\n locate: locateParam,\n };\n\n debug(\n `matchedAction: ${matchedAction.name}`,\n `flowParams: ${JSON.stringify(flowParams, null, 2)}`,\n );\n const result = await agent.callActionInActionSpace(\n matchedAction.name,\n flowParams,\n );\n\n // Store result if there's a name property in flowItem\n const resultName = (flowItem as any).name;\n if (result !== undefined) {\n this.setResult(resultName, result);\n }\n }\n }\n }\n this.reportFile = agent.reportFile;\n await this.flushUnstableLogContent();\n }\n\n async run() {\n const { target, web, android, ios, computer, tasks } = this.script;\n const webEnv = web || target;\n const androidEnv = android;\n const iosEnv = ios;\n const computerEnv = computer;\n const platform = webEnv || androidEnv || iosEnv || computerEnv;\n\n this.setPlayerStatus('running');\n\n let agent: Agent | null = null;\n let freeFn: FreeFn[] = [];\n try {\n const { agent: newAgent, freeFn: newFreeFn } = await this.setupAgent(\n platform as T,\n );\n this.actionSpace = await newAgent.getActionSpace();\n agent = newAgent;\n const originalOnTaskStartTip = agent.onTaskStartTip;\n agent.onTaskStartTip = (tip) => {\n if (this.status === 'running') {\n this.agentStatusTip = tip;\n }\n originalOnTaskStartTip?.(tip);\n };\n freeFn = [\n ...(newFreeFn || []),\n {\n name: 'restore-agent-onTaskStartTip',\n fn: () => {\n if (agent) {\n agent.onTaskStartTip = originalOnTaskStartTip;\n }\n },\n },\n ];\n } catch (e) {\n this.setPlayerStatus('error', e as Error);\n return;\n }\n this.interfaceAgent = agent;\n\n let taskIndex = 0;\n this.setPlayerStatus('running');\n let errorFlag = false;\n while (taskIndex < tasks.length) {\n const taskStatus = this.taskStatusList[taskIndex];\n this.setTaskStatus(taskIndex, 'running' as any);\n this.setTaskIndex(taskIndex);\n\n try {\n await this.playTask(taskStatus, this.interfaceAgent);\n this.setTaskStatus(taskIndex, 'done' as any);\n } catch (e) {\n this.setTaskStatus(taskIndex, 'error' as any, e as Error);\n\n if (taskStatus.continueOnError) {\n // nothing more to do\n } else {\n this.reportFile = agent.reportFile;\n errorFlag = true;\n break;\n }\n }\n this.reportFile = agent?.reportFile;\n taskIndex++;\n }\n\n if (errorFlag) {\n this.setPlayerStatus('error');\n } else {\n this.setPlayerStatus('done');\n }\n this.agentStatusTip = '';\n\n // free the resources\n for (const fn of freeFn) {\n try {\n // console.log('freeing', fn.name);\n await fn.fn();\n // console.log('freed', fn.name);\n } catch (e) {\n // console.error('error freeing', fn.name, e);\n }\n }\n }\n}\n"],"names":["debug","getDebug","aiTaskHandlerMap","isStringParamSchema","schema","schemaDef","z","options","Array","option","buildShortcutActionParam","actionName","interfaceAlias","value","ScriptPlayer","key","keyToUse","console","status","error","taskIndex","taskIndexToNotify","taskStatus","index","statusValue","output","resolve","process","outputDir","dirname","existsSync","mkdirSync","writeFileSync","JSON","undefined","content","filePath","agent","flow","assert","flowItemIndex","currentStep","Number","flowItem","simpleAIKey","Object","actionTask","aiAct","aiAction","ai","actionOptions","prompt","assertTask","msg","name","restOpts","pass","thought","message","Error","agentMethod","aiResult","waitForTask","aiWaitFor","timeout","restWaitForOpts","waitForOptions","sleepTask","ms","msNumber","Promise","setTimeout","evaluateJavaScriptTask","result","recordTask","title","aiInput","rawValue","inputTask","locatePrompt","String","buildDetailedLocateParam","aiKeyboardPress","keyboardPressTask","keyName","aiScroll","scrollTask","locate","scrollOptions","aiTap","tapOptions","opts","locateObj","lp","locateOpts","actionSpace","locatePromptShortcut","actionParamForMatchedAction","matchedAction","action","actionInterfaceAlias","keyOfActionInActionSpace","schemaIsStringParam","stringParamToCall","specialActionParamToCall","resultName","parseResult","sourceForParams","locateParam","restParams","buildDetailedLocateParamAndRestParams","flowParams","target","web","android","ios","computer","tasks","webEnv","androidEnv","iosEnv","computerEnv","platform","freeFn","newAgent","newFreeFn","originalOnTaskStartTip","tip","e","errorFlag","fn","script","setupAgent","onTaskStatusChange","scriptPath","resolvedAiActContext","ifInBrowser","ifInWorker","scriptName","basename","join","getMidsceneRunSubDir","Date","task"],"mappings":"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"}
1
+ {"version":3,"file":"yaml/player.mjs","sources":["../../../src/yaml/player.ts"],"sourcesContent":["import { existsSync, mkdirSync, writeFileSync } from 'node:fs';\nimport { basename, dirname, join, resolve } from 'node:path';\nimport { assert, ifInBrowser, ifInWorker } from '@aiscene/shared/utils';\nimport { type ZodTypeAny, z } from 'zod';\n\n// previous defined yaml flow, as a helper\ninterface MidsceneYamlFlowItemAIInput extends LocateOption {\n // previous version\n // aiInput: string; // value to input\n // locate: TUserPrompt; // where to input\n aiInput: TUserPrompt | undefined; // where to input\n value: string | number; // value to input\n}\n\ninterface MidsceneYamlFlowItemAIKeyboardPress extends LocateOption {\n // previous version\n // aiKeyboardPress: string;\n // locate?: TUserPrompt; // where to press, optional\n aiKeyboardPress: TUserPrompt | undefined; // where to press\n keyName: string; // key to press\n}\n\ninterface MidsceneYamlFlowItemAIScroll extends LocateOption, ScrollParam {\n // previous version\n // aiScroll: null;\n // locate?: TUserPrompt; // which area to scroll, optional\n aiScroll: TUserPrompt | undefined; // which area to scroll\n}\n\nimport type { Agent } from '@/agent/agent';\nimport type { TUserPrompt } from '@/common';\nimport type {\n DeviceAction,\n FreeFn,\n LocateOption,\n MidsceneYamlFlowItemAIAction,\n MidsceneYamlFlowItemAIAssert,\n MidsceneYamlFlowItemAIWaitFor,\n MidsceneYamlFlowItemEvaluateJavaScript,\n MidsceneYamlFlowItemLogScreenshot,\n MidsceneYamlFlowItemSleep,\n MidsceneYamlScript,\n MidsceneYamlScriptEnv,\n ScriptPlayerStatusValue,\n ScriptPlayerTaskStatus,\n ScrollParam,\n} from '@/types';\nimport { getMidsceneRunSubDir } from '@aiscene/shared/common';\nimport { getDebug } from '@aiscene/shared/logger';\nimport {\n buildDetailedLocateParam,\n buildDetailedLocateParamAndRestParams,\n} from './utils';\n\nconst debug = getDebug('yaml-player');\nconst aiTaskHandlerMap = {\n aiQuery: 'aiQuery',\n aiNumber: 'aiNumber',\n aiString: 'aiString',\n aiBoolean: 'aiBoolean',\n aiAsk: 'aiAsk',\n aiLocate: 'aiLocate',\n} as const;\n\ntype AISimpleTaskKey = keyof typeof aiTaskHandlerMap;\n\nconst isStringParamSchema = (schema?: ZodTypeAny): boolean => {\n if (!schema) {\n return false;\n }\n\n const schemaDef = (schema as any)?._def;\n if (!schemaDef?.typeName) {\n return false;\n }\n\n switch (schemaDef.typeName) {\n case z.ZodFirstPartyTypeKind.ZodString:\n case z.ZodFirstPartyTypeKind.ZodEnum:\n case z.ZodFirstPartyTypeKind.ZodNativeEnum:\n return true;\n case z.ZodFirstPartyTypeKind.ZodLiteral:\n return typeof schemaDef.value === 'string';\n case z.ZodFirstPartyTypeKind.ZodOptional:\n case z.ZodFirstPartyTypeKind.ZodNullable:\n case z.ZodFirstPartyTypeKind.ZodDefault:\n return isStringParamSchema(schemaDef.innerType);\n case z.ZodFirstPartyTypeKind.ZodEffects:\n return isStringParamSchema(schemaDef.schema);\n case z.ZodFirstPartyTypeKind.ZodPipeline:\n return isStringParamSchema(schemaDef.out);\n case z.ZodFirstPartyTypeKind.ZodUnion: {\n const options = schemaDef.options as ZodTypeAny[] | undefined;\n return Array.isArray(options)\n ? options.every((option) => isStringParamSchema(option))\n : false;\n }\n default:\n return false;\n }\n};\n\nconst buildShortcutActionParam = (\n actionName: string,\n interfaceAlias: string | undefined,\n value: string,\n) => {\n if (actionName === 'Launch' || interfaceAlias === 'launch') {\n return { uri: value };\n }\n\n if (actionName === 'Terminate' || interfaceAlias === 'terminate') {\n return { uri: value };\n }\n\n if (actionName === 'RunAdbShell' || interfaceAlias === 'runAdbShell') {\n return { command: value };\n }\n\n return undefined;\n};\nexport class ScriptPlayer<T extends MidsceneYamlScriptEnv> {\n public currentTaskIndex?: number;\n public taskStatusList: ScriptPlayerTaskStatus[] = [];\n public status: ScriptPlayerStatusValue = 'init';\n public reportFile?: string | null;\n public result: Record<string, any>;\n private unnamedResultIndex = 0;\n public output?: string | null;\n public unstableLogContent?: string | null;\n public errorInSetup?: Error;\n private interfaceAgent: Agent | null = null;\n public agentStatusTip?: string;\n public target?: MidsceneYamlScriptEnv;\n private actionSpace: DeviceAction[] = [];\n private scriptPath?: string;\n constructor(\n private script: MidsceneYamlScript,\n private setupAgent: (platform: T) => Promise<{\n agent: Agent;\n freeFn: FreeFn[];\n }>,\n public onTaskStatusChange?: (taskStatus: ScriptPlayerTaskStatus) => void,\n scriptPath?: string,\n ) {\n this.scriptPath = scriptPath;\n this.result = {};\n const resolvedAiActContext =\n script.agent?.aiActContext ?? script.agent?.aiActionContext;\n\n if (resolvedAiActContext !== undefined && script.agent) {\n if (\n script.agent.aiActContext === undefined &&\n script.agent.aiActionContext !== undefined\n ) {\n console.warn(\n 'agent.aiActionContext is deprecated, please use agent.aiActContext instead. The legacy name is still accepted for backward compatibility.',\n );\n }\n\n script.agent.aiActContext = resolvedAiActContext;\n }\n\n this.target =\n script.target ||\n script.web ||\n script.android ||\n script.ios ||\n script.computer ||\n script.config;\n\n if (ifInBrowser || ifInWorker) {\n this.output = undefined;\n debug('output is undefined in browser or worker');\n } else if (this.target?.output) {\n this.output = resolve(process.cwd(), this.target.output);\n debug('setting output by config.output', this.output);\n } else {\n const scriptName = this.scriptPath\n ? basename(this.scriptPath, '.yaml').replace(/\\.(ya?ml)$/i, '')\n : 'script';\n this.output = join(\n getMidsceneRunSubDir('output'),\n `${scriptName}-${Date.now()}.json`,\n );\n debug('setting output by script path', this.output);\n }\n\n if (ifInBrowser || ifInWorker) {\n this.unstableLogContent = undefined;\n } else if (typeof this.target?.unstableLogContent === 'string') {\n this.unstableLogContent = resolve(\n process.cwd(),\n this.target.unstableLogContent,\n );\n } else if (this.target?.unstableLogContent === true) {\n this.unstableLogContent = join(\n getMidsceneRunSubDir('output'),\n 'unstableLogContent.json',\n );\n }\n\n this.taskStatusList = (script.tasks || []).map((task, taskIndex) => ({\n ...task,\n index: taskIndex,\n status: 'init',\n totalSteps: task.flow?.length || 0,\n }));\n }\n\n private setResult(key: string | undefined, value: any) {\n const keyToUse = key || this.unnamedResultIndex++;\n if (this.result[keyToUse]) {\n console.warn(`result key ${keyToUse} already exists, will overwrite`);\n }\n this.result[keyToUse] = value;\n\n return this.flushResult();\n }\n\n private setPlayerStatus(status: ScriptPlayerStatusValue, error?: Error) {\n this.status = status;\n this.errorInSetup = error;\n }\n\n private notifyCurrentTaskStatusChange(taskIndex?: number) {\n const taskIndexToNotify =\n typeof taskIndex === 'number' ? taskIndex : this.currentTaskIndex;\n\n if (typeof taskIndexToNotify !== 'number') {\n return;\n }\n\n const taskStatus = this.taskStatusList[taskIndexToNotify];\n if (this.onTaskStatusChange) {\n this.onTaskStatusChange(taskStatus);\n }\n }\n\n private async setTaskStatus(\n index: number,\n statusValue: ScriptPlayerStatusValue,\n error?: Error,\n ) {\n this.taskStatusList[index].status = statusValue;\n if (error) {\n this.taskStatusList[index].error = error;\n }\n\n this.notifyCurrentTaskStatusChange(index);\n }\n\n private setTaskIndex(taskIndex: number) {\n this.currentTaskIndex = taskIndex;\n }\n\n private flushResult() {\n if (this.output) {\n const output = resolve(process.cwd(), this.output);\n const outputDir = dirname(output);\n if (!existsSync(outputDir)) {\n mkdirSync(outputDir, { recursive: true });\n }\n writeFileSync(output, JSON.stringify(this.result || {}, undefined, 2));\n }\n }\n\n private flushUnstableLogContent() {\n if (this.unstableLogContent) {\n const content = this.interfaceAgent?._unstableLogContent();\n const filePath = resolve(process.cwd(), this.unstableLogContent);\n const outputDir = dirname(filePath);\n if (!existsSync(outputDir)) {\n mkdirSync(outputDir, { recursive: true });\n }\n writeFileSync(filePath, JSON.stringify(content, null, 2));\n }\n }\n\n async playTask(taskStatus: ScriptPlayerTaskStatus, agent: Agent) {\n const { flow } = taskStatus;\n assert(flow, 'missing flow in task');\n\n for (const flowItemIndex in flow) {\n const currentStep = Number.parseInt(flowItemIndex, 10);\n taskStatus.currentStep = currentStep;\n const flowItem = flow[flowItemIndex];\n\n // Skip Finalize action from cache - it's a planning-only marker\n if ('Finalize' in flowItem) {\n continue;\n }\n\n debug(\n `playing step ${flowItemIndex}, flowItem=${JSON.stringify(flowItem)}`,\n );\n const simpleAIKey = (\n Object.keys(aiTaskHandlerMap) as AISimpleTaskKey[]\n ).find((key) => Object.prototype.hasOwnProperty.call(flowItem, key));\n if (\n 'aiAct' in (flowItem as MidsceneYamlFlowItemAIAction) ||\n 'aiAction' in (flowItem as MidsceneYamlFlowItemAIAction) ||\n 'ai' in (flowItem as MidsceneYamlFlowItemAIAction)\n ) {\n const actionTask = flowItem as MidsceneYamlFlowItemAIAction;\n const { aiAct, aiAction, ai, ...actionOptions } = actionTask;\n const prompt = aiAct || aiAction || ai;\n assert(prompt, 'missing prompt for ai (aiAct)');\n await agent.aiAct(prompt, actionOptions);\n } else if ('aiAssert' in (flowItem as MidsceneYamlFlowItemAIAssert)) {\n const assertTask = flowItem as MidsceneYamlFlowItemAIAssert;\n const {\n aiAssert: prompt,\n errorMessage: msg,\n name,\n ...restOpts\n } = assertTask;\n assert(prompt, 'missing prompt for aiAssert');\n const { pass, thought, message } =\n (await agent.aiAssert(prompt, msg, {\n ...restOpts,\n keepRawResponse: true,\n })) || {};\n\n this.setResult(name, {\n pass,\n thought,\n message,\n });\n\n if (!pass) {\n throw new Error(message);\n }\n } else if (simpleAIKey) {\n const {\n [simpleAIKey]: prompt,\n name,\n ...options\n } = flowItem as Record<string, any>;\n assert(prompt, `missing prompt for ${simpleAIKey}`);\n const agentMethod = (agent as any)[aiTaskHandlerMap[simpleAIKey]];\n assert(\n typeof agentMethod === 'function',\n `missing agent method for ${simpleAIKey}`,\n );\n const aiResult = await agentMethod.call(agent, prompt, options);\n this.setResult(name, aiResult);\n } else if ('aiWaitFor' in (flowItem as MidsceneYamlFlowItemAIWaitFor)) {\n const waitForTask = flowItem as MidsceneYamlFlowItemAIWaitFor;\n const { aiWaitFor, timeout, ...restWaitForOpts } = waitForTask;\n const prompt = aiWaitFor;\n assert(prompt, 'missing prompt for aiWaitFor');\n const waitForOptions = {\n ...restWaitForOpts,\n ...(timeout !== undefined ? { timeout, timeoutMs: timeout } : {}),\n };\n await agent.aiWaitFor(prompt, waitForOptions);\n } else if ('sleep' in (flowItem as MidsceneYamlFlowItemSleep)) {\n const sleepTask = flowItem as MidsceneYamlFlowItemSleep;\n const ms = sleepTask.sleep;\n let msNumber = ms;\n if (typeof ms === 'string') {\n msNumber = Number.parseInt(ms, 10);\n }\n assert(\n msNumber && msNumber > 0,\n `ms for sleep must be greater than 0, but got ${ms}`,\n );\n await new Promise((resolve) => setTimeout(resolve, msNumber));\n } else if (\n 'javascript' in (flowItem as MidsceneYamlFlowItemEvaluateJavaScript)\n ) {\n const evaluateJavaScriptTask =\n flowItem as MidsceneYamlFlowItemEvaluateJavaScript;\n\n const result = await agent.evaluateJavaScript(\n evaluateJavaScriptTask.javascript,\n );\n this.setResult(evaluateJavaScriptTask.name, result);\n } else if (\n 'logScreenshot' in (flowItem as MidsceneYamlFlowItemLogScreenshot) ||\n 'recordToReport' in (flowItem as MidsceneYamlFlowItemLogScreenshot)\n ) {\n const recordTask = flowItem as MidsceneYamlFlowItemLogScreenshot;\n const title =\n recordTask.recordToReport ?? recordTask.logScreenshot ?? 'untitled';\n const content = recordTask.content || '';\n await agent.recordToReport(title, { content });\n } else if ('aiInput' in (flowItem as MidsceneYamlFlowItemAIInput)) {\n // may be input empty string ''\n const {\n aiInput,\n value: rawValue,\n ...inputTask\n } = flowItem as MidsceneYamlFlowItemAIInput;\n\n // Compatibility with previous version:\n // Old format: { aiInput: string (value), locate: TUserPrompt }\n // New format - 1: { aiInput: TUserPrompt, value: string | number }\n // New format - 2: { aiInput: undefined, locate: TUserPrompt, value: string | number }\n let locatePrompt: TUserPrompt | undefined;\n let value: string | number | undefined;\n if ((inputTask as any).locate) {\n // Old format - aiInput is the value, locate is the prompt\n // Keep backward compatibility: empty string is treated as no value\n value = (aiInput as string | number) || rawValue;\n locatePrompt = (inputTask as any).locate;\n } else {\n // New format - aiInput is the prompt, value is the value\n locatePrompt = aiInput || '';\n value = rawValue;\n }\n\n // Convert value to string for Input action\n await agent.callActionInActionSpace('Input', {\n ...inputTask,\n ...(value !== undefined ? { value: String(value) } : {}),\n ...(locatePrompt\n ? { locate: buildDetailedLocateParam(locatePrompt, inputTask) }\n : {}),\n });\n } else if (\n 'aiKeyboardPress' in (flowItem as MidsceneYamlFlowItemAIKeyboardPress)\n ) {\n const { aiKeyboardPress, ...keyboardPressTask } =\n flowItem as MidsceneYamlFlowItemAIKeyboardPress;\n\n // Compatibility with previous version:\n // Old format: { aiKeyboardPress: string (key), locate?: TUserPrompt }\n // New format - 1: { aiKeyboardPress: TUserPrompt, keyName: string }\n // New format - 2: { aiKeyboardPress: , locate?: TUserPrompt, keyName: string }\n let locatePrompt: TUserPrompt | undefined;\n let keyName: string | undefined;\n if ((keyboardPressTask as any).locate) {\n // Old format - aiKeyboardPress is the key, locate is the prompt\n keyName = aiKeyboardPress as string;\n locatePrompt = (keyboardPressTask as any).locate;\n } else if (keyboardPressTask.keyName) {\n // New format - aiKeyboardPress is the prompt, key is the key\n keyName = keyboardPressTask.keyName;\n locatePrompt = aiKeyboardPress;\n } else {\n keyName = aiKeyboardPress as string;\n }\n\n await agent.callActionInActionSpace('KeyboardPress', {\n ...keyboardPressTask,\n ...(keyName ? { keyName } : {}),\n ...(locatePrompt\n ? {\n locate: buildDetailedLocateParam(\n locatePrompt,\n keyboardPressTask,\n ),\n }\n : {}),\n });\n } else if ('aiScroll' in (flowItem as MidsceneYamlFlowItemAIScroll)) {\n const { aiScroll, ...scrollTask } =\n flowItem as MidsceneYamlFlowItemAIScroll;\n\n // Compatibility with previous version:\n // Old format: { aiScroll: null, locate?: TUserPrompt, direction, scrollType, distance? }\n // New format - 1: { aiScroll: TUserPrompt, direction, scrollType, distance? }\n // New format - 2: { aiScroll: undefined, locate: TUserPrompt, direction, scrollType, distance? }\n const { locate, ...scrollOptions } = scrollTask as any;\n const locatePrompt: TUserPrompt | undefined =\n locate ?? aiScroll ?? undefined;\n\n await agent.aiScroll(locatePrompt, scrollOptions);\n } else if ('aiTap' in flowItem) {\n const { aiTap, prompt, locate, ...tapOptions } = flowItem as any;\n\n let locatePrompt: TUserPrompt;\n let opts = tapOptions;\n // Support both formats:\n // 1. { aiTap: null, locate: { prompt, images, ... } } (locate as sibling key)\n // 2. { aiTap: { locate: { prompt, images, ... } } } (locate nested in aiTap)\n const locateObj =\n locate ??\n (typeof aiTap === 'object' && aiTap !== null\n ? aiTap.locate\n : undefined);\n\n if (typeof aiTap === 'string' && aiTap) {\n // User YAML: aiTap: 'search input box'\n locatePrompt = aiTap;\n } else if (typeof locateObj === 'object' && locateObj?.prompt) {\n // buildYamlFlowFromPlans: { aiTap: '', locate: { prompt, deepLocate, cacheable } }\n const { prompt: lp, ...locateOpts } = locateObj;\n locatePrompt = lp;\n opts = { ...locateOpts, ...tapOptions };\n } else {\n // User YAML: aiTap: { prompt: '...' } or aiTap: null + prompt: '...'\n locatePrompt = aiTap?.prompt || prompt || locateObj;\n }\n\n assert(locatePrompt, 'missing prompt for aiTap');\n await agent.aiTap(locatePrompt, opts);\n } else {\n // generic action, find the action in actionSpace\n\n /* for aiRightClick, the parameters are a flattened data for the 'locate', these are all valid data\n\n - aiRightClick: 'search input box'\n - aiRightClick: 'search input box'\n deepLocate: true\n cacheable: false\n - aiRightClick:\n prompt: 'search input box'\n - aiRightClick:\n prompt: 'search input box'\n deepLocate: true\n cacheable: false\n */\n\n const actionSpace = this.actionSpace;\n let locatePromptShortcut: string | undefined;\n let actionParamForMatchedAction: unknown;\n const matchedAction = actionSpace.find((action) => {\n const actionInterfaceAlias = action.interfaceAlias;\n if (\n actionInterfaceAlias &&\n Object.prototype.hasOwnProperty.call(flowItem, actionInterfaceAlias)\n ) {\n actionParamForMatchedAction =\n flowItem[actionInterfaceAlias as keyof typeof flowItem];\n if (typeof actionParamForMatchedAction === 'string') {\n locatePromptShortcut = actionParamForMatchedAction;\n }\n return true;\n }\n\n const keyOfActionInActionSpace = action.name;\n if (\n Object.prototype.hasOwnProperty.call(\n flowItem,\n keyOfActionInActionSpace,\n )\n ) {\n actionParamForMatchedAction =\n flowItem[keyOfActionInActionSpace as keyof typeof flowItem];\n if (typeof actionParamForMatchedAction === 'string') {\n locatePromptShortcut = actionParamForMatchedAction;\n }\n return true;\n }\n\n return false;\n });\n\n assert(\n matchedAction,\n `unknown flowItem in yaml: ${JSON.stringify(flowItem)}`,\n );\n\n const schemaIsStringParam = isStringParamSchema(\n matchedAction.paramSchema,\n );\n let stringParamToCall: string | undefined;\n const specialActionParamToCall =\n typeof actionParamForMatchedAction === 'string'\n ? buildShortcutActionParam(\n matchedAction.name,\n matchedAction.interfaceAlias,\n actionParamForMatchedAction,\n )\n : undefined;\n if (specialActionParamToCall) {\n debug(\n `matchedAction: ${matchedAction.name}`,\n `flowParams: ${JSON.stringify(specialActionParamToCall)}`,\n );\n const result = await agent.callActionInActionSpace(\n matchedAction.name,\n specialActionParamToCall,\n );\n\n const resultName = (flowItem as any).name;\n if (result !== undefined) {\n this.setResult(resultName, result);\n }\n } else if (\n typeof actionParamForMatchedAction === 'string' &&\n schemaIsStringParam\n ) {\n if (matchedAction.paramSchema) {\n const parseResult = matchedAction.paramSchema.safeParse(\n actionParamForMatchedAction,\n );\n if (parseResult.success && typeof parseResult.data === 'string') {\n stringParamToCall = parseResult.data;\n } else if (!parseResult.success) {\n debug(\n `parse failed for action ${matchedAction.name} with string param`,\n parseResult.error,\n );\n stringParamToCall = actionParamForMatchedAction;\n }\n } else {\n stringParamToCall = actionParamForMatchedAction;\n }\n\n if (stringParamToCall !== undefined) {\n debug(\n `matchedAction: ${matchedAction.name}`,\n `flowParams: ${JSON.stringify(stringParamToCall)}`,\n );\n const result = await agent.callActionInActionSpace(\n matchedAction.name,\n stringParamToCall,\n );\n\n // Store result if there's a name property in flowItem\n const resultName = (flowItem as any).name;\n if (result !== undefined) {\n this.setResult(resultName, result);\n }\n }\n } else {\n // Determine the source for parameter extraction:\n // - If we have a locatePromptShortcut, use the flowItem (for actions like aiTap with prompt)\n // - Otherwise, use actionParamForMatchedAction (for actions like runWdaRequest with structured params)\n const sourceForParams =\n locatePromptShortcut &&\n typeof actionParamForMatchedAction === 'string'\n ? { ...flowItem, prompt: locatePromptShortcut }\n : typeof actionParamForMatchedAction === 'object' &&\n actionParamForMatchedAction !== null\n ? actionParamForMatchedAction\n : flowItem;\n\n const { locateParam, restParams } =\n buildDetailedLocateParamAndRestParams(\n locatePromptShortcut || '',\n sourceForParams as LocateOption,\n [\n matchedAction.name,\n matchedAction.interfaceAlias || '_never_mind_',\n ],\n );\n\n const flowParams = {\n ...restParams,\n locate: locateParam,\n };\n\n debug(\n `matchedAction: ${matchedAction.name}`,\n `flowParams: ${JSON.stringify(flowParams, null, 2)}`,\n );\n const result = await agent.callActionInActionSpace(\n matchedAction.name,\n flowParams,\n );\n\n // Store result if there's a name property in flowItem\n const resultName = (flowItem as any).name;\n if (result !== undefined) {\n this.setResult(resultName, result);\n }\n }\n }\n }\n this.reportFile = agent.reportFile;\n await this.flushUnstableLogContent();\n }\n\n async run() {\n const { target, web, android, ios, computer, tasks } = this.script;\n const webEnv = web || target;\n const androidEnv = android;\n const iosEnv = ios;\n const computerEnv = computer;\n const platform = webEnv || androidEnv || iosEnv || computerEnv;\n\n this.setPlayerStatus('running');\n\n let agent: Agent | null = null;\n let freeFn: FreeFn[] = [];\n try {\n const { agent: newAgent, freeFn: newFreeFn } = await this.setupAgent(\n platform as T,\n );\n this.actionSpace = await newAgent.getActionSpace();\n agent = newAgent;\n const originalOnTaskStartTip = agent.onTaskStartTip;\n agent.onTaskStartTip = (tip) => {\n if (this.status === 'running') {\n this.agentStatusTip = tip;\n }\n originalOnTaskStartTip?.(tip);\n };\n freeFn = [\n ...(newFreeFn || []),\n {\n name: 'restore-agent-onTaskStartTip',\n fn: () => {\n if (agent) {\n agent.onTaskStartTip = originalOnTaskStartTip;\n }\n },\n },\n ];\n } catch (e) {\n this.setPlayerStatus('error', e as Error);\n return;\n }\n this.interfaceAgent = agent;\n\n let taskIndex = 0;\n this.setPlayerStatus('running');\n let errorFlag = false;\n while (taskIndex < tasks.length) {\n const taskStatus = this.taskStatusList[taskIndex];\n this.setTaskStatus(taskIndex, 'running' as any);\n this.setTaskIndex(taskIndex);\n\n try {\n await this.playTask(taskStatus, this.interfaceAgent);\n this.setTaskStatus(taskIndex, 'done' as any);\n } catch (e) {\n this.setTaskStatus(taskIndex, 'error' as any, e as Error);\n\n if (taskStatus.continueOnError) {\n // nothing more to do\n } else {\n this.reportFile = agent.reportFile;\n errorFlag = true;\n break;\n }\n }\n this.reportFile = agent?.reportFile;\n taskIndex++;\n }\n\n if (errorFlag) {\n this.setPlayerStatus('error');\n } else {\n this.setPlayerStatus('done');\n }\n this.agentStatusTip = '';\n\n // free the resources\n for (const fn of freeFn) {\n try {\n // console.log('freeing', fn.name);\n await fn.fn();\n // console.log('freed', fn.name);\n } catch (e) {\n // console.error('error freeing', fn.name, e);\n }\n }\n }\n}\n"],"names":["debug","getDebug","aiTaskHandlerMap","isStringParamSchema","schema","schemaDef","z","options","Array","option","buildShortcutActionParam","actionName","interfaceAlias","value","ScriptPlayer","key","keyToUse","console","status","error","taskIndex","taskIndexToNotify","taskStatus","index","statusValue","output","resolve","process","outputDir","dirname","existsSync","mkdirSync","writeFileSync","JSON","undefined","content","filePath","agent","flow","assert","flowItemIndex","currentStep","Number","flowItem","simpleAIKey","Object","actionTask","aiAct","aiAction","ai","actionOptions","prompt","assertTask","msg","name","restOpts","pass","thought","message","Error","agentMethod","aiResult","waitForTask","aiWaitFor","timeout","restWaitForOpts","waitForOptions","sleepTask","ms","msNumber","Promise","setTimeout","evaluateJavaScriptTask","result","recordTask","title","aiInput","rawValue","inputTask","locatePrompt","String","buildDetailedLocateParam","aiKeyboardPress","keyboardPressTask","keyName","aiScroll","scrollTask","locate","scrollOptions","aiTap","tapOptions","opts","locateObj","lp","locateOpts","actionSpace","locatePromptShortcut","actionParamForMatchedAction","matchedAction","action","actionInterfaceAlias","keyOfActionInActionSpace","schemaIsStringParam","stringParamToCall","specialActionParamToCall","resultName","parseResult","sourceForParams","locateParam","restParams","buildDetailedLocateParamAndRestParams","flowParams","target","web","android","ios","computer","tasks","webEnv","androidEnv","iosEnv","computerEnv","platform","freeFn","newAgent","newFreeFn","originalOnTaskStartTip","tip","e","errorFlag","fn","script","setupAgent","onTaskStatusChange","scriptPath","resolvedAiActContext","ifInBrowser","ifInWorker","scriptName","basename","join","getMidsceneRunSubDir","Date","task"],"mappings":"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"}
@@ -206,7 +206,7 @@ class Agent {
206
206
  const exec = executionDump || this.lastExecutionDump;
207
207
  if (exec) {
208
208
  this.lastExecutionDump = exec;
209
- this.reportGenerator.onExecutionUpdate(exec, this.getReportMeta());
209
+ this.reportGenerator.onExecutionUpdate(exec, this.getReportMeta(), this.opts.reportAttributes);
210
210
  }
211
211
  this.reportFile = this.reportGenerator.getReportPath();
212
212
  }
@@ -329,7 +329,7 @@ class Agent {
329
329
  let locatePrompt;
330
330
  let opt;
331
331
  const isLocatePromptLike = (value)=>{
332
- if ('string' == typeof value || void 0 === value) return true;
332
+ if ('string' == typeof value || null == value) return true;
333
333
  return 'object' == typeof value && null !== value && 'prompt' in value;
334
334
  };
335
335
  if (isLocatePromptLike(locatePromptOrScrollParam) && 'object' == typeof locatePromptOrOpt && null !== locatePromptOrOpt) {
@@ -363,19 +363,33 @@ class Agent {
363
363
  locate: detailedLocateParam
364
364
  });
365
365
  }
366
+ async aiLongPress(locatePrompt, opt) {
367
+ (0, utils_namespaceObject.assert)(locatePrompt, 'missing locate prompt for long press');
368
+ const detailedLocateParam = (0, external_yaml_index_js_namespaceObject.buildDetailedLocateParam)(locatePrompt, opt);
369
+ return this.callActionInActionSpace('LongPress', {
370
+ ...opt || {},
371
+ locate: detailedLocateParam
372
+ });
373
+ }
374
+ async aiClearInput(locatePrompt, opt) {
375
+ (0, utils_namespaceObject.assert)(locatePrompt, 'missing locate prompt for clear input');
376
+ const detailedLocateParam = (0, external_yaml_index_js_namespaceObject.buildDetailedLocateParam)(locatePrompt, opt);
377
+ return this.callActionInActionSpace('ClearInput', {
378
+ locate: detailedLocateParam
379
+ });
380
+ }
366
381
  async aiAct(taskPrompt, opt) {
367
382
  const fileChooserAccept = opt?.fileChooserAccept ? this.normalizeFileInput(opt.fileChooserAccept) : void 0;
368
383
  const abortSignal = opt?.abortSignal;
369
384
  if (abortSignal?.aborted) throw new Error(`aiAct aborted: ${abortSignal.reason || 'signal already aborted'}`);
370
385
  const runAiAct = async ()=>{
371
386
  const modelConfigForPlanning = this.modelConfigManager.getModelConfig('planning');
372
- const defaultIntentModelConfig = this.modelConfigManager.getModelConfig('default');
373
- const deepThink = opt?.deepThink === 'unset' ? void 0 : opt?.deepThink;
387
+ const planningModeDeepThink = opt?.deepThink === true;
374
388
  const deepLocate = opt?.deepLocate;
375
- const noIndividualLocateModel = modelConfigForPlanning.modelName === defaultIntentModelConfig.modelName && modelConfigForPlanning.openaiBaseURL === defaultIntentModelConfig.openaiBaseURL;
376
- const includeBboxInPlanning = !deepThink && noIndividualLocateModel;
389
+ const noIndividualLocateModel = 'default' === modelConfigForPlanning.slot;
390
+ const includeBboxInPlanning = !planningModeDeepThink && noIndividualLocateModel;
377
391
  debug('setting includeBboxInPlanning to', includeBboxInPlanning, {
378
- deepThink,
392
+ planningModeDeepThink,
379
393
  noIndividualLocateModel
380
394
  });
381
395
  const cacheable = opt?.cacheable;
@@ -390,8 +404,8 @@ class Agent {
390
404
  await this.runYaml(yaml);
391
405
  return;
392
406
  }
393
- const imagesIncludeCount = deepThink ? 2 : 1;
394
- const { output: actionOutput } = await this.taskExecutor.action(taskPrompt, modelConfigForPlanning, defaultIntentModelConfig, includeBboxInPlanning, this.aiActContext, cacheable, replanningCycleLimit, imagesIncludeCount, deepThink, fileChooserAccept, deepLocate, abortSignal);
407
+ const imagesIncludeCount = planningModeDeepThink ? 2 : 1;
408
+ const { output: actionOutput } = await this.taskExecutor.action(taskPrompt, modelConfigForPlanning, this.modelConfigManager.getModelConfig('default'), includeBboxInPlanning, this.aiActContext, cacheable, replanningCycleLimit, imagesIncludeCount, planningModeDeepThink, fileChooserAccept, deepLocate, abortSignal);
395
409
  if (this.taskCache && actionOutput?.yamlFlow?.length && false !== cacheable) {
396
410
  const yamlContent = {
397
411
  tasks: [
@@ -758,7 +772,7 @@ class Agent {
758
772
  onTaskStart: this.callbackOnTaskStartTip.bind(this),
759
773
  replanningCycleLimit: this.opts.replanningCycleLimit,
760
774
  waitAfterAction: this.opts.waitAfterAction,
761
- useDeviceTimestamp: this.opts.useDeviceTimestamp,
775
+ useDeviceTime: this.opts.useDeviceTime,
762
776
  actionSpace: this.fullActionSpace,
763
777
  hooks: {
764
778
  onTaskUpdate: async (runner)=>{
@@ -781,7 +795,8 @@ class Agent {
781
795
  generateReport: this.opts.generateReport,
782
796
  persistExecutionDump: this.opts.persistExecutionDump,
783
797
  outputFormat: this.opts.outputFormat,
784
- autoPrintReportMsg: this.opts.autoPrintReportMsg
798
+ autoPrintReportMsg: this.opts.autoPrintReportMsg,
799
+ reuseExistingReport: this.opts.reportAttributes?.['data-group-id'] === this.reportFileName
785
800
  });
786
801
  }
787
802
  }