@donggui/core 1.5.4-donggui.3
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/LICENSE +21 -0
- package/README.md +9 -0
- package/dist/es/agent/agent.mjs +709 -0
- package/dist/es/agent/agent.mjs.map +1 -0
- package/dist/es/agent/common.mjs +0 -0
- package/dist/es/agent/execution-session.mjs +41 -0
- package/dist/es/agent/execution-session.mjs.map +1 -0
- package/dist/es/agent/index.mjs +6 -0
- package/dist/es/agent/task-builder.mjs +330 -0
- package/dist/es/agent/task-builder.mjs.map +1 -0
- package/dist/es/agent/task-cache.mjs +186 -0
- package/dist/es/agent/task-cache.mjs.map +1 -0
- package/dist/es/agent/tasks.mjs +422 -0
- package/dist/es/agent/tasks.mjs.map +1 -0
- package/dist/es/agent/ui-utils.mjs +91 -0
- package/dist/es/agent/ui-utils.mjs.map +1 -0
- package/dist/es/agent/utils.mjs +198 -0
- package/dist/es/agent/utils.mjs.map +1 -0
- package/dist/es/ai-model/auto-glm/actions.mjs +224 -0
- package/dist/es/ai-model/auto-glm/actions.mjs.map +1 -0
- package/dist/es/ai-model/auto-glm/index.mjs +6 -0
- package/dist/es/ai-model/auto-glm/parser.mjs +239 -0
- package/dist/es/ai-model/auto-glm/parser.mjs.map +1 -0
- package/dist/es/ai-model/auto-glm/planning.mjs +71 -0
- package/dist/es/ai-model/auto-glm/planning.mjs.map +1 -0
- package/dist/es/ai-model/auto-glm/prompt.mjs +222 -0
- package/dist/es/ai-model/auto-glm/prompt.mjs.map +1 -0
- package/dist/es/ai-model/auto-glm/util.mjs +9 -0
- package/dist/es/ai-model/auto-glm/util.mjs.map +1 -0
- package/dist/es/ai-model/conversation-history.mjs +195 -0
- package/dist/es/ai-model/conversation-history.mjs.map +1 -0
- package/dist/es/ai-model/index.mjs +11 -0
- package/dist/es/ai-model/inspect.mjs +386 -0
- package/dist/es/ai-model/inspect.mjs.map +1 -0
- package/dist/es/ai-model/llm-planning.mjs +233 -0
- package/dist/es/ai-model/llm-planning.mjs.map +1 -0
- package/dist/es/ai-model/prompt/common.mjs +7 -0
- package/dist/es/ai-model/prompt/common.mjs.map +1 -0
- package/dist/es/ai-model/prompt/describe.mjs +66 -0
- package/dist/es/ai-model/prompt/describe.mjs.map +1 -0
- package/dist/es/ai-model/prompt/extraction.mjs +129 -0
- package/dist/es/ai-model/prompt/extraction.mjs.map +1 -0
- package/dist/es/ai-model/prompt/llm-locator.mjs +51 -0
- package/dist/es/ai-model/prompt/llm-locator.mjs.map +1 -0
- package/dist/es/ai-model/prompt/llm-planning.mjs +364 -0
- package/dist/es/ai-model/prompt/llm-planning.mjs.map +1 -0
- package/dist/es/ai-model/prompt/llm-section-locator.mjs +44 -0
- package/dist/es/ai-model/prompt/llm-section-locator.mjs.map +1 -0
- package/dist/es/ai-model/prompt/order-sensitive-judge.mjs +35 -0
- package/dist/es/ai-model/prompt/order-sensitive-judge.mjs.map +1 -0
- package/dist/es/ai-model/prompt/playwright-generator.mjs +117 -0
- package/dist/es/ai-model/prompt/playwright-generator.mjs.map +1 -0
- package/dist/es/ai-model/prompt/ui-tars-planning.mjs +36 -0
- package/dist/es/ai-model/prompt/ui-tars-planning.mjs.map +1 -0
- package/dist/es/ai-model/prompt/util.mjs +59 -0
- package/dist/es/ai-model/prompt/util.mjs.map +1 -0
- package/dist/es/ai-model/prompt/yaml-generator.mjs +219 -0
- package/dist/es/ai-model/prompt/yaml-generator.mjs.map +1 -0
- package/dist/es/ai-model/service-caller/index.mjs +466 -0
- package/dist/es/ai-model/service-caller/index.mjs.map +1 -0
- package/dist/es/ai-model/ui-tars-planning.mjs +249 -0
- package/dist/es/ai-model/ui-tars-planning.mjs.map +1 -0
- package/dist/es/common.mjs +371 -0
- package/dist/es/common.mjs.map +1 -0
- package/dist/es/device/device-options.mjs +0 -0
- package/dist/es/device/index.mjs +300 -0
- package/dist/es/device/index.mjs.map +1 -0
- package/dist/es/dump/html-utils.mjs +211 -0
- package/dist/es/dump/html-utils.mjs.map +1 -0
- package/dist/es/dump/image-restoration.mjs +43 -0
- package/dist/es/dump/image-restoration.mjs.map +1 -0
- package/dist/es/dump/index.mjs +3 -0
- package/dist/es/index.mjs +15 -0
- package/dist/es/index.mjs.map +1 -0
- package/dist/es/report-generator.mjs +134 -0
- package/dist/es/report-generator.mjs.map +1 -0
- package/dist/es/report.mjs +111 -0
- package/dist/es/report.mjs.map +1 -0
- package/dist/es/screenshot-item.mjs +105 -0
- package/dist/es/screenshot-item.mjs.map +1 -0
- package/dist/es/service/index.mjs +256 -0
- package/dist/es/service/index.mjs.map +1 -0
- package/dist/es/service/utils.mjs +15 -0
- package/dist/es/service/utils.mjs.map +1 -0
- package/dist/es/skill/index.mjs +38 -0
- package/dist/es/skill/index.mjs.map +1 -0
- package/dist/es/task-runner.mjs +258 -0
- package/dist/es/task-runner.mjs.map +1 -0
- package/dist/es/task-timing.mjs +12 -0
- package/dist/es/task-timing.mjs.map +1 -0
- package/dist/es/tree.mjs +13 -0
- package/dist/es/tree.mjs.map +1 -0
- package/dist/es/types.mjs +196 -0
- package/dist/es/types.mjs.map +1 -0
- package/dist/es/utils.mjs +218 -0
- package/dist/es/utils.mjs.map +1 -0
- package/dist/es/yaml/builder.mjs +13 -0
- package/dist/es/yaml/builder.mjs.map +1 -0
- package/dist/es/yaml/index.mjs +4 -0
- package/dist/es/yaml/player.mjs +418 -0
- package/dist/es/yaml/player.mjs.map +1 -0
- package/dist/es/yaml/utils.mjs +73 -0
- package/dist/es/yaml/utils.mjs.map +1 -0
- package/dist/es/yaml.mjs +0 -0
- package/dist/lib/agent/agent.js +757 -0
- package/dist/lib/agent/agent.js.map +1 -0
- package/dist/lib/agent/common.js +5 -0
- package/dist/lib/agent/execution-session.js +75 -0
- package/dist/lib/agent/execution-session.js.map +1 -0
- package/dist/lib/agent/index.js +81 -0
- package/dist/lib/agent/index.js.map +1 -0
- package/dist/lib/agent/task-builder.js +367 -0
- package/dist/lib/agent/task-builder.js.map +1 -0
- package/dist/lib/agent/task-cache.js +238 -0
- package/dist/lib/agent/task-cache.js.map +1 -0
- package/dist/lib/agent/tasks.js +465 -0
- package/dist/lib/agent/tasks.js.map +1 -0
- package/dist/lib/agent/ui-utils.js +143 -0
- package/dist/lib/agent/ui-utils.js.map +1 -0
- package/dist/lib/agent/utils.js +275 -0
- package/dist/lib/agent/utils.js.map +1 -0
- package/dist/lib/ai-model/auto-glm/actions.js +258 -0
- package/dist/lib/ai-model/auto-glm/actions.js.map +1 -0
- package/dist/lib/ai-model/auto-glm/index.js +66 -0
- package/dist/lib/ai-model/auto-glm/index.js.map +1 -0
- package/dist/lib/ai-model/auto-glm/parser.js +282 -0
- package/dist/lib/ai-model/auto-glm/parser.js.map +1 -0
- package/dist/lib/ai-model/auto-glm/planning.js +105 -0
- package/dist/lib/ai-model/auto-glm/planning.js.map +1 -0
- package/dist/lib/ai-model/auto-glm/prompt.js +259 -0
- package/dist/lib/ai-model/auto-glm/prompt.js.map +1 -0
- package/dist/lib/ai-model/auto-glm/util.js +46 -0
- package/dist/lib/ai-model/auto-glm/util.js.map +1 -0
- package/dist/lib/ai-model/conversation-history.js +229 -0
- package/dist/lib/ai-model/conversation-history.js.map +1 -0
- package/dist/lib/ai-model/index.js +125 -0
- package/dist/lib/ai-model/index.js.map +1 -0
- package/dist/lib/ai-model/inspect.js +429 -0
- package/dist/lib/ai-model/inspect.js.map +1 -0
- package/dist/lib/ai-model/llm-planning.js +270 -0
- package/dist/lib/ai-model/llm-planning.js.map +1 -0
- package/dist/lib/ai-model/prompt/common.js +41 -0
- package/dist/lib/ai-model/prompt/common.js.map +1 -0
- package/dist/lib/ai-model/prompt/describe.js +100 -0
- package/dist/lib/ai-model/prompt/describe.js.map +1 -0
- package/dist/lib/ai-model/prompt/extraction.js +169 -0
- package/dist/lib/ai-model/prompt/extraction.js.map +1 -0
- package/dist/lib/ai-model/prompt/llm-locator.js +88 -0
- package/dist/lib/ai-model/prompt/llm-locator.js.map +1 -0
- package/dist/lib/ai-model/prompt/llm-planning.js +401 -0
- package/dist/lib/ai-model/prompt/llm-planning.js.map +1 -0
- package/dist/lib/ai-model/prompt/llm-section-locator.js +81 -0
- package/dist/lib/ai-model/prompt/llm-section-locator.js.map +1 -0
- package/dist/lib/ai-model/prompt/order-sensitive-judge.js +72 -0
- package/dist/lib/ai-model/prompt/order-sensitive-judge.js.map +1 -0
- package/dist/lib/ai-model/prompt/playwright-generator.js +178 -0
- package/dist/lib/ai-model/prompt/playwright-generator.js.map +1 -0
- package/dist/lib/ai-model/prompt/ui-tars-planning.js +73 -0
- package/dist/lib/ai-model/prompt/ui-tars-planning.js.map +1 -0
- package/dist/lib/ai-model/prompt/util.js +105 -0
- package/dist/lib/ai-model/prompt/util.js.map +1 -0
- package/dist/lib/ai-model/prompt/yaml-generator.js +280 -0
- package/dist/lib/ai-model/prompt/yaml-generator.js.map +1 -0
- package/dist/lib/ai-model/service-caller/index.js +531 -0
- package/dist/lib/ai-model/service-caller/index.js.map +1 -0
- package/dist/lib/ai-model/ui-tars-planning.js +283 -0
- package/dist/lib/ai-model/ui-tars-planning.js.map +1 -0
- package/dist/lib/common.js +480 -0
- package/dist/lib/common.js.map +1 -0
- package/dist/lib/device/device-options.js +20 -0
- package/dist/lib/device/device-options.js.map +1 -0
- package/dist/lib/device/index.js +418 -0
- package/dist/lib/device/index.js.map +1 -0
- package/dist/lib/dump/html-utils.js +281 -0
- package/dist/lib/dump/html-utils.js.map +1 -0
- package/dist/lib/dump/image-restoration.js +77 -0
- package/dist/lib/dump/image-restoration.js.map +1 -0
- package/dist/lib/dump/index.js +60 -0
- package/dist/lib/dump/index.js.map +1 -0
- package/dist/lib/index.js +146 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/report-generator.js +172 -0
- package/dist/lib/report-generator.js.map +1 -0
- package/dist/lib/report.js +145 -0
- package/dist/lib/report.js.map +1 -0
- package/dist/lib/screenshot-item.js +139 -0
- package/dist/lib/screenshot-item.js.map +1 -0
- package/dist/lib/service/index.js +290 -0
- package/dist/lib/service/index.js.map +1 -0
- package/dist/lib/service/utils.js +49 -0
- package/dist/lib/service/utils.js.map +1 -0
- package/dist/lib/skill/index.js +72 -0
- package/dist/lib/skill/index.js.map +1 -0
- package/dist/lib/task-runner.js +295 -0
- package/dist/lib/task-runner.js.map +1 -0
- package/dist/lib/task-timing.js +46 -0
- package/dist/lib/task-timing.js.map +1 -0
- package/dist/lib/tree.js +53 -0
- package/dist/lib/tree.js.map +1 -0
- package/dist/lib/types.js +285 -0
- package/dist/lib/types.js.map +1 -0
- package/dist/lib/utils.js +297 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/lib/yaml/builder.js +57 -0
- package/dist/lib/yaml/builder.js.map +1 -0
- package/dist/lib/yaml/index.js +81 -0
- package/dist/lib/yaml/index.js.map +1 -0
- package/dist/lib/yaml/player.js +452 -0
- package/dist/lib/yaml/player.js.map +1 -0
- package/dist/lib/yaml/utils.js +126 -0
- package/dist/lib/yaml/utils.js.map +1 -0
- package/dist/lib/yaml.js +20 -0
- package/dist/lib/yaml.js.map +1 -0
- package/dist/types/agent/agent.d.ts +190 -0
- package/dist/types/agent/common.d.ts +0 -0
- package/dist/types/agent/execution-session.d.ts +36 -0
- package/dist/types/agent/index.d.ts +10 -0
- package/dist/types/agent/task-builder.d.ts +34 -0
- package/dist/types/agent/task-cache.d.ts +48 -0
- package/dist/types/agent/tasks.d.ts +70 -0
- package/dist/types/agent/ui-utils.d.ts +14 -0
- package/dist/types/agent/utils.d.ts +29 -0
- package/dist/types/ai-model/auto-glm/actions.d.ts +77 -0
- package/dist/types/ai-model/auto-glm/index.d.ts +6 -0
- package/dist/types/ai-model/auto-glm/parser.d.ts +18 -0
- package/dist/types/ai-model/auto-glm/planning.d.ts +10 -0
- package/dist/types/ai-model/auto-glm/prompt.d.ts +27 -0
- package/dist/types/ai-model/auto-glm/util.d.ts +13 -0
- package/dist/types/ai-model/conversation-history.d.ts +105 -0
- package/dist/types/ai-model/index.d.ts +14 -0
- package/dist/types/ai-model/inspect.d.ts +58 -0
- package/dist/types/ai-model/llm-planning.d.ts +19 -0
- package/dist/types/ai-model/prompt/common.d.ts +2 -0
- package/dist/types/ai-model/prompt/describe.d.ts +1 -0
- package/dist/types/ai-model/prompt/extraction.d.ts +7 -0
- package/dist/types/ai-model/prompt/llm-locator.d.ts +3 -0
- package/dist/types/ai-model/prompt/llm-planning.d.ts +10 -0
- package/dist/types/ai-model/prompt/llm-section-locator.d.ts +3 -0
- package/dist/types/ai-model/prompt/order-sensitive-judge.d.ts +2 -0
- package/dist/types/ai-model/prompt/playwright-generator.d.ts +26 -0
- package/dist/types/ai-model/prompt/ui-tars-planning.d.ts +2 -0
- package/dist/types/ai-model/prompt/util.d.ts +33 -0
- package/dist/types/ai-model/prompt/yaml-generator.d.ts +100 -0
- package/dist/types/ai-model/service-caller/index.d.ts +49 -0
- package/dist/types/ai-model/ui-tars-planning.d.ts +72 -0
- package/dist/types/common.d.ts +288 -0
- package/dist/types/device/device-options.d.ts +142 -0
- package/dist/types/device/index.d.ts +2315 -0
- package/dist/types/dump/html-utils.d.ts +52 -0
- package/dist/types/dump/image-restoration.d.ts +6 -0
- package/dist/types/dump/index.d.ts +5 -0
- package/dist/types/index.d.ts +17 -0
- package/dist/types/report-generator.d.ts +48 -0
- package/dist/types/report.d.ts +15 -0
- package/dist/types/screenshot-item.d.ts +66 -0
- package/dist/types/service/index.d.ts +23 -0
- package/dist/types/service/utils.d.ts +2 -0
- package/dist/types/skill/index.d.ts +25 -0
- package/dist/types/task-runner.d.ts +48 -0
- package/dist/types/task-timing.d.ts +8 -0
- package/dist/types/tree.d.ts +4 -0
- package/dist/types/types.d.ts +645 -0
- package/dist/types/utils.d.ts +40 -0
- package/dist/types/yaml/builder.d.ts +2 -0
- package/dist/types/yaml/index.d.ts +4 -0
- package/dist/types/yaml/player.d.ts +34 -0
- package/dist/types/yaml/utils.d.ts +9 -0
- package/dist/types/yaml.d.ts +203 -0
- package/package.json +111 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yaml/player.js","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../../src/yaml/player.ts"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import { existsSync, mkdirSync, writeFileSync } from 'node:fs';\nimport { basename, dirname, join, resolve } from 'node:path';\nimport { assert, ifInBrowser, ifInWorker } from '@midscene/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 '@midscene/shared/common';\nimport { getDebug } from '@midscene/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};\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 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\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 } else 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 === '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 {\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":["__webpack_require__","definition","key","Object","obj","prop","Symbol","debug","getDebug","aiTaskHandlerMap","isStringParamSchema","schema","schemaDef","z","options","Array","option","ScriptPlayer","value","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","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","parseResult","resultName","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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"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __webpack_require__ = {};
|
|
3
|
+
(()=>{
|
|
4
|
+
__webpack_require__.n = (module)=>{
|
|
5
|
+
var getter = module && module.__esModule ? ()=>module['default'] : ()=>module;
|
|
6
|
+
__webpack_require__.d(getter, {
|
|
7
|
+
a: getter
|
|
8
|
+
});
|
|
9
|
+
return getter;
|
|
10
|
+
};
|
|
11
|
+
})();
|
|
12
|
+
(()=>{
|
|
13
|
+
__webpack_require__.d = (exports1, definition)=>{
|
|
14
|
+
for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
|
|
15
|
+
enumerable: true,
|
|
16
|
+
get: definition[key]
|
|
17
|
+
});
|
|
18
|
+
};
|
|
19
|
+
})();
|
|
20
|
+
(()=>{
|
|
21
|
+
__webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
|
|
22
|
+
})();
|
|
23
|
+
(()=>{
|
|
24
|
+
__webpack_require__.r = (exports1)=>{
|
|
25
|
+
if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
|
|
26
|
+
value: 'Module'
|
|
27
|
+
});
|
|
28
|
+
Object.defineProperty(exports1, '__esModule', {
|
|
29
|
+
value: true
|
|
30
|
+
});
|
|
31
|
+
};
|
|
32
|
+
})();
|
|
33
|
+
var __webpack_exports__ = {};
|
|
34
|
+
__webpack_require__.r(__webpack_exports__);
|
|
35
|
+
__webpack_require__.d(__webpack_exports__, {
|
|
36
|
+
buildDetailedLocateParam: ()=>buildDetailedLocateParam,
|
|
37
|
+
buildDetailedLocateParamAndRestParams: ()=>buildDetailedLocateParamAndRestParams,
|
|
38
|
+
parseYamlScript: ()=>parseYamlScript,
|
|
39
|
+
interpolateEnvVars: ()=>interpolateEnvVars
|
|
40
|
+
});
|
|
41
|
+
const logger_namespaceObject = require("@midscene/shared/logger");
|
|
42
|
+
const utils_namespaceObject = require("@midscene/shared/utils");
|
|
43
|
+
const external_js_yaml_namespaceObject = require("js-yaml");
|
|
44
|
+
var external_js_yaml_default = /*#__PURE__*/ __webpack_require__.n(external_js_yaml_namespaceObject);
|
|
45
|
+
const debugUtils = (0, logger_namespaceObject.getDebug)('yaml:utils');
|
|
46
|
+
function interpolateEnvVars(content) {
|
|
47
|
+
const lines = content.split('\n');
|
|
48
|
+
const processedLines = lines.map((line)=>{
|
|
49
|
+
const trimmedLine = line.trimStart();
|
|
50
|
+
if (trimmedLine.startsWith('#')) return line;
|
|
51
|
+
return line.replace(/\$\{([^}]+)\}/g, (_, envVar)=>{
|
|
52
|
+
const value = process.env[envVar.trim()];
|
|
53
|
+
if (void 0 === value) throw new Error(`Environment variable "${envVar.trim()}" is not defined`);
|
|
54
|
+
return value;
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
return processedLines.join('\n');
|
|
58
|
+
}
|
|
59
|
+
function parseYamlScript(content, filePath) {
|
|
60
|
+
let processedContent = content;
|
|
61
|
+
if (-1 !== content.indexOf('android') && content.match(/deviceId:\s*(\d+)/)) {
|
|
62
|
+
let matchedDeviceId;
|
|
63
|
+
processedContent = content.replace(/deviceId:\s*(\d+)/g, (match, deviceId)=>{
|
|
64
|
+
matchedDeviceId = deviceId;
|
|
65
|
+
return `deviceId: '${deviceId}'`;
|
|
66
|
+
});
|
|
67
|
+
console.warn(`please use string-style deviceId in yaml script, for example: deviceId: "${matchedDeviceId}"`);
|
|
68
|
+
}
|
|
69
|
+
const interpolatedContent = interpolateEnvVars(processedContent);
|
|
70
|
+
const obj = external_js_yaml_default().load(interpolatedContent, {
|
|
71
|
+
schema: external_js_yaml_default().JSON_SCHEMA
|
|
72
|
+
});
|
|
73
|
+
const pathTip = filePath ? `, failed to load ${filePath}` : '';
|
|
74
|
+
(0, utils_namespaceObject.assert)(obj.tasks, `property "tasks" is required in yaml script ${pathTip}`);
|
|
75
|
+
(0, utils_namespaceObject.assert)(Array.isArray(obj.tasks), `property "tasks" must be an array in yaml script, but got ${obj.tasks}`);
|
|
76
|
+
return obj;
|
|
77
|
+
}
|
|
78
|
+
function buildDetailedLocateParam(locatePrompt, opt) {
|
|
79
|
+
debugUtils('will call buildDetailedLocateParam', locatePrompt, opt);
|
|
80
|
+
let prompt = locatePrompt || opt?.prompt || opt?.locate;
|
|
81
|
+
let deepLocate = false;
|
|
82
|
+
let cacheable = true;
|
|
83
|
+
let xpath;
|
|
84
|
+
if ('object' == typeof opt && null !== opt) {
|
|
85
|
+
deepLocate = opt.deepLocate ?? opt.deepThink ?? false;
|
|
86
|
+
cacheable = opt.cacheable ?? true;
|
|
87
|
+
xpath = opt.xpath;
|
|
88
|
+
if (locatePrompt && opt.prompt && locatePrompt !== opt.prompt) console.warn('conflict prompt for item', locatePrompt, opt, 'maybe you put the prompt in the wrong place');
|
|
89
|
+
prompt = prompt || opt.prompt;
|
|
90
|
+
}
|
|
91
|
+
if (!prompt) return void debugUtils('no prompt, will return undefined in buildDetailedLocateParam', opt);
|
|
92
|
+
return {
|
|
93
|
+
prompt,
|
|
94
|
+
deepLocate,
|
|
95
|
+
cacheable,
|
|
96
|
+
xpath
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
function buildDetailedLocateParamAndRestParams(locatePrompt, opt, excludeKeys = []) {
|
|
100
|
+
const locateParam = buildDetailedLocateParam(locatePrompt, opt);
|
|
101
|
+
const restParams = {};
|
|
102
|
+
if ('object' == typeof opt && null !== opt) {
|
|
103
|
+
const allKeys = Object.keys(opt);
|
|
104
|
+
const locateParamKeys = Object.keys(locateParam || {});
|
|
105
|
+
for (const key of allKeys)if (!locateParamKeys.includes(key) && !excludeKeys.includes(key) && 'locate' !== key) restParams[key] = opt[key];
|
|
106
|
+
}
|
|
107
|
+
return {
|
|
108
|
+
locateParam,
|
|
109
|
+
restParams
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
exports.buildDetailedLocateParam = __webpack_exports__.buildDetailedLocateParam;
|
|
113
|
+
exports.buildDetailedLocateParamAndRestParams = __webpack_exports__.buildDetailedLocateParamAndRestParams;
|
|
114
|
+
exports.interpolateEnvVars = __webpack_exports__.interpolateEnvVars;
|
|
115
|
+
exports.parseYamlScript = __webpack_exports__.parseYamlScript;
|
|
116
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
117
|
+
"buildDetailedLocateParam",
|
|
118
|
+
"buildDetailedLocateParamAndRestParams",
|
|
119
|
+
"interpolateEnvVars",
|
|
120
|
+
"parseYamlScript"
|
|
121
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
122
|
+
Object.defineProperty(exports, '__esModule', {
|
|
123
|
+
value: true
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yaml/utils.js","sources":["webpack/runtime/compat_get_default_export","webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../../src/yaml/utils.ts"],"sourcesContent":["// getDefaultExport function for compatibility with non-ESM modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};\n","__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import type { TUserPrompt } from '@/common';\nimport type {\n DetailedLocateParam,\n LocateOption,\n MidsceneYamlScript,\n} from '@/types';\nimport { getDebug } from '@midscene/shared/logger';\nimport { assert } from '@midscene/shared/utils';\nimport yaml from 'js-yaml';\n\nconst debugUtils = getDebug('yaml:utils');\n\nexport function interpolateEnvVars(content: string): string {\n // Process line by line to skip commented lines\n const lines = content.split('\\n');\n const processedLines = lines.map((line) => {\n // Check if the line is a YAML comment (starts with # after optional whitespace)\n const trimmedLine = line.trimStart();\n if (trimmedLine.startsWith('#')) {\n // Skip interpolation for comment lines\n return line;\n }\n\n // Process environment variables for non-comment lines\n return line.replace(/\\$\\{([^}]+)\\}/g, (_, envVar) => {\n const value = process.env[envVar.trim()];\n if (value === undefined) {\n throw new Error(\n `Environment variable \"${envVar.trim()}\" is not defined`,\n );\n }\n return value;\n });\n });\n\n return processedLines.join('\\n');\n}\n\nexport function parseYamlScript(\n content: string,\n filePath?: string,\n): MidsceneYamlScript {\n let processedContent = content;\n if (content.indexOf('android') !== -1 && content.match(/deviceId:\\s*(\\d+)/)) {\n let matchedDeviceId;\n processedContent = content.replace(\n /deviceId:\\s*(\\d+)/g,\n (match, deviceId) => {\n matchedDeviceId = deviceId;\n return `deviceId: '${deviceId}'`;\n },\n );\n console.warn(\n `please use string-style deviceId in yaml script, for example: deviceId: \"${matchedDeviceId}\"`,\n );\n }\n const interpolatedContent = interpolateEnvVars(processedContent);\n const obj = yaml.load(interpolatedContent, {\n schema: yaml.JSON_SCHEMA,\n }) as MidsceneYamlScript;\n\n const pathTip = filePath ? `, failed to load ${filePath}` : '';\n assert(obj.tasks, `property \"tasks\" is required in yaml script ${pathTip}`);\n assert(\n Array.isArray(obj.tasks),\n `property \"tasks\" must be an array in yaml script, but got ${obj.tasks}`,\n );\n return obj;\n}\n\nexport function buildDetailedLocateParam(\n locatePrompt: TUserPrompt,\n opt?: LocateOption,\n): DetailedLocateParam | undefined {\n debugUtils('will call buildDetailedLocateParam', locatePrompt, opt);\n let prompt = locatePrompt || opt?.prompt || (opt as any)?.locate; // as a shortcut\n let deepLocate = false;\n let cacheable = true;\n let xpath = undefined;\n\n if (typeof opt === 'object' && opt !== null) {\n // Backward-compatible: accept `deepThink` as a deprecated alias for `deepLocate`.\n // All downstream code works on `deepLocate` only; the compatibility resolution\n // is intentionally kept here at the entry point so it does not bleed through\n // the rest of the call stack.\n deepLocate = opt.deepLocate ?? opt.deepThink ?? false;\n cacheable = opt.cacheable ?? true;\n xpath = opt.xpath;\n if (locatePrompt && opt.prompt && locatePrompt !== opt.prompt) {\n console.warn(\n 'conflict prompt for item',\n locatePrompt,\n opt,\n 'maybe you put the prompt in the wrong place',\n );\n }\n prompt = prompt || opt.prompt;\n }\n\n if (!prompt) {\n debugUtils(\n 'no prompt, will return undefined in buildDetailedLocateParam',\n opt,\n );\n return undefined;\n }\n\n return {\n prompt,\n deepLocate,\n cacheable,\n xpath,\n };\n}\n\nexport function buildDetailedLocateParamAndRestParams(\n locatePrompt: TUserPrompt,\n opt: LocateOption | undefined,\n excludeKeys: string[] = [],\n): {\n locateParam: DetailedLocateParam | undefined;\n restParams: Record<string, any>;\n} {\n const locateParam = buildDetailedLocateParam(locatePrompt, opt);\n\n // Extract all keys from opt except the ones already included in locateParam\n const restParams: Record<string, any> = {};\n\n if (typeof opt === 'object' && opt !== null) {\n // Get all keys from opt\n const allKeys = Object.keys(opt);\n\n // Keys already included in locateParam: prompt, deepLocate, cacheable, xpath\n const locateParamKeys = Object.keys(locateParam || {});\n\n // Extract all other keys\n for (const key of allKeys) {\n if (\n !locateParamKeys.includes(key) &&\n !excludeKeys.includes(key) &&\n key !== 'locate'\n ) {\n restParams[key] = opt[key as keyof LocateOption];\n }\n }\n }\n\n return {\n locateParam,\n restParams,\n };\n}\n"],"names":["__webpack_require__","module","getter","definition","key","Object","obj","prop","Symbol","debugUtils","getDebug","interpolateEnvVars","content","lines","processedLines","line","trimmedLine","_","envVar","value","process","undefined","Error","parseYamlScript","filePath","processedContent","matchedDeviceId","match","deviceId","console","interpolatedContent","yaml","pathTip","assert","Array","buildDetailedLocateParam","locatePrompt","opt","prompt","deepLocate","cacheable","xpath","buildDetailedLocateParamAndRestParams","excludeKeys","locateParam","restParams","allKeys","locateParamKeys"],"mappings":"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"}
|
package/dist/lib/yaml.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __webpack_require__ = {};
|
|
3
|
+
(()=>{
|
|
4
|
+
__webpack_require__.r = (exports1)=>{
|
|
5
|
+
if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
|
|
6
|
+
value: 'Module'
|
|
7
|
+
});
|
|
8
|
+
Object.defineProperty(exports1, '__esModule', {
|
|
9
|
+
value: true
|
|
10
|
+
});
|
|
11
|
+
};
|
|
12
|
+
})();
|
|
13
|
+
var __webpack_exports__ = {};
|
|
14
|
+
__webpack_require__.r(__webpack_exports__);
|
|
15
|
+
for(var __rspack_i in __webpack_exports__)exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
16
|
+
Object.defineProperty(exports, '__esModule', {
|
|
17
|
+
value: true
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
//# sourceMappingURL=yaml.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yaml.js","sources":["webpack/runtime/make_namespace_object"],"sourcesContent":["// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};"],"names":["__webpack_require__","Symbol","Object"],"mappings":";;;IACAA,oBAAoB,CAAC,GAAG,CAAC;QACxB,IAAG,AAAkB,eAAlB,OAAOC,UAA0BA,OAAO,WAAW,EACrDC,OAAO,cAAc,CAAC,UAASD,OAAO,WAAW,EAAE;YAAE,OAAO;QAAS;QAEtEC,OAAO,cAAc,CAAC,UAAS,cAAc;YAAE,OAAO;QAAK;IAC5D"}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import type { TUserPrompt } from '../ai-model/index';
|
|
2
|
+
import Service from '../service/index';
|
|
3
|
+
import { type ActionParam, type ActionReturn, type AgentAssertOpt, type AgentDescribeElementAtPointResult, type AgentOpt, type AgentWaitForOpt, type DeepThinkOption, type DeviceAction, ExecutionDump, GroupedActionDump, type LocateOption, type LocateResultElement, type LocateValidatorResult, type LocatorValidatorOption, type OnTaskStartTip, type ScrollParam, type ServiceAction, type ServiceExtractOption, type ServiceExtractParam, type UIContext } from '../types';
|
|
4
|
+
export type TestStatus = 'passed' | 'failed' | 'timedOut' | 'skipped' | 'interrupted';
|
|
5
|
+
import type { AbstractInterface } from '../device';
|
|
6
|
+
import type { TaskRunner } from '../task-runner';
|
|
7
|
+
import { ModelConfigManager } from '@midscene/shared/env';
|
|
8
|
+
import { TaskCache } from './task-cache';
|
|
9
|
+
import { TaskExecutor } from './tasks';
|
|
10
|
+
export type AiActOptions = {
|
|
11
|
+
cacheable?: boolean;
|
|
12
|
+
fileChooserAccept?: string | string[];
|
|
13
|
+
deepThink?: DeepThinkOption;
|
|
14
|
+
deepLocate?: boolean;
|
|
15
|
+
abortSignal?: AbortSignal;
|
|
16
|
+
};
|
|
17
|
+
export declare class Agent<InterfaceType extends AbstractInterface = AbstractInterface> {
|
|
18
|
+
interface: InterfaceType;
|
|
19
|
+
service: Service;
|
|
20
|
+
dump: GroupedActionDump;
|
|
21
|
+
reportFile?: string | null;
|
|
22
|
+
reportFileName?: string;
|
|
23
|
+
taskExecutor: TaskExecutor;
|
|
24
|
+
opts: AgentOpt;
|
|
25
|
+
/**
|
|
26
|
+
* If true, the agent will not perform any actions
|
|
27
|
+
*/
|
|
28
|
+
dryMode: boolean;
|
|
29
|
+
onTaskStartTip?: OnTaskStartTip;
|
|
30
|
+
taskCache?: TaskCache;
|
|
31
|
+
private dumpUpdateListeners;
|
|
32
|
+
get onDumpUpdate(): ((dump: string, executionDump?: ExecutionDump) => void) | undefined;
|
|
33
|
+
set onDumpUpdate(callback: ((dump: string, executionDump?: ExecutionDump) => void) | undefined);
|
|
34
|
+
destroyed: boolean;
|
|
35
|
+
modelConfigManager: ModelConfigManager;
|
|
36
|
+
/**
|
|
37
|
+
* Frozen page context for consistent AI operations
|
|
38
|
+
*/
|
|
39
|
+
private frozenUIContext?;
|
|
40
|
+
private get aiActContext();
|
|
41
|
+
/**
|
|
42
|
+
* Flag to track if VL model warning has been shown
|
|
43
|
+
*/
|
|
44
|
+
private hasWarnedNonVLModel;
|
|
45
|
+
private executionDumpIndexByRunner;
|
|
46
|
+
private fullActionSpace;
|
|
47
|
+
private reportGenerator;
|
|
48
|
+
get page(): InterfaceType;
|
|
49
|
+
/**
|
|
50
|
+
* Ensures VL model warning is shown once when needed
|
|
51
|
+
*/
|
|
52
|
+
private ensureVLModelWarning;
|
|
53
|
+
private resolveReplanningCycleLimit;
|
|
54
|
+
constructor(interfaceInstance: InterfaceType, opts?: AgentOpt);
|
|
55
|
+
getActionSpace(): Promise<DeviceAction[]>;
|
|
56
|
+
getUIContext(action?: ServiceAction): Promise<UIContext>;
|
|
57
|
+
_snapshotContext(): Promise<UIContext>;
|
|
58
|
+
/**
|
|
59
|
+
* @deprecated Use {@link setAIActContext} instead.
|
|
60
|
+
*/
|
|
61
|
+
setAIActionContext(prompt: string): Promise<void>;
|
|
62
|
+
setAIActContext(prompt: string): Promise<void>;
|
|
63
|
+
resetDump(): GroupedActionDump;
|
|
64
|
+
appendExecutionDump(execution: ExecutionDump, runner?: TaskRunner): void;
|
|
65
|
+
dumpDataString(opt?: {
|
|
66
|
+
inlineScreenshots?: boolean;
|
|
67
|
+
}): string;
|
|
68
|
+
reportHTMLString(opt?: {
|
|
69
|
+
inlineScreenshots?: boolean;
|
|
70
|
+
}): string;
|
|
71
|
+
writeOutActionDumps(): void;
|
|
72
|
+
private callbackOnTaskStartTip;
|
|
73
|
+
wrapActionInActionSpace<T extends DeviceAction>(name: string): (param: ActionParam<T>) => Promise<ActionReturn<T>>;
|
|
74
|
+
callActionInActionSpace<T = any>(type: string, opt?: T): Promise<any>;
|
|
75
|
+
aiTap(locatePrompt: TUserPrompt, opt?: LocateOption & {
|
|
76
|
+
fileChooserAccept?: string | string[];
|
|
77
|
+
}): Promise<any>;
|
|
78
|
+
aiRightClick(locatePrompt: TUserPrompt, opt?: LocateOption): Promise<any>;
|
|
79
|
+
aiDoubleClick(locatePrompt: TUserPrompt, opt?: LocateOption): Promise<any>;
|
|
80
|
+
aiHover(locatePrompt: TUserPrompt, opt?: LocateOption): Promise<any>;
|
|
81
|
+
aiInput(locatePrompt: TUserPrompt, opt: LocateOption & {
|
|
82
|
+
value: string | number;
|
|
83
|
+
} & {
|
|
84
|
+
autoDismissKeyboard?: boolean;
|
|
85
|
+
} & {
|
|
86
|
+
mode?: 'replace' | 'clear' | 'typeOnly' | 'append';
|
|
87
|
+
}): Promise<any>;
|
|
88
|
+
/**
|
|
89
|
+
* @deprecated Use aiInput(locatePrompt, opt) instead where opt contains the value
|
|
90
|
+
*/
|
|
91
|
+
aiInput(value: string | number, locatePrompt: TUserPrompt, opt?: LocateOption & {
|
|
92
|
+
autoDismissKeyboard?: boolean;
|
|
93
|
+
} & {
|
|
94
|
+
mode?: 'replace' | 'clear' | 'typeOnly' | 'append';
|
|
95
|
+
}): Promise<any>;
|
|
96
|
+
aiKeyboardPress(locatePrompt: TUserPrompt, opt: LocateOption & {
|
|
97
|
+
keyName: string;
|
|
98
|
+
}): Promise<any>;
|
|
99
|
+
/**
|
|
100
|
+
* @deprecated Use aiKeyboardPress(locatePrompt, opt) instead where opt contains the keyName
|
|
101
|
+
*/
|
|
102
|
+
aiKeyboardPress(keyName: string, locatePrompt?: TUserPrompt, opt?: LocateOption): Promise<any>;
|
|
103
|
+
aiScroll(locatePrompt: TUserPrompt | undefined, opt: LocateOption & ScrollParam): Promise<any>;
|
|
104
|
+
/**
|
|
105
|
+
* @deprecated Use aiScroll(locatePrompt, opt) instead where opt contains the scroll parameters
|
|
106
|
+
*/
|
|
107
|
+
aiScroll(scrollParam: ScrollParam, locatePrompt?: TUserPrompt, opt?: LocateOption): Promise<any>;
|
|
108
|
+
aiAct(taskPrompt: string, opt?: AiActOptions): Promise<string | undefined>;
|
|
109
|
+
/**
|
|
110
|
+
* @deprecated Use {@link Agent.aiAct} instead.
|
|
111
|
+
*/
|
|
112
|
+
aiAction(taskPrompt: string, opt?: AiActOptions): Promise<string | undefined>;
|
|
113
|
+
aiQuery<ReturnType = any>(demand: ServiceExtractParam, opt?: ServiceExtractOption): Promise<ReturnType>;
|
|
114
|
+
aiBoolean(prompt: TUserPrompt, opt?: ServiceExtractOption): Promise<boolean>;
|
|
115
|
+
aiNumber(prompt: TUserPrompt, opt?: ServiceExtractOption): Promise<number>;
|
|
116
|
+
aiString(prompt: TUserPrompt, opt?: ServiceExtractOption): Promise<string>;
|
|
117
|
+
aiAsk(prompt: TUserPrompt, opt?: ServiceExtractOption): Promise<string>;
|
|
118
|
+
describeElementAtPoint(center: [number, number], opt?: {
|
|
119
|
+
verifyPrompt?: boolean;
|
|
120
|
+
retryLimit?: number;
|
|
121
|
+
deepLocate?: boolean;
|
|
122
|
+
} & LocatorValidatorOption): Promise<AgentDescribeElementAtPointResult>;
|
|
123
|
+
verifyLocator(prompt: string, locateOpt: LocateOption | undefined, expectCenter: [number, number], verifyLocateOption?: LocatorValidatorOption): Promise<LocateValidatorResult>;
|
|
124
|
+
aiLocate(prompt: TUserPrompt, opt?: LocateOption): Promise<Pick<LocateResultElement, "rect" | "center">>;
|
|
125
|
+
aiAssert(assertion: TUserPrompt, msg?: string, opt?: AgentAssertOpt & ServiceExtractOption): Promise<{
|
|
126
|
+
pass: boolean;
|
|
127
|
+
thought: string | undefined;
|
|
128
|
+
message: string | undefined;
|
|
129
|
+
} | undefined>;
|
|
130
|
+
aiWaitFor(assertion: TUserPrompt, opt?: AgentWaitForOpt): Promise<void>;
|
|
131
|
+
ai(...args: Parameters<typeof this.aiAct>): Promise<string | undefined>;
|
|
132
|
+
runYaml(yamlScriptContent: string): Promise<{
|
|
133
|
+
result: Record<string, any>;
|
|
134
|
+
}>;
|
|
135
|
+
evaluateJavaScript(script: string): Promise<any>;
|
|
136
|
+
/**
|
|
137
|
+
* Add a dump update listener
|
|
138
|
+
* @param listener Listener function
|
|
139
|
+
* @returns A remove function that can be called to remove this listener
|
|
140
|
+
*/
|
|
141
|
+
addDumpUpdateListener(listener: (dump: string, executionDump?: ExecutionDump) => void): () => void;
|
|
142
|
+
/**
|
|
143
|
+
* Remove a dump update listener
|
|
144
|
+
* @param listener The listener function to remove
|
|
145
|
+
*/
|
|
146
|
+
removeDumpUpdateListener(listener: (dump: string, executionDump?: ExecutionDump) => void): void;
|
|
147
|
+
/**
|
|
148
|
+
* Clear all dump update listeners
|
|
149
|
+
*/
|
|
150
|
+
clearDumpUpdateListeners(): void;
|
|
151
|
+
destroy(): Promise<void>;
|
|
152
|
+
recordToReport(title?: string, opt?: {
|
|
153
|
+
content: string;
|
|
154
|
+
}): Promise<void>;
|
|
155
|
+
/**
|
|
156
|
+
* @deprecated Use {@link Agent.recordToReport} instead.
|
|
157
|
+
*/
|
|
158
|
+
logScreenshot(title?: string, opt?: {
|
|
159
|
+
content: string;
|
|
160
|
+
}): Promise<void>;
|
|
161
|
+
_unstableLogContent(): {
|
|
162
|
+
groupName: string;
|
|
163
|
+
groupDescription: string | undefined;
|
|
164
|
+
executions: ExecutionDump[];
|
|
165
|
+
};
|
|
166
|
+
/**
|
|
167
|
+
* Freezes the current page context to be reused in subsequent AI operations
|
|
168
|
+
* This avoids recalculating page context for each operation
|
|
169
|
+
*/
|
|
170
|
+
freezePageContext(): Promise<void>;
|
|
171
|
+
/**
|
|
172
|
+
* Unfreezes the page context, allowing AI operations to calculate context dynamically
|
|
173
|
+
*/
|
|
174
|
+
unfreezePageContext(): Promise<void>;
|
|
175
|
+
/**
|
|
176
|
+
* Process cache configuration and return normalized cache settings
|
|
177
|
+
*/
|
|
178
|
+
private processCacheConfig;
|
|
179
|
+
private normalizeFilePaths;
|
|
180
|
+
private normalizeFileInput;
|
|
181
|
+
/**
|
|
182
|
+
* Manually flush cache to file
|
|
183
|
+
* @param options - Optional configuration
|
|
184
|
+
* @param options.cleanUnused - If true, removes unused cache records before flushing
|
|
185
|
+
*/
|
|
186
|
+
flushCache(options?: {
|
|
187
|
+
cleanUnused?: boolean;
|
|
188
|
+
}): Promise<void>;
|
|
189
|
+
}
|
|
190
|
+
export declare const createAgent: (interfaceInstance: AbstractInterface, opts?: AgentOpt) => Agent<AbstractInterface>;
|
|
File without changes
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { type TaskExecutionError, TaskRunner } from '../task-runner';
|
|
2
|
+
import type { ExecutionTaskApply, ExecutionTaskProgressOptions, UIContext } from '../types';
|
|
3
|
+
type ExecutionSessionOptions = ExecutionTaskProgressOptions & {
|
|
4
|
+
tasks?: ExecutionTaskApply[];
|
|
5
|
+
onTaskUpdate?: (runner: TaskRunner, error?: TaskExecutionError) => Promise<void> | void;
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Thin wrapper around {@link TaskRunner} that represents a single linear execution run.
|
|
9
|
+
*/
|
|
10
|
+
export declare class ExecutionSession {
|
|
11
|
+
private readonly runner;
|
|
12
|
+
constructor(name: string, contextProvider: () => Promise<UIContext>, options?: ExecutionSessionOptions);
|
|
13
|
+
append(tasks: ExecutionTaskApply[] | ExecutionTaskApply, options?: {
|
|
14
|
+
allowWhenError?: boolean;
|
|
15
|
+
}): Promise<void>;
|
|
16
|
+
appendAndRun(tasks: ExecutionTaskApply[] | ExecutionTaskApply, options?: {
|
|
17
|
+
allowWhenError?: boolean;
|
|
18
|
+
}): Promise<{
|
|
19
|
+
output: any;
|
|
20
|
+
thought?: string;
|
|
21
|
+
} | undefined>;
|
|
22
|
+
run(options?: {
|
|
23
|
+
allowWhenError?: boolean;
|
|
24
|
+
}): Promise<{
|
|
25
|
+
output: any;
|
|
26
|
+
thought?: string;
|
|
27
|
+
} | undefined>;
|
|
28
|
+
isInErrorState(): boolean;
|
|
29
|
+
latestErrorTask(): import("../types").ExecutionTask | null;
|
|
30
|
+
appendErrorPlan(errorMsg: string): Promise<{
|
|
31
|
+
output: undefined;
|
|
32
|
+
runner: TaskRunner;
|
|
33
|
+
}>;
|
|
34
|
+
getRunner(): TaskRunner;
|
|
35
|
+
}
|
|
36
|
+
export {};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { Agent, createAgent } from './agent';
|
|
2
|
+
export { commonContextParser } from './utils';
|
|
3
|
+
export { getReportFileName, printReportMsg, } from './utils';
|
|
4
|
+
export { extractInsightParam, locateParamStr, paramStr, taskTitleStr, typeStr, } from './ui-utils';
|
|
5
|
+
export { type LocateCache, type PlanningCache, TaskCache } from './task-cache';
|
|
6
|
+
export { cacheFileExt } from './task-cache';
|
|
7
|
+
export { TaskExecutor } from './tasks';
|
|
8
|
+
export { getCurrentExecutionFile } from './utils';
|
|
9
|
+
export type { AgentOpt } from '../types';
|
|
10
|
+
export type { AiActOptions } from './agent';
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { AbstractInterface } from '../device';
|
|
2
|
+
import type Service from '../service';
|
|
3
|
+
import type { DetailedLocateParam, DeviceAction, ExecutionTaskApply, PlanningAction, PlanningLocateParam } from '../types';
|
|
4
|
+
import type { IModelConfig } from '@midscene/shared/env';
|
|
5
|
+
import type { TaskCache } from './task-cache';
|
|
6
|
+
export declare function locatePlanForLocate(param: string | DetailedLocateParam): PlanningAction<PlanningLocateParam>;
|
|
7
|
+
interface TaskBuilderDeps {
|
|
8
|
+
interfaceInstance: AbstractInterface;
|
|
9
|
+
service: Service;
|
|
10
|
+
taskCache?: TaskCache;
|
|
11
|
+
actionSpace: DeviceAction[];
|
|
12
|
+
waitAfterAction?: number;
|
|
13
|
+
}
|
|
14
|
+
interface BuildOptions {
|
|
15
|
+
cacheable?: boolean;
|
|
16
|
+
deepLocate?: boolean;
|
|
17
|
+
abortSignal?: AbortSignal;
|
|
18
|
+
}
|
|
19
|
+
export declare class TaskBuilder {
|
|
20
|
+
private readonly interface;
|
|
21
|
+
private readonly service;
|
|
22
|
+
private readonly taskCache?;
|
|
23
|
+
private readonly actionSpace;
|
|
24
|
+
private readonly waitAfterAction?;
|
|
25
|
+
constructor({ interfaceInstance, service, taskCache, actionSpace, waitAfterAction, }: TaskBuilderDeps);
|
|
26
|
+
build(plans: PlanningAction[], modelConfigForPlanning: IModelConfig, modelConfigForDefaultIntent: IModelConfig, options?: BuildOptions): Promise<{
|
|
27
|
+
tasks: ExecutionTaskApply[];
|
|
28
|
+
}>;
|
|
29
|
+
private handleFinishedPlan;
|
|
30
|
+
private handleLocatePlan;
|
|
31
|
+
private handleActionPlan;
|
|
32
|
+
private createLocateTask;
|
|
33
|
+
}
|
|
34
|
+
export {};
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { TUserPrompt } from '../ai-model';
|
|
2
|
+
import type { ElementCacheFeature } from '../types';
|
|
3
|
+
export declare const debug: import("@midscene/shared/logger").DebugFunction;
|
|
4
|
+
export interface PlanningCache {
|
|
5
|
+
type: 'plan';
|
|
6
|
+
prompt: string;
|
|
7
|
+
yamlWorkflow: string;
|
|
8
|
+
}
|
|
9
|
+
export interface LocateCache {
|
|
10
|
+
type: 'locate';
|
|
11
|
+
prompt: TUserPrompt;
|
|
12
|
+
cache?: ElementCacheFeature;
|
|
13
|
+
/** @deprecated kept for backward compatibility */
|
|
14
|
+
xpaths?: string[];
|
|
15
|
+
}
|
|
16
|
+
export interface MatchCacheResult<T extends PlanningCache | LocateCache> {
|
|
17
|
+
cacheContent: T;
|
|
18
|
+
updateFn: (cb: (cache: T) => void) => void;
|
|
19
|
+
}
|
|
20
|
+
export type CacheFileContent = {
|
|
21
|
+
midsceneVersion: string;
|
|
22
|
+
cacheId: string;
|
|
23
|
+
caches: Array<PlanningCache | LocateCache>;
|
|
24
|
+
};
|
|
25
|
+
export declare const cacheFileExt = ".cache.yaml";
|
|
26
|
+
export declare class TaskCache {
|
|
27
|
+
cacheId: string;
|
|
28
|
+
cacheFilePath?: string;
|
|
29
|
+
cache: CacheFileContent;
|
|
30
|
+
isCacheResultUsed: boolean;
|
|
31
|
+
cacheOriginalLength: number;
|
|
32
|
+
readOnlyMode: boolean;
|
|
33
|
+
writeOnlyMode: boolean;
|
|
34
|
+
private matchedCacheIndices;
|
|
35
|
+
constructor(cacheId: string, isCacheResultUsed: boolean, cacheFilePath?: string, options?: {
|
|
36
|
+
readOnly?: boolean;
|
|
37
|
+
writeOnly?: boolean;
|
|
38
|
+
});
|
|
39
|
+
matchCache(prompt: TUserPrompt, type: 'plan' | 'locate'): MatchCacheResult<PlanningCache | LocateCache> | undefined;
|
|
40
|
+
matchPlanCache(prompt: string): MatchCacheResult<PlanningCache> | undefined;
|
|
41
|
+
matchLocateCache(prompt: TUserPrompt): MatchCacheResult<LocateCache> | undefined;
|
|
42
|
+
appendCache(cache: PlanningCache | LocateCache): void;
|
|
43
|
+
loadCacheFromFile(): CacheFileContent | undefined;
|
|
44
|
+
flushCacheToFile(options?: {
|
|
45
|
+
cleanUnused?: boolean;
|
|
46
|
+
}): void;
|
|
47
|
+
updateOrAppendCacheRecord(newRecord: PlanningCache | LocateCache, cachedRecord?: MatchCacheResult<PlanningCache | LocateCache>): void;
|
|
48
|
+
}
|