@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":"utils.js","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../src/utils.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 { execFile } from 'node:child_process';\nimport * as fs from 'node:fs';\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport * as path from 'node:path';\nimport { promisify } from 'node:util';\nimport {\n defaultRunDirName,\n getMidsceneRunSubDir,\n} from '@midscene/shared/common';\nimport {\n MIDSCENE_CACHE,\n MIDSCENE_DEBUG_MODE,\n globalConfigManager,\n} from '@midscene/shared/env';\nimport { getRunningPkgInfo } from '@midscene/shared/node';\nimport { assert, logMsg } from '@midscene/shared/utils';\nimport {\n escapeScriptTag,\n ifInBrowser,\n ifInWorker,\n uuid,\n} from '@midscene/shared/utils';\nimport type { Cache, Rect, ReportDumpWithAttributes } from './types';\n\nlet logEnvReady = false;\n\nexport { appendFileSync } from 'node:fs';\n\nexport const groupedActionDumpFileExt = 'web-dump.json';\n\n/**\n * Process cache configuration with environment variable support and backward compatibility.\n *\n * @param cache - The original cache configuration\n * @param cacheId - The cache ID to use as:\n * 1. Fallback ID when cache is true or cache object has no ID\n * 2. Legacy cacheId when cache is undefined (requires MIDSCENE_CACHE env var)\n * @returns Processed cache configuration\n */\nexport function processCacheConfig(\n cache: Cache | undefined,\n cacheId: string,\n): Cache | undefined {\n // 1. New cache object configuration (highest priority)\n if (cache !== undefined) {\n if (cache === false) {\n return undefined; // Completely disable cache\n }\n\n if (cache === true) {\n // Auto-generate ID using cacheId for CLI/YAML scenarios\n // Agent will validate and reject this later if needed\n return { id: cacheId };\n }\n\n // cache is object configuration\n if (typeof cache === 'object' && cache !== null) {\n // Auto-generate ID using cacheId when missing (for CLI/YAML scenarios)\n if (!cache.id) {\n return { ...cache, id: cacheId };\n }\n return cache;\n }\n }\n\n // 2. Backward compatibility: support old cacheId (requires environment variable)\n // When cache is undefined, check if legacy cacheId mode is enabled via env var\n const envEnabled = globalConfigManager.getEnvConfigInBoolean(MIDSCENE_CACHE);\n\n if (envEnabled && cacheId) {\n return { id: cacheId };\n }\n\n // 3. No cache configuration\n return undefined;\n}\n\nconst reportInitializedMap = new Map<string, boolean>();\n\ndeclare const __DEV_REPORT_PATH__: string;\n\nexport function getReportTpl() {\n if (typeof __DEV_REPORT_PATH__ === 'string' && __DEV_REPORT_PATH__) {\n return fs.readFileSync(__DEV_REPORT_PATH__, 'utf-8');\n }\n const reportTpl = 'REPLACE_ME_WITH_REPORT_HTML';\n\n return reportTpl;\n}\n\n/**\n * high performance, insert script before </html> in HTML file\n * only truncate and append, no temporary file\n */\nexport function insertScriptBeforeClosingHtml(\n filePath: string,\n scriptContent: string,\n): void {\n const htmlEndTag = '</html>';\n const stat = fs.statSync(filePath);\n\n const readSize = Math.min(stat.size, 4096);\n const start = Math.max(0, stat.size - readSize);\n const buffer = Buffer.alloc(stat.size - start);\n const fd = fs.openSync(filePath, 'r');\n fs.readSync(fd, buffer, 0, buffer.length, start);\n fs.closeSync(fd);\n\n const tailStr = buffer.toString('utf8');\n const htmlEndIdx = tailStr.lastIndexOf(htmlEndTag);\n if (htmlEndIdx === -1) {\n throw new Error(`No </html> found in file:${filePath}`);\n }\n\n // calculate the correct byte position: char position to byte position\n const beforeHtmlInTail = tailStr.slice(0, htmlEndIdx);\n const htmlEndPos = start + Buffer.byteLength(beforeHtmlInTail, 'utf8');\n\n // truncate to </html> before\n fs.truncateSync(filePath, htmlEndPos);\n // append script and </html>\n fs.appendFileSync(filePath, `${scriptContent}\\n${htmlEndTag}\\n`);\n}\n\nexport function reportHTMLContent(\n dumpData: string | ReportDumpWithAttributes,\n reportPath?: string,\n appendReport?: boolean,\n withTpl = true, // whether return with report template, default = true\n): string {\n let tpl = '';\n if (withTpl) {\n tpl = getReportTpl();\n\n if (!tpl) {\n console.warn('reportTpl is not set, will not write report');\n return '';\n }\n }\n // if reportPath is set, it means we are in write to file mode\n const writeToFile = reportPath && !ifInBrowser;\n let dumpContent = '';\n\n if (typeof dumpData === 'string') {\n // do not use template string here, will cause bundle error\n dumpContent =\n // biome-ignore lint/style/useTemplate: <explanation>\n '<script type=\"midscene_web_dump\" type=\"application/json\">\\n' +\n escapeScriptTag(dumpData) +\n '\\n</script>';\n } else {\n const { dumpString, attributes } = dumpData;\n const attributesArr = Object.keys(attributes || {}).map((key) => {\n return `${key}=\"${encodeURIComponent(attributes![key])}\"`;\n });\n\n dumpContent =\n // do not use template string here, will cause bundle error\n // biome-ignore lint/style/useTemplate: <explanation>\n '<script type=\"midscene_web_dump\" type=\"application/json\" ' +\n attributesArr.join(' ') +\n '>\\n' +\n escapeScriptTag(dumpString) +\n '\\n</script>';\n }\n\n if (writeToFile) {\n if (!appendReport) {\n writeFileSync(reportPath!, tpl + dumpContent, { flag: 'w' });\n return reportPath!;\n }\n\n if (!reportInitializedMap.get(reportPath!)) {\n writeFileSync(reportPath!, tpl, { flag: 'w' });\n reportInitializedMap.set(reportPath!, true);\n }\n\n insertScriptBeforeClosingHtml(reportPath!, dumpContent);\n return reportPath!;\n }\n\n return tpl + dumpContent;\n}\n\nexport function writeDumpReport(\n fileName: string,\n dumpData: string | ReportDumpWithAttributes,\n appendReport?: boolean,\n): string | null {\n if (ifInBrowser || ifInWorker) {\n console.log('will not write report in browser');\n return null;\n }\n\n const reportPath = path.join(\n getMidsceneRunSubDir('report'),\n `${fileName}.html`,\n );\n\n reportHTMLContent(dumpData, reportPath, appendReport);\n\n if (process.env.MIDSCENE_DEBUG_LOG_JSON) {\n const jsonPath = `${reportPath}.json`;\n let data;\n\n if (typeof dumpData === 'string') {\n data = JSON.parse(dumpData) as ReportDumpWithAttributes;\n } else {\n data = dumpData;\n }\n\n writeFileSync(jsonPath, JSON.stringify(data, null, 2), {\n flag: appendReport ? 'a' : 'w',\n });\n\n logMsg(`Midscene - dump file written: ${jsonPath}`);\n }\n\n return reportPath;\n}\n\nexport function writeLogFile(opts: {\n fileName: string;\n fileExt: string;\n fileContent: string | ReportDumpWithAttributes;\n type: 'dump' | 'cache' | 'report' | 'tmp';\n generateReport?: boolean;\n appendReport?: boolean;\n}) {\n if (ifInBrowser || ifInWorker) {\n return '/mock/report.html';\n }\n const { fileName, fileExt, fileContent, type = 'dump' } = opts;\n const targetDir = getMidsceneRunSubDir(type);\n // Ensure directory exists\n if (!logEnvReady) {\n assert(targetDir, 'logDir should be set before writing dump file');\n\n // gitIgnore in the parent directory\n const gitIgnorePath = path.join(targetDir, '../../.gitignore');\n const gitPath = path.join(targetDir, '../../.git');\n let gitIgnoreContent = '';\n\n if (existsSync(gitPath)) {\n // if the git path exists, we need to add the log folder to the git ignore file\n if (existsSync(gitIgnorePath)) {\n gitIgnoreContent = readFileSync(gitIgnorePath, 'utf-8');\n }\n\n // ignore the log folder\n if (!gitIgnoreContent.includes(`${defaultRunDirName}/`)) {\n writeFileSync(\n gitIgnorePath,\n `${gitIgnoreContent}\\n# Midscene.js dump files\\n${defaultRunDirName}/dump\\n${defaultRunDirName}/report\\n${defaultRunDirName}/tmp\\n${defaultRunDirName}/log\\n`,\n 'utf-8',\n );\n }\n }\n\n logEnvReady = true;\n }\n\n const filePath = path.join(targetDir, `${fileName}.${fileExt}`);\n\n if (type !== 'dump') {\n // do not write dump file any more\n writeFileSync(filePath, JSON.stringify(fileContent));\n }\n\n if (opts?.generateReport) {\n return writeDumpReport(fileName, fileContent, opts.appendReport);\n }\n\n return filePath;\n}\n\nexport function getTmpDir(): string | null {\n try {\n const runningPkgInfo = getRunningPkgInfo();\n if (!runningPkgInfo) {\n return null;\n }\n const { name } = runningPkgInfo;\n const tmpPath = path.join(tmpdir(), name);\n mkdirSync(tmpPath, { recursive: true });\n return tmpPath;\n } catch (e) {\n return null;\n }\n}\n\nexport function getTmpFile(fileExtWithoutDot: string): string | null {\n if (ifInBrowser || ifInWorker) {\n return null;\n }\n const tmpDir = getTmpDir();\n const filename = `${uuid()}.${fileExtWithoutDot}`;\n return path.join(tmpDir!, filename);\n}\n\nexport function overlapped(container: Rect, target: Rect) {\n // container and the target have some part overlapped\n return (\n container.left < target.left + target.width &&\n container.left + container.width > target.left &&\n container.top < target.top + target.height &&\n container.top + container.height > target.top\n );\n}\n\nexport async function sleep(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function replacerForPageObject(_key: string, value: any) {\n if (value && value.constructor?.name === 'Page') {\n return '[Page object]';\n }\n if (value && value.constructor?.name === 'Browser') {\n return '[Browser object]';\n }\n // Handle ScreenshotItem serialization\n if (value && typeof value.toSerializable === 'function') {\n return value.toSerializable();\n }\n return value;\n}\n\nexport function stringifyDumpData(data: any, indents?: number) {\n return JSON.stringify(data, replacerForPageObject, indents);\n}\n\ndeclare const __VERSION__: string;\n\nexport function getVersion() {\n return __VERSION__;\n}\n\nfunction debugLog(...message: any[]) {\n // always read from process.env, and cannot be override by modelConfig, overrideAIConfig, etc.\n // also avoid circular dependency\n const debugMode = process.env[MIDSCENE_DEBUG_MODE];\n if (debugMode) {\n console.log('[Midscene]', ...message);\n }\n}\n\nlet gitInfoPromise: Promise<{ repoUrl: string; userEmail: string }> | null =\n null;\n\nfunction getGitInfoAsync(): Promise<{ repoUrl: string; userEmail: string }> {\n if (gitInfoPromise) return gitInfoPromise;\n\n const execFileAsync = promisify(execFile);\n\n gitInfoPromise = Promise.all([\n execFileAsync('git', ['config', '--get', 'remote.origin.url']).then(\n ({ stdout }) => stdout.trim(),\n () => '',\n ),\n execFileAsync('git', ['config', '--get', 'user.email']).then(\n ({ stdout }) => stdout.trim(),\n () => '',\n ),\n ]).then(([repoUrl, userEmail]) => ({ repoUrl, userEmail }));\n\n return gitInfoPromise;\n}\n\nlet lastReportedRepoUrl = '';\nexport async function uploadTestInfoToServer({\n testUrl,\n serverUrl,\n}: { testUrl: string; serverUrl?: string }) {\n if (!serverUrl) return;\n\n const { repoUrl, userEmail } = await getGitInfoAsync();\n\n // Only upload test info if:\n // 1. Server URL is configured AND\n // 2. Either:\n // - We have a repo URL that's different from last reported one (to avoid duplicate reports)\n // - OR we don't have a repo URL but have a test URL (for non-git environments)\n if (repoUrl ? repoUrl !== lastReportedRepoUrl : !!testUrl) {\n debugLog('Uploading test info to server', {\n serverUrl,\n repoUrl,\n testUrl,\n userEmail,\n });\n\n fetch(serverUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n repo_url: repoUrl,\n test_url: testUrl,\n user_email: userEmail,\n }),\n })\n .then((response) => response.json())\n .then((data) => {\n debugLog('Successfully uploaded test info to server:', data);\n })\n .catch((error) =>\n debugLog('Failed to upload test info to server:', error),\n );\n lastReportedRepoUrl = repoUrl;\n }\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","logEnvReady","groupedActionDumpFileExt","processCacheConfig","cache","cacheId","undefined","envEnabled","globalConfigManager","MIDSCENE_CACHE","reportInitializedMap","Map","getReportTpl","reportTpl","insertScriptBeforeClosingHtml","filePath","scriptContent","htmlEndTag","stat","fs","readSize","Math","start","buffer","Buffer","fd","tailStr","htmlEndIdx","Error","beforeHtmlInTail","htmlEndPos","reportHTMLContent","dumpData","reportPath","appendReport","withTpl","tpl","console","writeToFile","ifInBrowser","dumpContent","escapeScriptTag","dumpString","attributes","attributesArr","encodeURIComponent","writeFileSync","writeDumpReport","fileName","ifInWorker","path","getMidsceneRunSubDir","process","jsonPath","data","JSON","logMsg","writeLogFile","opts","fileExt","fileContent","type","targetDir","assert","gitIgnorePath","gitPath","gitIgnoreContent","existsSync","readFileSync","defaultRunDirName","getTmpDir","runningPkgInfo","getRunningPkgInfo","name","tmpPath","tmpdir","mkdirSync","e","getTmpFile","fileExtWithoutDot","tmpDir","filename","uuid","overlapped","container","target","sleep","ms","Promise","resolve","setTimeout","replacerForPageObject","_key","value","stringifyDumpData","indents","getVersion","__VERSION__","debugLog","message","debugMode","MIDSCENE_DEBUG_MODE","gitInfoPromise","getGitInfoAsync","execFileAsync","promisify","execFile","stdout","repoUrl","userEmail","lastReportedRepoUrl","uploadTestInfoToServer","testUrl","serverUrl","fetch","response","error"],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
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
|
+
buildYaml: ()=>buildYaml
|
|
37
|
+
});
|
|
38
|
+
const external_js_yaml_namespaceObject = require("js-yaml");
|
|
39
|
+
var external_js_yaml_default = /*#__PURE__*/ __webpack_require__.n(external_js_yaml_namespaceObject);
|
|
40
|
+
function buildYaml(env, tasks) {
|
|
41
|
+
const result = {
|
|
42
|
+
target: env,
|
|
43
|
+
tasks
|
|
44
|
+
};
|
|
45
|
+
return external_js_yaml_default().dump(result, {
|
|
46
|
+
indent: 2
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
exports.buildYaml = __webpack_exports__.buildYaml;
|
|
50
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
51
|
+
"buildYaml"
|
|
52
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
53
|
+
Object.defineProperty(exports, '__esModule', {
|
|
54
|
+
value: true
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
//# sourceMappingURL=builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yaml/builder.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/builder.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 yaml from 'js-yaml';\nimport type {\n MidsceneYamlScript,\n MidsceneYamlScriptWebEnv,\n MidsceneYamlTask,\n} from '../types';\n\nexport function buildYaml(\n env: MidsceneYamlScriptWebEnv,\n tasks: MidsceneYamlTask[],\n) {\n const result: MidsceneYamlScript = {\n target: env,\n tasks,\n };\n\n return yaml.dump(result, {\n indent: 2,\n });\n}\n"],"names":["__webpack_require__","module","getter","definition","key","Object","obj","prop","Symbol","buildYaml","env","tasks","result","yaml"],"mappings":";;;IACAA,oBAAoB,CAAC,GAAG,CAACC;QACxB,IAAIC,SAASD,UAAUA,OAAO,UAAU,GACvC,IAAOA,MAAM,CAAC,UAAU,GACxB,IAAOA;QACRD,oBAAoB,CAAC,CAACE,QAAQ;YAAE,GAAGA;QAAO;QAC1C,OAAOA;IACR;;;ICPAF,oBAAoB,CAAC,GAAG,CAAC,UAASG;QACjC,IAAI,IAAIC,OAAOD,WACR,IAAGH,oBAAoB,CAAC,CAACG,YAAYC,QAAQ,CAACJ,oBAAoB,CAAC,CAAC,UAASI,MACzEC,OAAO,cAAc,CAAC,UAASD,KAAK;YAAE,YAAY;YAAM,KAAKD,UAAU,CAACC,IAAI;QAAC;IAGzF;;;ICNAJ,oBAAoB,CAAC,GAAG,CAACM,KAAKC,OAAUF,OAAO,SAAS,CAAC,cAAc,CAAC,IAAI,CAACC,KAAKC;;;ICClFP,oBAAoB,CAAC,GAAG,CAAC;QACxB,IAAG,AAAkB,eAAlB,OAAOQ,UAA0BA,OAAO,WAAW,EACrDH,OAAO,cAAc,CAAC,UAASG,OAAO,WAAW,EAAE;YAAE,OAAO;QAAS;QAEtEH,OAAO,cAAc,CAAC,UAAS,cAAc;YAAE,OAAO;QAAK;IAC5D;;;;;;;;;ACCO,SAASI,UACdC,GAA6B,EAC7BC,KAAyB;IAEzB,MAAMC,SAA6B;QACjC,QAAQF;QACRC;IACF;IAEA,OAAOE,2BAAAA,IAAS,CAACD,QAAQ;QACvB,QAAQ;IACV;AACF"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __webpack_modules__ = {
|
|
3
|
+
"../yaml" (module) {
|
|
4
|
+
module.exports = require("../yaml.js");
|
|
5
|
+
},
|
|
6
|
+
"./builder" (module) {
|
|
7
|
+
module.exports = require("./builder.js");
|
|
8
|
+
},
|
|
9
|
+
"./player" (module) {
|
|
10
|
+
module.exports = require("./player.js");
|
|
11
|
+
},
|
|
12
|
+
"./utils" (module) {
|
|
13
|
+
module.exports = require("./utils.js");
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
var __webpack_module_cache__ = {};
|
|
17
|
+
function __webpack_require__(moduleId) {
|
|
18
|
+
var cachedModule = __webpack_module_cache__[moduleId];
|
|
19
|
+
if (void 0 !== cachedModule) return cachedModule.exports;
|
|
20
|
+
var module = __webpack_module_cache__[moduleId] = {
|
|
21
|
+
exports: {}
|
|
22
|
+
};
|
|
23
|
+
__webpack_modules__[moduleId](module, module.exports, __webpack_require__);
|
|
24
|
+
return module.exports;
|
|
25
|
+
}
|
|
26
|
+
(()=>{
|
|
27
|
+
__webpack_require__.n = (module)=>{
|
|
28
|
+
var getter = module && module.__esModule ? ()=>module['default'] : ()=>module;
|
|
29
|
+
__webpack_require__.d(getter, {
|
|
30
|
+
a: getter
|
|
31
|
+
});
|
|
32
|
+
return getter;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
(()=>{
|
|
36
|
+
__webpack_require__.d = (exports1, definition)=>{
|
|
37
|
+
for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
|
|
38
|
+
enumerable: true,
|
|
39
|
+
get: definition[key]
|
|
40
|
+
});
|
|
41
|
+
};
|
|
42
|
+
})();
|
|
43
|
+
(()=>{
|
|
44
|
+
__webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
|
|
45
|
+
})();
|
|
46
|
+
(()=>{
|
|
47
|
+
__webpack_require__.r = (exports1)=>{
|
|
48
|
+
if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
|
|
49
|
+
value: 'Module'
|
|
50
|
+
});
|
|
51
|
+
Object.defineProperty(exports1, '__esModule', {
|
|
52
|
+
value: true
|
|
53
|
+
});
|
|
54
|
+
};
|
|
55
|
+
})();
|
|
56
|
+
var __webpack_exports__ = {};
|
|
57
|
+
(()=>{
|
|
58
|
+
__webpack_require__.r(__webpack_exports__);
|
|
59
|
+
var _yaml__rspack_import_0 = __webpack_require__("../yaml");
|
|
60
|
+
var __rspack_reexport = {};
|
|
61
|
+
for(const __rspack_import_key in _yaml__rspack_import_0)if ("default" !== __rspack_import_key) __rspack_reexport[__rspack_import_key] = ()=>_yaml__rspack_import_0[__rspack_import_key];
|
|
62
|
+
__webpack_require__.d(__webpack_exports__, __rspack_reexport);
|
|
63
|
+
var _player__rspack_import_1 = __webpack_require__("./player");
|
|
64
|
+
var __rspack_reexport = {};
|
|
65
|
+
for(const __rspack_import_key in _player__rspack_import_1)if ("default" !== __rspack_import_key) __rspack_reexport[__rspack_import_key] = ()=>_player__rspack_import_1[__rspack_import_key];
|
|
66
|
+
__webpack_require__.d(__webpack_exports__, __rspack_reexport);
|
|
67
|
+
var _builder__rspack_import_2 = __webpack_require__("./builder");
|
|
68
|
+
var __rspack_reexport = {};
|
|
69
|
+
for(const __rspack_import_key in _builder__rspack_import_2)if ("default" !== __rspack_import_key) __rspack_reexport[__rspack_import_key] = ()=>_builder__rspack_import_2[__rspack_import_key];
|
|
70
|
+
__webpack_require__.d(__webpack_exports__, __rspack_reexport);
|
|
71
|
+
var _utils__rspack_import_3 = __webpack_require__("./utils");
|
|
72
|
+
var __rspack_reexport = {};
|
|
73
|
+
for(const __rspack_import_key in _utils__rspack_import_3)if ("default" !== __rspack_import_key) __rspack_reexport[__rspack_import_key] = ()=>_utils__rspack_import_3[__rspack_import_key];
|
|
74
|
+
__webpack_require__.d(__webpack_exports__, __rspack_reexport);
|
|
75
|
+
})();
|
|
76
|
+
for(var __rspack_i in __webpack_exports__)exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
77
|
+
Object.defineProperty(exports, '__esModule', {
|
|
78
|
+
value: true
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yaml/index.js","sources":["webpack/runtime/compat_get_default_export","webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object"],"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};"],"names":["__webpack_require__","module","getter","definition","key","Object","obj","prop","Symbol"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;IACAA,oBAAoB,CAAC,GAAG,CAACC;QACxB,IAAIC,SAASD,UAAUA,OAAO,UAAU,GACvC,IAAOA,MAAM,CAAC,UAAU,GACxB,IAAOA;QACRD,oBAAoB,CAAC,CAACE,QAAQ;YAAE,GAAGA;QAAO;QAC1C,OAAOA;IACR;;;ICPAF,oBAAoB,CAAC,GAAG,CAAC,UAASG;QACjC,IAAI,IAAIC,OAAOD,WACR,IAAGH,oBAAoB,CAAC,CAACG,YAAYC,QAAQ,CAACJ,oBAAoB,CAAC,CAAC,UAASI,MACzEC,OAAO,cAAc,CAAC,UAASD,KAAK;YAAE,YAAY;YAAM,KAAKD,UAAU,CAACC,IAAI;QAAC;IAGzF;;;ICNAJ,oBAAoB,CAAC,GAAG,CAACM,KAAKC,OAAUF,OAAO,SAAS,CAAC,cAAc,CAAC,IAAI,CAACC,KAAKC;;;ICClFP,oBAAoB,CAAC,GAAG,CAAC;QACxB,IAAG,AAAkB,eAAlB,OAAOQ,UAA0BA,OAAO,WAAW,EACrDH,OAAO,cAAc,CAAC,UAASG,OAAO,WAAW,EAAE;YAAE,OAAO;QAAS;QAEtEH,OAAO,cAAc,CAAC,UAAS,cAAc;YAAE,OAAO;QAAK;IAC5D"}
|
|
@@ -0,0 +1,452 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __webpack_require__ = {};
|
|
3
|
+
(()=>{
|
|
4
|
+
__webpack_require__.d = (exports1, definition)=>{
|
|
5
|
+
for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: definition[key]
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
})();
|
|
11
|
+
(()=>{
|
|
12
|
+
__webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
|
|
13
|
+
})();
|
|
14
|
+
(()=>{
|
|
15
|
+
__webpack_require__.r = (exports1)=>{
|
|
16
|
+
if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
|
|
17
|
+
value: 'Module'
|
|
18
|
+
});
|
|
19
|
+
Object.defineProperty(exports1, '__esModule', {
|
|
20
|
+
value: true
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
})();
|
|
24
|
+
var __webpack_exports__ = {};
|
|
25
|
+
__webpack_require__.r(__webpack_exports__);
|
|
26
|
+
__webpack_require__.d(__webpack_exports__, {
|
|
27
|
+
ScriptPlayer: ()=>ScriptPlayer
|
|
28
|
+
});
|
|
29
|
+
const external_node_fs_namespaceObject = require("node:fs");
|
|
30
|
+
const external_node_path_namespaceObject = require("node:path");
|
|
31
|
+
const utils_namespaceObject = require("@midscene/shared/utils");
|
|
32
|
+
const external_zod_namespaceObject = require("zod");
|
|
33
|
+
const common_namespaceObject = require("@midscene/shared/common");
|
|
34
|
+
const logger_namespaceObject = require("@midscene/shared/logger");
|
|
35
|
+
const external_utils_js_namespaceObject = require("./utils.js");
|
|
36
|
+
function _define_property(obj, key, value) {
|
|
37
|
+
if (key in obj) Object.defineProperty(obj, key, {
|
|
38
|
+
value: value,
|
|
39
|
+
enumerable: true,
|
|
40
|
+
configurable: true,
|
|
41
|
+
writable: true
|
|
42
|
+
});
|
|
43
|
+
else obj[key] = value;
|
|
44
|
+
return obj;
|
|
45
|
+
}
|
|
46
|
+
const debug = (0, logger_namespaceObject.getDebug)('yaml-player');
|
|
47
|
+
const aiTaskHandlerMap = {
|
|
48
|
+
aiQuery: 'aiQuery',
|
|
49
|
+
aiNumber: 'aiNumber',
|
|
50
|
+
aiString: 'aiString',
|
|
51
|
+
aiBoolean: 'aiBoolean',
|
|
52
|
+
aiAsk: 'aiAsk',
|
|
53
|
+
aiLocate: 'aiLocate'
|
|
54
|
+
};
|
|
55
|
+
const isStringParamSchema = (schema)=>{
|
|
56
|
+
if (!schema) return false;
|
|
57
|
+
const schemaDef = schema?._def;
|
|
58
|
+
if (!schemaDef?.typeName) return false;
|
|
59
|
+
switch(schemaDef.typeName){
|
|
60
|
+
case external_zod_namespaceObject.z.ZodFirstPartyTypeKind.ZodString:
|
|
61
|
+
case external_zod_namespaceObject.z.ZodFirstPartyTypeKind.ZodEnum:
|
|
62
|
+
case external_zod_namespaceObject.z.ZodFirstPartyTypeKind.ZodNativeEnum:
|
|
63
|
+
return true;
|
|
64
|
+
case external_zod_namespaceObject.z.ZodFirstPartyTypeKind.ZodLiteral:
|
|
65
|
+
return 'string' == typeof schemaDef.value;
|
|
66
|
+
case external_zod_namespaceObject.z.ZodFirstPartyTypeKind.ZodOptional:
|
|
67
|
+
case external_zod_namespaceObject.z.ZodFirstPartyTypeKind.ZodNullable:
|
|
68
|
+
case external_zod_namespaceObject.z.ZodFirstPartyTypeKind.ZodDefault:
|
|
69
|
+
return isStringParamSchema(schemaDef.innerType);
|
|
70
|
+
case external_zod_namespaceObject.z.ZodFirstPartyTypeKind.ZodEffects:
|
|
71
|
+
return isStringParamSchema(schemaDef.schema);
|
|
72
|
+
case external_zod_namespaceObject.z.ZodFirstPartyTypeKind.ZodPipeline:
|
|
73
|
+
return isStringParamSchema(schemaDef.out);
|
|
74
|
+
case external_zod_namespaceObject.z.ZodFirstPartyTypeKind.ZodUnion:
|
|
75
|
+
{
|
|
76
|
+
const options = schemaDef.options;
|
|
77
|
+
return Array.isArray(options) ? options.every((option)=>isStringParamSchema(option)) : false;
|
|
78
|
+
}
|
|
79
|
+
default:
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
class ScriptPlayer {
|
|
84
|
+
setResult(key, value) {
|
|
85
|
+
const keyToUse = key || this.unnamedResultIndex++;
|
|
86
|
+
if (this.result[keyToUse]) console.warn(`result key ${keyToUse} already exists, will overwrite`);
|
|
87
|
+
this.result[keyToUse] = value;
|
|
88
|
+
return this.flushResult();
|
|
89
|
+
}
|
|
90
|
+
setPlayerStatus(status, error) {
|
|
91
|
+
this.status = status;
|
|
92
|
+
this.errorInSetup = error;
|
|
93
|
+
}
|
|
94
|
+
notifyCurrentTaskStatusChange(taskIndex) {
|
|
95
|
+
const taskIndexToNotify = 'number' == typeof taskIndex ? taskIndex : this.currentTaskIndex;
|
|
96
|
+
if ('number' != typeof taskIndexToNotify) return;
|
|
97
|
+
const taskStatus = this.taskStatusList[taskIndexToNotify];
|
|
98
|
+
if (this.onTaskStatusChange) this.onTaskStatusChange(taskStatus);
|
|
99
|
+
}
|
|
100
|
+
async setTaskStatus(index, statusValue, error) {
|
|
101
|
+
this.taskStatusList[index].status = statusValue;
|
|
102
|
+
if (error) this.taskStatusList[index].error = error;
|
|
103
|
+
this.notifyCurrentTaskStatusChange(index);
|
|
104
|
+
}
|
|
105
|
+
setTaskIndex(taskIndex) {
|
|
106
|
+
this.currentTaskIndex = taskIndex;
|
|
107
|
+
}
|
|
108
|
+
flushResult() {
|
|
109
|
+
if (this.output) {
|
|
110
|
+
const output = (0, external_node_path_namespaceObject.resolve)(process.cwd(), this.output);
|
|
111
|
+
const outputDir = (0, external_node_path_namespaceObject.dirname)(output);
|
|
112
|
+
if (!(0, external_node_fs_namespaceObject.existsSync)(outputDir)) (0, external_node_fs_namespaceObject.mkdirSync)(outputDir, {
|
|
113
|
+
recursive: true
|
|
114
|
+
});
|
|
115
|
+
(0, external_node_fs_namespaceObject.writeFileSync)(output, JSON.stringify(this.result || {}, void 0, 2));
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
flushUnstableLogContent() {
|
|
119
|
+
if (this.unstableLogContent) {
|
|
120
|
+
const content = this.interfaceAgent?._unstableLogContent();
|
|
121
|
+
const filePath = (0, external_node_path_namespaceObject.resolve)(process.cwd(), this.unstableLogContent);
|
|
122
|
+
const outputDir = (0, external_node_path_namespaceObject.dirname)(filePath);
|
|
123
|
+
if (!(0, external_node_fs_namespaceObject.existsSync)(outputDir)) (0, external_node_fs_namespaceObject.mkdirSync)(outputDir, {
|
|
124
|
+
recursive: true
|
|
125
|
+
});
|
|
126
|
+
(0, external_node_fs_namespaceObject.writeFileSync)(filePath, JSON.stringify(content, null, 2));
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
async playTask(taskStatus, agent) {
|
|
130
|
+
const { flow } = taskStatus;
|
|
131
|
+
(0, utils_namespaceObject.assert)(flow, 'missing flow in task');
|
|
132
|
+
for(const flowItemIndex in flow){
|
|
133
|
+
const currentStep = Number.parseInt(flowItemIndex, 10);
|
|
134
|
+
taskStatus.currentStep = currentStep;
|
|
135
|
+
const flowItem = flow[flowItemIndex];
|
|
136
|
+
if ('Finalize' in flowItem) continue;
|
|
137
|
+
debug(`playing step ${flowItemIndex}, flowItem=${JSON.stringify(flowItem)}`);
|
|
138
|
+
const simpleAIKey = Object.keys(aiTaskHandlerMap).find((key)=>Object.prototype.hasOwnProperty.call(flowItem, key));
|
|
139
|
+
if ('aiAct' in flowItem || 'aiAction' in flowItem || 'ai' in flowItem) {
|
|
140
|
+
const actionTask = flowItem;
|
|
141
|
+
const { aiAct, aiAction, ai, ...actionOptions } = actionTask;
|
|
142
|
+
const prompt = aiAct || aiAction || ai;
|
|
143
|
+
(0, utils_namespaceObject.assert)(prompt, 'missing prompt for ai (aiAct)');
|
|
144
|
+
await agent.aiAct(prompt, actionOptions);
|
|
145
|
+
} else if ('aiAssert' in flowItem) {
|
|
146
|
+
const assertTask = flowItem;
|
|
147
|
+
const { aiAssert: prompt, errorMessage: msg, name, ...restOpts } = assertTask;
|
|
148
|
+
(0, utils_namespaceObject.assert)(prompt, 'missing prompt for aiAssert');
|
|
149
|
+
const { pass, thought, message } = await agent.aiAssert(prompt, msg, {
|
|
150
|
+
...restOpts,
|
|
151
|
+
keepRawResponse: true
|
|
152
|
+
}) || {};
|
|
153
|
+
this.setResult(name, {
|
|
154
|
+
pass,
|
|
155
|
+
thought,
|
|
156
|
+
message
|
|
157
|
+
});
|
|
158
|
+
if (!pass) throw new Error(message);
|
|
159
|
+
} else if (simpleAIKey) {
|
|
160
|
+
const { [simpleAIKey]: prompt, name, ...options } = flowItem;
|
|
161
|
+
(0, utils_namespaceObject.assert)(prompt, `missing prompt for ${simpleAIKey}`);
|
|
162
|
+
const agentMethod = agent[aiTaskHandlerMap[simpleAIKey]];
|
|
163
|
+
(0, utils_namespaceObject.assert)('function' == typeof agentMethod, `missing agent method for ${simpleAIKey}`);
|
|
164
|
+
const aiResult = await agentMethod.call(agent, prompt, options);
|
|
165
|
+
this.setResult(name, aiResult);
|
|
166
|
+
} else if ('aiWaitFor' in flowItem) {
|
|
167
|
+
const waitForTask = flowItem;
|
|
168
|
+
const { aiWaitFor, timeout, ...restWaitForOpts } = waitForTask;
|
|
169
|
+
const prompt = aiWaitFor;
|
|
170
|
+
(0, utils_namespaceObject.assert)(prompt, 'missing prompt for aiWaitFor');
|
|
171
|
+
const waitForOptions = {
|
|
172
|
+
...restWaitForOpts,
|
|
173
|
+
...void 0 !== timeout ? {
|
|
174
|
+
timeout,
|
|
175
|
+
timeoutMs: timeout
|
|
176
|
+
} : {}
|
|
177
|
+
};
|
|
178
|
+
await agent.aiWaitFor(prompt, waitForOptions);
|
|
179
|
+
} else if ('sleep' in flowItem) {
|
|
180
|
+
const sleepTask = flowItem;
|
|
181
|
+
const ms = sleepTask.sleep;
|
|
182
|
+
let msNumber = ms;
|
|
183
|
+
if ('string' == typeof ms) msNumber = Number.parseInt(ms, 10);
|
|
184
|
+
(0, utils_namespaceObject.assert)(msNumber && msNumber > 0, `ms for sleep must be greater than 0, but got ${ms}`);
|
|
185
|
+
await new Promise((resolve)=>setTimeout(resolve, msNumber));
|
|
186
|
+
} else if ("javascript" in flowItem) {
|
|
187
|
+
const evaluateJavaScriptTask = flowItem;
|
|
188
|
+
const result = await agent.evaluateJavaScript(evaluateJavaScriptTask.javascript);
|
|
189
|
+
this.setResult(evaluateJavaScriptTask.name, result);
|
|
190
|
+
} else if ('logScreenshot' in flowItem || 'recordToReport' in flowItem) {
|
|
191
|
+
const recordTask = flowItem;
|
|
192
|
+
const title = recordTask.recordToReport ?? recordTask.logScreenshot ?? 'untitled';
|
|
193
|
+
const content = recordTask.content || '';
|
|
194
|
+
await agent.recordToReport(title, {
|
|
195
|
+
content
|
|
196
|
+
});
|
|
197
|
+
} else if ('aiInput' in flowItem) {
|
|
198
|
+
const { aiInput, value: rawValue, ...inputTask } = flowItem;
|
|
199
|
+
let locatePrompt;
|
|
200
|
+
let value;
|
|
201
|
+
if (inputTask.locate) {
|
|
202
|
+
value = aiInput || rawValue;
|
|
203
|
+
locatePrompt = inputTask.locate;
|
|
204
|
+
} else {
|
|
205
|
+
locatePrompt = aiInput || '';
|
|
206
|
+
value = rawValue;
|
|
207
|
+
}
|
|
208
|
+
await agent.callActionInActionSpace('Input', {
|
|
209
|
+
...inputTask,
|
|
210
|
+
...void 0 !== value ? {
|
|
211
|
+
value: String(value)
|
|
212
|
+
} : {},
|
|
213
|
+
...locatePrompt ? {
|
|
214
|
+
locate: (0, external_utils_js_namespaceObject.buildDetailedLocateParam)(locatePrompt, inputTask)
|
|
215
|
+
} : {}
|
|
216
|
+
});
|
|
217
|
+
} else if ('aiKeyboardPress' in flowItem) {
|
|
218
|
+
const { aiKeyboardPress, ...keyboardPressTask } = flowItem;
|
|
219
|
+
let locatePrompt;
|
|
220
|
+
let keyName;
|
|
221
|
+
if (keyboardPressTask.locate) {
|
|
222
|
+
keyName = aiKeyboardPress;
|
|
223
|
+
locatePrompt = keyboardPressTask.locate;
|
|
224
|
+
} else if (keyboardPressTask.keyName) {
|
|
225
|
+
keyName = keyboardPressTask.keyName;
|
|
226
|
+
locatePrompt = aiKeyboardPress;
|
|
227
|
+
} else keyName = aiKeyboardPress;
|
|
228
|
+
await agent.callActionInActionSpace('KeyboardPress', {
|
|
229
|
+
...keyboardPressTask,
|
|
230
|
+
...keyName ? {
|
|
231
|
+
keyName
|
|
232
|
+
} : {},
|
|
233
|
+
...locatePrompt ? {
|
|
234
|
+
locate: (0, external_utils_js_namespaceObject.buildDetailedLocateParam)(locatePrompt, keyboardPressTask)
|
|
235
|
+
} : {}
|
|
236
|
+
});
|
|
237
|
+
} else if ('aiScroll' in flowItem) {
|
|
238
|
+
const { aiScroll, ...scrollTask } = flowItem;
|
|
239
|
+
const { locate, ...scrollOptions } = scrollTask;
|
|
240
|
+
const locatePrompt = locate ?? aiScroll;
|
|
241
|
+
await agent.aiScroll(locatePrompt, scrollOptions);
|
|
242
|
+
} else if ('aiTap' in flowItem) {
|
|
243
|
+
const { aiTap, prompt, locate, ...tapOptions } = flowItem;
|
|
244
|
+
let locatePrompt;
|
|
245
|
+
let opts = tapOptions;
|
|
246
|
+
const locateObj = locate ?? ('object' == typeof aiTap && null !== aiTap ? aiTap.locate : void 0);
|
|
247
|
+
if ('string' == typeof aiTap && aiTap) locatePrompt = aiTap;
|
|
248
|
+
else if ('object' == typeof locateObj && locateObj?.prompt) {
|
|
249
|
+
const { prompt: lp, ...locateOpts } = locateObj;
|
|
250
|
+
locatePrompt = lp;
|
|
251
|
+
opts = {
|
|
252
|
+
...locateOpts,
|
|
253
|
+
...tapOptions
|
|
254
|
+
};
|
|
255
|
+
} else locatePrompt = aiTap?.prompt || prompt || locateObj;
|
|
256
|
+
(0, utils_namespaceObject.assert)(locatePrompt, 'missing prompt for aiTap');
|
|
257
|
+
await agent.aiTap(locatePrompt, opts);
|
|
258
|
+
} else {
|
|
259
|
+
const actionSpace = this.actionSpace;
|
|
260
|
+
let locatePromptShortcut;
|
|
261
|
+
let actionParamForMatchedAction;
|
|
262
|
+
const matchedAction = actionSpace.find((action)=>{
|
|
263
|
+
const actionInterfaceAlias = action.interfaceAlias;
|
|
264
|
+
if (actionInterfaceAlias && Object.prototype.hasOwnProperty.call(flowItem, actionInterfaceAlias)) {
|
|
265
|
+
actionParamForMatchedAction = flowItem[actionInterfaceAlias];
|
|
266
|
+
if ('string' == typeof actionParamForMatchedAction) locatePromptShortcut = actionParamForMatchedAction;
|
|
267
|
+
return true;
|
|
268
|
+
}
|
|
269
|
+
const keyOfActionInActionSpace = action.name;
|
|
270
|
+
if (Object.prototype.hasOwnProperty.call(flowItem, keyOfActionInActionSpace)) {
|
|
271
|
+
actionParamForMatchedAction = flowItem[keyOfActionInActionSpace];
|
|
272
|
+
if ('string' == typeof actionParamForMatchedAction) locatePromptShortcut = actionParamForMatchedAction;
|
|
273
|
+
return true;
|
|
274
|
+
}
|
|
275
|
+
return false;
|
|
276
|
+
});
|
|
277
|
+
(0, utils_namespaceObject.assert)(matchedAction, `unknown flowItem in yaml: ${JSON.stringify(flowItem)}`);
|
|
278
|
+
const schemaIsStringParam = isStringParamSchema(matchedAction.paramSchema);
|
|
279
|
+
let stringParamToCall;
|
|
280
|
+
if ('string' == typeof actionParamForMatchedAction && schemaIsStringParam) if (matchedAction.paramSchema) {
|
|
281
|
+
const parseResult = matchedAction.paramSchema.safeParse(actionParamForMatchedAction);
|
|
282
|
+
if (parseResult.success && 'string' == typeof parseResult.data) stringParamToCall = parseResult.data;
|
|
283
|
+
else if (!parseResult.success) {
|
|
284
|
+
debug(`parse failed for action ${matchedAction.name} with string param`, parseResult.error);
|
|
285
|
+
stringParamToCall = actionParamForMatchedAction;
|
|
286
|
+
}
|
|
287
|
+
} else stringParamToCall = actionParamForMatchedAction;
|
|
288
|
+
if (void 0 !== stringParamToCall) {
|
|
289
|
+
debug(`matchedAction: ${matchedAction.name}`, `flowParams: ${JSON.stringify(stringParamToCall)}`);
|
|
290
|
+
const result = await agent.callActionInActionSpace(matchedAction.name, stringParamToCall);
|
|
291
|
+
const resultName = flowItem.name;
|
|
292
|
+
if (void 0 !== result) this.setResult(resultName, result);
|
|
293
|
+
} else if ('string' == typeof actionParamForMatchedAction && ('Launch' === matchedAction.name || 'launch' === matchedAction.interfaceAlias) && 'function' == typeof agent.launch) {
|
|
294
|
+
debug(`Calling agent.launch with: ${actionParamForMatchedAction}`);
|
|
295
|
+
const result = await agent.launch(actionParamForMatchedAction);
|
|
296
|
+
const resultName = flowItem.name;
|
|
297
|
+
if (void 0 !== result) this.setResult(resultName, result);
|
|
298
|
+
} else if ('string' == typeof actionParamForMatchedAction && ('RunAdbShell' === matchedAction.name || 'runAdbShell' === matchedAction.interfaceAlias) && 'function' == typeof agent.runAdbShell) {
|
|
299
|
+
debug(`Calling agent.runAdbShell with: ${actionParamForMatchedAction}`);
|
|
300
|
+
const result = await agent.runAdbShell(actionParamForMatchedAction);
|
|
301
|
+
const resultName = flowItem.name;
|
|
302
|
+
if (void 0 !== result) this.setResult(resultName, result);
|
|
303
|
+
} else {
|
|
304
|
+
const sourceForParams = locatePromptShortcut && 'string' == typeof actionParamForMatchedAction ? {
|
|
305
|
+
...flowItem,
|
|
306
|
+
prompt: locatePromptShortcut
|
|
307
|
+
} : 'object' == typeof actionParamForMatchedAction && null !== actionParamForMatchedAction ? actionParamForMatchedAction : flowItem;
|
|
308
|
+
const { locateParam, restParams } = (0, external_utils_js_namespaceObject.buildDetailedLocateParamAndRestParams)(locatePromptShortcut || '', sourceForParams, [
|
|
309
|
+
matchedAction.name,
|
|
310
|
+
matchedAction.interfaceAlias || '_never_mind_'
|
|
311
|
+
]);
|
|
312
|
+
const flowParams = {
|
|
313
|
+
...restParams,
|
|
314
|
+
locate: locateParam
|
|
315
|
+
};
|
|
316
|
+
debug(`matchedAction: ${matchedAction.name}`, `flowParams: ${JSON.stringify(flowParams, null, 2)}`);
|
|
317
|
+
const result = await agent.callActionInActionSpace(matchedAction.name, flowParams);
|
|
318
|
+
const resultName = flowItem.name;
|
|
319
|
+
if (void 0 !== result) this.setResult(resultName, result);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
this.reportFile = agent.reportFile;
|
|
324
|
+
await this.flushUnstableLogContent();
|
|
325
|
+
}
|
|
326
|
+
async run() {
|
|
327
|
+
const { target, web, android, ios, computer, tasks } = this.script;
|
|
328
|
+
const webEnv = web || target;
|
|
329
|
+
const androidEnv = android;
|
|
330
|
+
const iosEnv = ios;
|
|
331
|
+
const computerEnv = computer;
|
|
332
|
+
const platform = webEnv || androidEnv || iosEnv || computerEnv;
|
|
333
|
+
this.setPlayerStatus('running');
|
|
334
|
+
let agent = null;
|
|
335
|
+
let freeFn = [];
|
|
336
|
+
try {
|
|
337
|
+
const { agent: newAgent, freeFn: newFreeFn } = await this.setupAgent(platform);
|
|
338
|
+
this.actionSpace = await newAgent.getActionSpace();
|
|
339
|
+
agent = newAgent;
|
|
340
|
+
const originalOnTaskStartTip = agent.onTaskStartTip;
|
|
341
|
+
agent.onTaskStartTip = (tip)=>{
|
|
342
|
+
if ('running' === this.status) this.agentStatusTip = tip;
|
|
343
|
+
originalOnTaskStartTip?.(tip);
|
|
344
|
+
};
|
|
345
|
+
freeFn = [
|
|
346
|
+
...newFreeFn || [],
|
|
347
|
+
{
|
|
348
|
+
name: 'restore-agent-onTaskStartTip',
|
|
349
|
+
fn: ()=>{
|
|
350
|
+
if (agent) agent.onTaskStartTip = originalOnTaskStartTip;
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
];
|
|
354
|
+
} catch (e) {
|
|
355
|
+
this.setPlayerStatus('error', e);
|
|
356
|
+
return;
|
|
357
|
+
}
|
|
358
|
+
this.interfaceAgent = agent;
|
|
359
|
+
let taskIndex = 0;
|
|
360
|
+
this.setPlayerStatus('running');
|
|
361
|
+
let errorFlag = false;
|
|
362
|
+
while(taskIndex < tasks.length){
|
|
363
|
+
const taskStatus = this.taskStatusList[taskIndex];
|
|
364
|
+
this.setTaskStatus(taskIndex, 'running');
|
|
365
|
+
this.setTaskIndex(taskIndex);
|
|
366
|
+
try {
|
|
367
|
+
await this.playTask(taskStatus, this.interfaceAgent);
|
|
368
|
+
this.setTaskStatus(taskIndex, 'done');
|
|
369
|
+
} catch (e) {
|
|
370
|
+
this.setTaskStatus(taskIndex, 'error', e);
|
|
371
|
+
if (taskStatus.continueOnError) ;
|
|
372
|
+
else {
|
|
373
|
+
this.reportFile = agent.reportFile;
|
|
374
|
+
errorFlag = true;
|
|
375
|
+
break;
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
this.reportFile = agent?.reportFile;
|
|
379
|
+
taskIndex++;
|
|
380
|
+
}
|
|
381
|
+
if (errorFlag) this.setPlayerStatus('error');
|
|
382
|
+
else this.setPlayerStatus('done');
|
|
383
|
+
this.agentStatusTip = '';
|
|
384
|
+
for (const fn of freeFn)try {
|
|
385
|
+
await fn.fn();
|
|
386
|
+
} catch (e) {}
|
|
387
|
+
}
|
|
388
|
+
constructor(script, setupAgent, onTaskStatusChange, scriptPath){
|
|
389
|
+
_define_property(this, "script", void 0);
|
|
390
|
+
_define_property(this, "setupAgent", void 0);
|
|
391
|
+
_define_property(this, "onTaskStatusChange", void 0);
|
|
392
|
+
_define_property(this, "currentTaskIndex", void 0);
|
|
393
|
+
_define_property(this, "taskStatusList", void 0);
|
|
394
|
+
_define_property(this, "status", void 0);
|
|
395
|
+
_define_property(this, "reportFile", void 0);
|
|
396
|
+
_define_property(this, "result", void 0);
|
|
397
|
+
_define_property(this, "unnamedResultIndex", void 0);
|
|
398
|
+
_define_property(this, "output", void 0);
|
|
399
|
+
_define_property(this, "unstableLogContent", void 0);
|
|
400
|
+
_define_property(this, "errorInSetup", void 0);
|
|
401
|
+
_define_property(this, "interfaceAgent", void 0);
|
|
402
|
+
_define_property(this, "agentStatusTip", void 0);
|
|
403
|
+
_define_property(this, "target", void 0);
|
|
404
|
+
_define_property(this, "actionSpace", void 0);
|
|
405
|
+
_define_property(this, "scriptPath", void 0);
|
|
406
|
+
this.script = script;
|
|
407
|
+
this.setupAgent = setupAgent;
|
|
408
|
+
this.onTaskStatusChange = onTaskStatusChange;
|
|
409
|
+
this.taskStatusList = [];
|
|
410
|
+
this.status = 'init';
|
|
411
|
+
this.unnamedResultIndex = 0;
|
|
412
|
+
this.interfaceAgent = null;
|
|
413
|
+
this.actionSpace = [];
|
|
414
|
+
this.scriptPath = scriptPath;
|
|
415
|
+
this.result = {};
|
|
416
|
+
const resolvedAiActContext = script.agent?.aiActContext ?? script.agent?.aiActionContext;
|
|
417
|
+
if (void 0 !== resolvedAiActContext && script.agent) {
|
|
418
|
+
if (void 0 === script.agent.aiActContext && void 0 !== script.agent.aiActionContext) console.warn('agent.aiActionContext is deprecated, please use agent.aiActContext instead. The legacy name is still accepted for backward compatibility.');
|
|
419
|
+
script.agent.aiActContext = resolvedAiActContext;
|
|
420
|
+
}
|
|
421
|
+
this.target = script.target || script.web || script.android || script.ios || script.computer || script.config;
|
|
422
|
+
if (utils_namespaceObject.ifInBrowser || utils_namespaceObject.ifInWorker) {
|
|
423
|
+
this.output = void 0;
|
|
424
|
+
debug('output is undefined in browser or worker');
|
|
425
|
+
} else if (this.target?.output) {
|
|
426
|
+
this.output = (0, external_node_path_namespaceObject.resolve)(process.cwd(), this.target.output);
|
|
427
|
+
debug('setting output by config.output', this.output);
|
|
428
|
+
} else {
|
|
429
|
+
const scriptName = this.scriptPath ? (0, external_node_path_namespaceObject.basename)(this.scriptPath, '.yaml').replace(/\.(ya?ml)$/i, '') : "script";
|
|
430
|
+
this.output = (0, external_node_path_namespaceObject.join)((0, common_namespaceObject.getMidsceneRunSubDir)('output'), `${scriptName}-${Date.now()}.json`);
|
|
431
|
+
debug("setting output by script path", this.output);
|
|
432
|
+
}
|
|
433
|
+
if (utils_namespaceObject.ifInBrowser || utils_namespaceObject.ifInWorker) this.unstableLogContent = void 0;
|
|
434
|
+
else if ('string' == typeof this.target?.unstableLogContent) this.unstableLogContent = (0, external_node_path_namespaceObject.resolve)(process.cwd(), this.target.unstableLogContent);
|
|
435
|
+
else if (this.target?.unstableLogContent === true) this.unstableLogContent = (0, external_node_path_namespaceObject.join)((0, common_namespaceObject.getMidsceneRunSubDir)('output'), 'unstableLogContent.json');
|
|
436
|
+
this.taskStatusList = (script.tasks || []).map((task, taskIndex)=>({
|
|
437
|
+
...task,
|
|
438
|
+
index: taskIndex,
|
|
439
|
+
status: 'init',
|
|
440
|
+
totalSteps: task.flow?.length || 0
|
|
441
|
+
}));
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
exports.ScriptPlayer = __webpack_exports__.ScriptPlayer;
|
|
445
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
446
|
+
"ScriptPlayer"
|
|
447
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
448
|
+
Object.defineProperty(exports, '__esModule', {
|
|
449
|
+
value: true
|
|
450
|
+
});
|
|
451
|
+
|
|
452
|
+
//# sourceMappingURL=player.js.map
|