@midscene/core 1.10.8-beta-20260723115348.0 → 1.10.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/es/agent/agent.mjs +66 -26
- package/dist/es/agent/agent.mjs.map +1 -1
- package/dist/es/agent/file-chooser.mjs +82 -0
- package/dist/es/agent/file-chooser.mjs.map +1 -0
- package/dist/es/agent/prompt-context.mjs +12 -1
- package/dist/es/agent/prompt-context.mjs.map +1 -1
- package/dist/es/agent/task-builder.mjs +11 -2
- package/dist/es/agent/task-builder.mjs.map +1 -1
- package/dist/es/agent/tasks.mjs +4 -16
- package/dist/es/agent/tasks.mjs.map +1 -1
- package/dist/es/agent/ui-utils.mjs +1 -0
- package/dist/es/agent/ui-utils.mjs.map +1 -1
- package/dist/es/agent/utils.mjs +1 -1
- package/dist/es/ai-model/inspect.mjs +1 -1
- package/dist/es/ai-model/inspect.mjs.map +1 -1
- package/dist/es/ai-model/llm-planning.mjs +2 -1
- package/dist/es/ai-model/llm-planning.mjs.map +1 -1
- package/dist/es/ai-model/model-adapter/chat-completion.mjs +3 -1
- package/dist/es/ai-model/model-adapter/chat-completion.mjs.map +1 -1
- package/dist/es/ai-model/models/kimi.mjs +35 -0
- package/dist/es/ai-model/models/kimi.mjs.map +1 -1
- package/dist/es/ai-model/prompt/extraction.mjs +4 -2
- package/dist/es/ai-model/prompt/extraction.mjs.map +1 -1
- package/dist/es/ai-model/service-caller/codex-app-server.mjs +22 -14
- package/dist/es/ai-model/service-caller/codex-app-server.mjs.map +1 -1
- package/dist/es/ai-model/service-caller/index.mjs +15 -14
- package/dist/es/ai-model/service-caller/index.mjs.map +1 -1
- package/dist/es/ai-model/workflows/planning/custom-planning.mjs.map +1 -1
- package/dist/es/device/index.mjs +21 -1
- package/dist/es/device/index.mjs.map +1 -1
- package/dist/es/report.mjs +1 -0
- package/dist/es/report.mjs.map +1 -1
- package/dist/es/types.mjs.map +1 -1
- package/dist/es/utils.mjs +2 -2
- package/dist/es/yaml/utils.mjs +9 -1
- package/dist/es/yaml/utils.mjs.map +1 -1
- package/dist/lib/agent/agent.js +63 -23
- package/dist/lib/agent/agent.js.map +1 -1
- package/dist/lib/agent/file-chooser.js +125 -0
- package/dist/lib/agent/file-chooser.js.map +1 -0
- package/dist/lib/agent/prompt-context.js +14 -0
- package/dist/lib/agent/prompt-context.js.map +1 -1
- package/dist/lib/agent/task-builder.js +11 -2
- package/dist/lib/agent/task-builder.js.map +1 -1
- package/dist/lib/agent/tasks.js +6 -18
- package/dist/lib/agent/tasks.js.map +1 -1
- package/dist/lib/agent/ui-utils.js +1 -0
- package/dist/lib/agent/ui-utils.js.map +1 -1
- package/dist/lib/agent/utils.js +1 -1
- package/dist/lib/ai-model/inspect.js +1 -1
- package/dist/lib/ai-model/inspect.js.map +1 -1
- package/dist/lib/ai-model/llm-planning.js +2 -1
- package/dist/lib/ai-model/llm-planning.js.map +1 -1
- package/dist/lib/ai-model/model-adapter/chat-completion.js +3 -1
- package/dist/lib/ai-model/model-adapter/chat-completion.js.map +1 -1
- package/dist/lib/ai-model/models/kimi.js +35 -0
- package/dist/lib/ai-model/models/kimi.js.map +1 -1
- package/dist/lib/ai-model/prompt/extraction.js +4 -2
- package/dist/lib/ai-model/prompt/extraction.js.map +1 -1
- package/dist/lib/ai-model/service-caller/codex-app-server.js +22 -14
- package/dist/lib/ai-model/service-caller/codex-app-server.js.map +1 -1
- package/dist/lib/ai-model/service-caller/index.js +15 -14
- package/dist/lib/ai-model/service-caller/index.js.map +1 -1
- package/dist/lib/ai-model/workflows/planning/custom-planning.js.map +1 -1
- package/dist/lib/device/index.js +27 -1
- package/dist/lib/device/index.js.map +1 -1
- package/dist/lib/report.js +1 -0
- package/dist/lib/report.js.map +1 -1
- package/dist/lib/types.js.map +1 -1
- package/dist/lib/utils.js +2 -2
- package/dist/lib/yaml/utils.js +9 -1
- package/dist/lib/yaml/utils.js.map +1 -1
- package/dist/types/agent/agent.d.ts +5 -2
- package/dist/types/agent/file-chooser.d.ts +19 -0
- package/dist/types/agent/prompt-context.d.ts +1 -0
- package/dist/types/agent/tasks.d.ts +1 -1
- package/dist/types/ai-model/model-adapter/types.d.ts +9 -0
- package/dist/types/ai-model/models/kimi.d.ts +18 -0
- package/dist/types/ai-model/models/registry.d.ts +18 -0
- package/dist/types/ai-model/prompt/extraction.d.ts +1 -1
- package/dist/types/ai-model/service-caller/codex-app-server.d.ts +5 -1
- package/dist/types/device/device-options.d.ts +7 -0
- package/dist/types/device/index.d.ts +11 -0
- package/dist/types/types.d.ts +6 -4
- package/dist/types/yaml.d.ts +9 -1
- package/package.json +2 -2
package/dist/lib/yaml/utils.js
CHANGED
|
@@ -43,6 +43,7 @@ const logger_namespaceObject = require("@midscene/shared/logger");
|
|
|
43
43
|
const utils_namespaceObject = require("@midscene/shared/utils");
|
|
44
44
|
const external_js_yaml_namespaceObject = require("js-yaml");
|
|
45
45
|
var external_js_yaml_default = /*#__PURE__*/ __webpack_require__.n(external_js_yaml_namespaceObject);
|
|
46
|
+
const prompt_context_js_namespaceObject = require("../agent/prompt-context.js");
|
|
46
47
|
const debugUtils = (0, logger_namespaceObject.getDebug)('yaml:utils');
|
|
47
48
|
const topLevelTasksPattern = /^tasks\s*:/;
|
|
48
49
|
const topLevelYamlKeyPattern = /^[^\s#][^:]*:/;
|
|
@@ -182,6 +183,9 @@ function buildDetailedLocateParam(locatePrompt, opt) {
|
|
|
182
183
|
prompt = prompt || opt.prompt;
|
|
183
184
|
}
|
|
184
185
|
if (!prompt) return void debugUtils('no prompt, will return undefined in buildDetailedLocateParam', opt);
|
|
186
|
+
const promptDisplay = 'string' == typeof prompt ? prompt : prompt.prompt;
|
|
187
|
+
const context = opt?.context?.trim() || void 0;
|
|
188
|
+
prompt = (0, prompt_context_js_namespaceObject.buildLocatePromptWithContext)(prompt, opt?.context);
|
|
185
189
|
const multimodalPrompt = extractMultimodalPrompt(opt);
|
|
186
190
|
if (multimodalPrompt) prompt = 'string' == typeof prompt ? {
|
|
187
191
|
prompt,
|
|
@@ -192,6 +196,10 @@ function buildDetailedLocateParam(locatePrompt, opt) {
|
|
|
192
196
|
};
|
|
193
197
|
return {
|
|
194
198
|
prompt,
|
|
199
|
+
...context ? {
|
|
200
|
+
promptDisplay,
|
|
201
|
+
context
|
|
202
|
+
} : {},
|
|
195
203
|
deepLocate,
|
|
196
204
|
cacheable,
|
|
197
205
|
xpath
|
|
@@ -205,7 +213,7 @@ function buildDetailedLocateParamAndRestParams(locatePrompt, opt, excludeKeys =
|
|
|
205
213
|
const allKeys = Object.keys(opt);
|
|
206
214
|
const locateParamKeys = Object.keys(locateParam || {});
|
|
207
215
|
const multimodalPromptKeys = 'object' == typeof locateParam?.prompt && locateParam?.prompt !== null ? Object.keys(multimodalPrompt || {}) : [];
|
|
208
|
-
for (const key of allKeys)if (!locateParamKeys.includes(key) && !multimodalPromptKeys.includes(key) && !excludeKeys.includes(key) && 'locate' !== key) restParams[key] = opt[key];
|
|
216
|
+
for (const key of allKeys)if (!locateParamKeys.includes(key) && 'context' !== key && 'deepThink' !== key && !multimodalPromptKeys.includes(key) && !excludeKeys.includes(key) && 'locate' !== key) restParams[key] = opt[key];
|
|
209
217
|
}
|
|
210
218
|
return {
|
|
211
219
|
locateParam,
|
|
@@ -1 +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 { TMultimodalPrompt, TUserPrompt } from '@/common';\nimport type {\n DetailedLocateParam,\n LocateOption,\n MidsceneYamlScript,\n MidsceneYamlScriptWebEnv,\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\nconst topLevelTasksPattern = /^tasks\\s*:/;\nconst topLevelYamlKeyPattern = /^[^\\s#][^:]*:/;\n\nexport type WebTargetSource = 'page' | 'browser' | 'web' | 'target';\n\nexport type ResolvedWebTarget = {\n source: WebTargetSource;\n target: Partial<MidsceneYamlScriptWebEnv> & { mode: 'page' | 'browser' };\n mode: 'page' | 'browser';\n};\n\nexport type WebTargetConfig = Partial<\n Record<WebTargetSource, Partial<MidsceneYamlScriptWebEnv>>\n>;\n\nconst webTargetSources: WebTargetSource[] = [\n 'page',\n 'browser',\n 'web',\n 'target',\n];\n\nexport function resolveWebTarget(\n config: WebTargetConfig,\n): ResolvedWebTarget | undefined {\n const entries = webTargetSources\n .map((source) => [source, config[source]] as const)\n .filter(\n (\n entry,\n ): entry is readonly [\n WebTargetSource,\n Partial<MidsceneYamlScriptWebEnv>,\n ] => typeof entry[1] !== 'undefined',\n );\n\n if (entries.length === 0) {\n return undefined;\n }\n\n if (entries.length > 1) {\n const specifiedTargets = entries.map(([source]) => source);\n throw new Error(\n `[midscene] Only one web target can be specified, but found multiple: ${specifiedTargets.join(\n ', ',\n )}. Please specify only one of: page, browser, web, or target.`,\n );\n }\n\n const [source, target] = entries[0];\n const explicitMode = target.mode;\n if (\n typeof explicitMode !== 'undefined' &&\n explicitMode !== 'page' &&\n explicitMode !== 'browser'\n ) {\n throw new Error(\n `[midscene] web target mode must be either \"page\" or \"browser\", but got \"${explicitMode}\".`,\n );\n }\n\n if (source === 'page' && explicitMode === 'browser') {\n throw new Error(\n '[midscene] page target cannot use mode: browser. Use browser: instead.',\n );\n }\n\n if (source === 'browser' && explicitMode === 'page') {\n throw new Error(\n '[midscene] browser target cannot use mode: page. Use page: instead.',\n );\n }\n\n const mode =\n source === 'page'\n ? 'page'\n : source === 'browser'\n ? 'browser'\n : (explicitMode ?? 'page');\n\n if (mode === 'page' && target.autoFollowNewPage) {\n throw new Error(\n '[midscene] autoFollowNewPage requires browser mode. Use browser: or web.mode: browser.',\n );\n }\n\n if (\n mode === 'browser' &&\n typeof target.forceSameTabNavigation !== 'undefined'\n ) {\n throw new Error(\n '[midscene] forceSameTabNavigation cannot be used in browser mode. Use page: or web.mode: page when same-tab navigation is required.',\n );\n }\n\n return {\n source,\n mode,\n target: {\n ...target,\n mode,\n },\n };\n}\n\nfunction interpolateEnvVarRefs(\n value: string,\n keepUnresolvedRefs = false,\n): string {\n let result = '';\n let lastIndex = 0;\n let searchFrom = 0;\n\n while (searchFrom < value.length) {\n const start = value.indexOf('${', searchFrom);\n if (start === -1) {\n break;\n }\n\n const end = value.indexOf('}', start + 2);\n if (end === -1) {\n break;\n }\n\n const rawName = value.slice(start + 2, end);\n if (!rawName) {\n searchFrom = end + 1;\n continue;\n }\n\n result += value.slice(lastIndex, start);\n const envVar = rawName.trim();\n const envValue = process.env[envVar];\n if (envValue === undefined) {\n if (keepUnresolvedRefs) {\n result += value.slice(start, end + 1);\n } else {\n throw new Error(`Environment variable \"${envVar}\" is not defined`);\n }\n } else {\n result += envValue;\n }\n lastIndex = end + 1;\n searchFrom = end + 1;\n }\n\n return result + value.slice(lastIndex);\n}\n\nconst multimodalLocateOptionFieldMap: Record<keyof TMultimodalPrompt, true> = {\n images: true,\n convertHttpImage2Base64: true,\n};\n\nconst multimodalLocateOptionKeys = Object.keys(\n multimodalLocateOptionFieldMap,\n) as Array<keyof TMultimodalPrompt>;\n\nfunction extractMultimodalPrompt(\n opt?: LocateOption,\n): Partial<TMultimodalPrompt> | undefined {\n if (typeof opt !== 'object' || opt === null) {\n return undefined;\n }\n\n const entries = multimodalLocateOptionKeys\n .map((key) => [key, opt[key]] as const)\n .filter(([, value]) => value !== undefined);\n\n return entries.length\n ? (Object.fromEntries(entries) as Partial<TMultimodalPrompt>)\n : undefined;\n}\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 interpolateEnvVarRefs(line);\n });\n\n return processedLines.join('\\n');\n}\n\nfunction interpolateYamlScriptEnvVars(content: string): string {\n let inTopLevelTasksBlock = false;\n\n return content\n .split('\\n')\n .map((line) => {\n const trimmedLine = line.trimStart();\n if (!trimmedLine || trimmedLine.startsWith('#')) {\n return line;\n }\n\n const indentSize = line.length - trimmedLine.length;\n if (indentSize === 0) {\n if (topLevelTasksPattern.test(trimmedLine)) {\n inTopLevelTasksBlock = true;\n return line;\n }\n\n if (topLevelYamlKeyPattern.test(trimmedLine)) {\n inTopLevelTasksBlock = false;\n }\n }\n\n return interpolateEnvVarRefs(line, inTopLevelTasksBlock);\n })\n .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 = interpolateYamlScriptEnvVars(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 resolveWebTarget(obj);\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 // Normalize object-form TUserPrompt: when the object only contains a\n // `prompt` string (no multimodal fields like `images`), unwrap it to\n // avoid double nesting like { prompt: { prompt: '...' } }.\n let normalizedLocatePrompt: TUserPrompt = locatePrompt;\n if (\n typeof locatePrompt === 'object' &&\n locatePrompt !== null &&\n 'prompt' in locatePrompt\n ) {\n const { prompt: innerPrompt, ...rest } = locatePrompt;\n const hasMultimodalFields = Object.keys(rest).length > 0;\n normalizedLocatePrompt = hasMultimodalFields ? locatePrompt : innerPrompt;\n }\n\n let prompt = normalizedLocatePrompt || 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 const multimodalPrompt = extractMultimodalPrompt(opt);\n if (multimodalPrompt) {\n prompt =\n typeof prompt === 'string'\n ? {\n prompt,\n ...multimodalPrompt,\n }\n : {\n ...prompt,\n ...multimodalPrompt,\n };\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 multimodalPrompt = extractMultimodalPrompt(opt);\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 const multimodalPromptKeys =\n typeof locateParam?.prompt === 'object' && locateParam?.prompt !== null\n ? Object.keys(multimodalPrompt || {})\n : [];\n\n // Extract all other keys\n for (const key of allKeys) {\n if (\n !locateParamKeys.includes(key) &&\n !multimodalPromptKeys.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","topLevelTasksPattern","topLevelYamlKeyPattern","webTargetSources","resolveWebTarget","config","entries","source","entry","specifiedTargets","Error","target","explicitMode","mode","interpolateEnvVarRefs","value","keepUnresolvedRefs","result","lastIndex","searchFrom","start","end","rawName","envVar","envValue","process","undefined","multimodalLocateOptionFieldMap","multimodalLocateOptionKeys","extractMultimodalPrompt","opt","interpolateEnvVars","content","lines","processedLines","line","trimmedLine","interpolateYamlScriptEnvVars","inTopLevelTasksBlock","indentSize","parseYamlScript","filePath","processedContent","matchedDeviceId","match","deviceId","console","interpolatedContent","yaml","pathTip","assert","Array","buildDetailedLocateParam","locatePrompt","normalizedLocatePrompt","innerPrompt","rest","hasMultimodalFields","prompt","deepLocate","cacheable","xpath","multimodalPrompt","buildDetailedLocateParamAndRestParams","excludeKeys","locateParam","restParams","allKeys","locateParamKeys","multimodalPromptKeys"],"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;;;;;;;;;;;;;;;ACKA,MAAMI,aAAaC,AAAAA,IAAAA,uBAAAA,QAAAA,AAAAA,EAAS;AAE5B,MAAMC,uBAAuB;AAC7B,MAAMC,yBAAyB;AAc/B,MAAMC,mBAAsC;IAC1C;IACA;IACA;IACA;CACD;AAEM,SAASC,iBACdC,MAAuB;IAEvB,MAAMC,UAAUH,iBACb,GAAG,CAAC,CAACI,SAAW;YAACA;YAAQF,MAAM,CAACE,OAAO;SAAC,EACxC,MAAM,CACL,CACEC,QAIG,AAAoB,WAAbA,KAAK,CAAC,EAAE;IAGxB,IAAIF,AAAmB,MAAnBA,QAAQ,MAAM,EAChB;IAGF,IAAIA,QAAQ,MAAM,GAAG,GAAG;QACtB,MAAMG,mBAAmBH,QAAQ,GAAG,CAAC,CAAC,CAACC,OAAO,GAAKA;QACnD,MAAM,IAAIG,MACR,CAAC,qEAAqE,EAAED,iBAAiB,IAAI,CAC3F,MACA,4DAA4D,CAAC;IAEnE;IAEA,MAAM,CAACF,QAAQI,OAAO,GAAGL,OAAO,CAAC,EAAE;IACnC,MAAMM,eAAeD,OAAO,IAAI;IAChC,IACE,AAAwB,WAAjBC,gBACPA,AAAiB,WAAjBA,gBACAA,AAAiB,cAAjBA,cAEA,MAAM,IAAIF,MACR,CAAC,wEAAwE,EAAEE,aAAa,EAAE,CAAC;IAI/F,IAAIL,AAAW,WAAXA,UAAqBK,AAAiB,cAAjBA,cACvB,MAAM,IAAIF,MACR;IAIJ,IAAIH,AAAW,cAAXA,UAAwBK,AAAiB,WAAjBA,cAC1B,MAAM,IAAIF,MACR;IAIJ,MAAMG,OACJN,AAAW,WAAXA,SACI,SACAA,AAAW,cAAXA,SACE,YACCK,gBAAgB;IAEzB,IAAIC,AAAS,WAATA,QAAmBF,OAAO,iBAAiB,EAC7C,MAAM,IAAID,MACR;IAIJ,IACEG,AAAS,cAATA,QACA,AAAyC,WAAlCF,OAAO,sBAAsB,EAEpC,MAAM,IAAID,MACR;IAIJ,OAAO;QACLH;QACAM;QACA,QAAQ;YACN,GAAGF,MAAM;YACTE;QACF;IACF;AACF;AAEA,SAASC,sBACPC,KAAa,EACbC,qBAAqB,KAAK;IAE1B,IAAIC,SAAS;IACb,IAAIC,YAAY;IAChB,IAAIC,aAAa;IAEjB,MAAOA,aAAaJ,MAAM,MAAM,CAAE;QAChC,MAAMK,QAAQL,MAAM,OAAO,CAAC,MAAMI;QAClC,IAAIC,AAAU,OAAVA,OACF;QAGF,MAAMC,MAAMN,MAAM,OAAO,CAAC,KAAKK,QAAQ;QACvC,IAAIC,AAAQ,OAARA,KACF;QAGF,MAAMC,UAAUP,MAAM,KAAK,CAACK,QAAQ,GAAGC;QACvC,IAAI,CAACC,SAAS;YACZH,aAAaE,MAAM;YACnB;QACF;QAEAJ,UAAUF,MAAM,KAAK,CAACG,WAAWE;QACjC,MAAMG,SAASD,QAAQ,IAAI;QAC3B,MAAME,WAAWC,QAAQ,GAAG,CAACF,OAAO;QACpC,IAAIC,AAAaE,WAAbF,UACF,IAAIR,oBACFC,UAAUF,MAAM,KAAK,CAACK,OAAOC,MAAM;aAEnC,MAAM,IAAIX,MAAM,CAAC,sBAAsB,EAAEa,OAAO,gBAAgB,CAAC;aAGnEN,UAAUO;QAEZN,YAAYG,MAAM;QAClBF,aAAaE,MAAM;IACrB;IAEA,OAAOJ,SAASF,MAAM,KAAK,CAACG;AAC9B;AAEA,MAAMS,iCAAwE;IAC5E,QAAQ;IACR,yBAAyB;AAC3B;AAEA,MAAMC,6BAA6BjC,OAAO,IAAI,CAC5CgC;AAGF,SAASE,wBACPC,GAAkB;IAElB,IAAI,AAAe,YAAf,OAAOA,OAAoBA,AAAQ,SAARA,KAC7B;IAGF,MAAMxB,UAAUsB,2BACb,GAAG,CAAC,CAAClC,MAAQ;YAACA;YAAKoC,GAAG,CAACpC,IAAI;SAAC,EAC5B,MAAM,CAAC,CAAC,GAAGqB,MAAM,GAAKA,AAAUW,WAAVX;IAEzB,OAAOT,QAAQ,MAAM,GAChBX,OAAO,WAAW,CAACW,WACpBoB;AACN;AAEO,SAASK,mBAAmBC,OAAe;IAEhD,MAAMC,QAAQD,QAAQ,KAAK,CAAC;IAC5B,MAAME,iBAAiBD,MAAM,GAAG,CAAC,CAACE;QAEhC,MAAMC,cAAcD,KAAK,SAAS;QAClC,IAAIC,YAAY,UAAU,CAAC,MAEzB,OAAOD;QAIT,OAAOrB,sBAAsBqB;IAC/B;IAEA,OAAOD,eAAe,IAAI,CAAC;AAC7B;AAEA,SAASG,6BAA6BL,OAAe;IACnD,IAAIM,uBAAuB;IAE3B,OAAON,QACJ,KAAK,CAAC,MACN,GAAG,CAAC,CAACG;QACJ,MAAMC,cAAcD,KAAK,SAAS;QAClC,IAAI,CAACC,eAAeA,YAAY,UAAU,CAAC,MACzC,OAAOD;QAGT,MAAMI,aAAaJ,KAAK,MAAM,GAAGC,YAAY,MAAM;QACnD,IAAIG,AAAe,MAAfA,YAAkB;YACpB,IAAItC,qBAAqB,IAAI,CAACmC,cAAc;gBAC1CE,uBAAuB;gBACvB,OAAOH;YACT;YAEA,IAAIjC,uBAAuB,IAAI,CAACkC,cAC9BE,uBAAuB;QAE3B;QAEA,OAAOxB,sBAAsBqB,MAAMG;IACrC,GACC,IAAI,CAAC;AACV;AAEO,SAASE,gBACdR,OAAe,EACfS,QAAiB;IAEjB,IAAIC,mBAAmBV;IACvB,IAAIA,AAA+B,OAA/BA,QAAQ,OAAO,CAAC,cAAqBA,QAAQ,KAAK,CAAC,sBAAsB;QAC3E,IAAIW;QACJD,mBAAmBV,QAAQ,OAAO,CAChC,sBACA,CAACY,OAAOC;YACNF,kBAAkBE;YAClB,OAAO,CAAC,WAAW,EAAEA,SAAS,CAAC,CAAC;QAClC;QAEFC,QAAQ,IAAI,CACV,CAAC,yEAAyE,EAAEH,gBAAgB,CAAC,CAAC;IAElG;IACA,MAAMI,sBAAsBV,6BAA6BK;IACzD,MAAM9C,MAAMoD,2BAAAA,IAAS,CAACD,qBAAqB;QACzC,QAAQC,AAAAA,2BAAAA,WAAgB;IAC1B;IAEA,MAAMC,UAAUR,WAAW,CAAC,iBAAiB,EAAEA,UAAU,GAAG;IAC5DrC,iBAAiBR;IACjBsD,IAAAA,sBAAAA,MAAAA,AAAAA,EAAOtD,IAAI,KAAK,EAAE,CAAC,4CAA4C,EAAEqD,SAAS;IAC1EC,IAAAA,sBAAAA,MAAAA,AAAAA,EACEC,MAAM,OAAO,CAACvD,IAAI,KAAK,GACvB,CAAC,0DAA0D,EAAEA,IAAI,KAAK,EAAE;IAE1E,OAAOA;AACT;AAEO,SAASwD,yBACdC,YAAyB,EACzBvB,GAAkB;IAElB/B,WAAW,sCAAsCsD,cAAcvB;IAI/D,IAAIwB,yBAAsCD;IAC1C,IACE,AAAwB,YAAxB,OAAOA,gBACPA,AAAiB,SAAjBA,gBACA,YAAYA,cACZ;QACA,MAAM,EAAE,QAAQE,WAAW,EAAE,GAAGC,MAAM,GAAGH;QACzC,MAAMI,sBAAsB9D,OAAO,IAAI,CAAC6D,MAAM,MAAM,GAAG;QACvDF,yBAAyBG,sBAAsBJ,eAAeE;IAChE;IAEA,IAAIG,SAASJ,0BAA0BxB,KAAK,UAAWA,KAAa;IACpE,IAAI6B,aAAa;IACjB,IAAIC,YAAY;IAChB,IAAIC;IAEJ,IAAI,AAAe,YAAf,OAAO/B,OAAoBA,AAAQ,SAARA,KAAc;QAK3C6B,aAAa7B,IAAI,UAAU,IAAIA,IAAI,SAAS,IAAI;QAChD8B,YAAY9B,IAAI,SAAS,IAAI;QAC7B+B,QAAQ/B,IAAI,KAAK;QACjB,IAAIuB,gBAAgBvB,IAAI,MAAM,IAAIuB,iBAAiBvB,IAAI,MAAM,EAC3DgB,QAAQ,IAAI,CACV,4BACAO,cACAvB,KACA;QAGJ4B,SAASA,UAAU5B,IAAI,MAAM;IAC/B;IAEA,IAAI,CAAC4B,QAAQ,YACX3D,WACE,gEACA+B;IAKJ,MAAMgC,mBAAmBjC,wBAAwBC;IACjD,IAAIgC,kBACFJ,SACE,AAAkB,YAAlB,OAAOA,SACH;QACEA;QACA,GAAGI,gBAAgB;IACrB,IACA;QACE,GAAGJ,MAAM;QACT,GAAGI,gBAAgB;IACrB;IAGR,OAAO;QACLJ;QACAC;QACAC;QACAC;IACF;AACF;AAEO,SAASE,sCACdV,YAAyB,EACzBvB,GAA6B,EAC7BkC,cAAwB,EAAE;IAK1B,MAAMF,mBAAmBjC,wBAAwBC;IACjD,MAAMmC,cAAcb,yBAAyBC,cAAcvB;IAG3D,MAAMoC,aAAkC,CAAC;IAEzC,IAAI,AAAe,YAAf,OAAOpC,OAAoBA,AAAQ,SAARA,KAAc;QAE3C,MAAMqC,UAAUxE,OAAO,IAAI,CAACmC;QAG5B,MAAMsC,kBAAkBzE,OAAO,IAAI,CAACsE,eAAe,CAAC;QACpD,MAAMI,uBACJ,AAA+B,YAA/B,OAAOJ,aAAa,UAAuBA,aAAa,WAAW,OAC/DtE,OAAO,IAAI,CAACmE,oBAAoB,CAAC,KACjC,EAAE;QAGR,KAAK,MAAMpE,OAAOyE,QAChB,IACE,CAACC,gBAAgB,QAAQ,CAAC1E,QAC1B,CAAC2E,qBAAqB,QAAQ,CAAC3E,QAC/B,CAACsE,YAAY,QAAQ,CAACtE,QACtBA,AAAQ,aAARA,KAEAwE,UAAU,CAACxE,IAAI,GAAGoC,GAAG,CAACpC,IAA0B;IAGtD;IAEA,OAAO;QACLuE;QACAC;IACF;AACF"}
|
|
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 { TMultimodalPrompt, TUserPrompt } from '@/common';\nimport type {\n DetailedLocateParam,\n LocateOption,\n MidsceneYamlScript,\n MidsceneYamlScriptWebEnv,\n} from '@/types';\nimport { getDebug } from '@midscene/shared/logger';\nimport { assert } from '@midscene/shared/utils';\nimport yaml from 'js-yaml';\nimport { buildLocatePromptWithContext } from '../agent/prompt-context';\n\nconst debugUtils = getDebug('yaml:utils');\n\nconst topLevelTasksPattern = /^tasks\\s*:/;\nconst topLevelYamlKeyPattern = /^[^\\s#][^:]*:/;\n\nexport type WebTargetSource = 'page' | 'browser' | 'web' | 'target';\n\nexport type ResolvedWebTarget = {\n source: WebTargetSource;\n target: Partial<MidsceneYamlScriptWebEnv> & { mode: 'page' | 'browser' };\n mode: 'page' | 'browser';\n};\n\nexport type WebTargetConfig = Partial<\n Record<WebTargetSource, Partial<MidsceneYamlScriptWebEnv>>\n>;\n\nconst webTargetSources: WebTargetSource[] = [\n 'page',\n 'browser',\n 'web',\n 'target',\n];\n\nexport function resolveWebTarget(\n config: WebTargetConfig,\n): ResolvedWebTarget | undefined {\n const entries = webTargetSources\n .map((source) => [source, config[source]] as const)\n .filter(\n (\n entry,\n ): entry is readonly [\n WebTargetSource,\n Partial<MidsceneYamlScriptWebEnv>,\n ] => typeof entry[1] !== 'undefined',\n );\n\n if (entries.length === 0) {\n return undefined;\n }\n\n if (entries.length > 1) {\n const specifiedTargets = entries.map(([source]) => source);\n throw new Error(\n `[midscene] Only one web target can be specified, but found multiple: ${specifiedTargets.join(\n ', ',\n )}. Please specify only one of: page, browser, web, or target.`,\n );\n }\n\n const [source, target] = entries[0];\n const explicitMode = target.mode;\n if (\n typeof explicitMode !== 'undefined' &&\n explicitMode !== 'page' &&\n explicitMode !== 'browser'\n ) {\n throw new Error(\n `[midscene] web target mode must be either \"page\" or \"browser\", but got \"${explicitMode}\".`,\n );\n }\n\n if (source === 'page' && explicitMode === 'browser') {\n throw new Error(\n '[midscene] page target cannot use mode: browser. Use browser: instead.',\n );\n }\n\n if (source === 'browser' && explicitMode === 'page') {\n throw new Error(\n '[midscene] browser target cannot use mode: page. Use page: instead.',\n );\n }\n\n const mode =\n source === 'page'\n ? 'page'\n : source === 'browser'\n ? 'browser'\n : (explicitMode ?? 'page');\n\n if (mode === 'page' && target.autoFollowNewPage) {\n throw new Error(\n '[midscene] autoFollowNewPage requires browser mode. Use browser: or web.mode: browser.',\n );\n }\n\n if (\n mode === 'browser' &&\n typeof target.forceSameTabNavigation !== 'undefined'\n ) {\n throw new Error(\n '[midscene] forceSameTabNavigation cannot be used in browser mode. Use page: or web.mode: page when same-tab navigation is required.',\n );\n }\n\n return {\n source,\n mode,\n target: {\n ...target,\n mode,\n },\n };\n}\n\nfunction interpolateEnvVarRefs(\n value: string,\n keepUnresolvedRefs = false,\n): string {\n let result = '';\n let lastIndex = 0;\n let searchFrom = 0;\n\n while (searchFrom < value.length) {\n const start = value.indexOf('${', searchFrom);\n if (start === -1) {\n break;\n }\n\n const end = value.indexOf('}', start + 2);\n if (end === -1) {\n break;\n }\n\n const rawName = value.slice(start + 2, end);\n if (!rawName) {\n searchFrom = end + 1;\n continue;\n }\n\n result += value.slice(lastIndex, start);\n const envVar = rawName.trim();\n const envValue = process.env[envVar];\n if (envValue === undefined) {\n if (keepUnresolvedRefs) {\n result += value.slice(start, end + 1);\n } else {\n throw new Error(`Environment variable \"${envVar}\" is not defined`);\n }\n } else {\n result += envValue;\n }\n lastIndex = end + 1;\n searchFrom = end + 1;\n }\n\n return result + value.slice(lastIndex);\n}\n\nconst multimodalLocateOptionFieldMap: Record<keyof TMultimodalPrompt, true> = {\n images: true,\n convertHttpImage2Base64: true,\n};\n\nconst multimodalLocateOptionKeys = Object.keys(\n multimodalLocateOptionFieldMap,\n) as Array<keyof TMultimodalPrompt>;\n\nfunction extractMultimodalPrompt(\n opt?: LocateOption,\n): Partial<TMultimodalPrompt> | undefined {\n if (typeof opt !== 'object' || opt === null) {\n return undefined;\n }\n\n const entries = multimodalLocateOptionKeys\n .map((key) => [key, opt[key]] as const)\n .filter(([, value]) => value !== undefined);\n\n return entries.length\n ? (Object.fromEntries(entries) as Partial<TMultimodalPrompt>)\n : undefined;\n}\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 interpolateEnvVarRefs(line);\n });\n\n return processedLines.join('\\n');\n}\n\nfunction interpolateYamlScriptEnvVars(content: string): string {\n let inTopLevelTasksBlock = false;\n\n return content\n .split('\\n')\n .map((line) => {\n const trimmedLine = line.trimStart();\n if (!trimmedLine || trimmedLine.startsWith('#')) {\n return line;\n }\n\n const indentSize = line.length - trimmedLine.length;\n if (indentSize === 0) {\n if (topLevelTasksPattern.test(trimmedLine)) {\n inTopLevelTasksBlock = true;\n return line;\n }\n\n if (topLevelYamlKeyPattern.test(trimmedLine)) {\n inTopLevelTasksBlock = false;\n }\n }\n\n return interpolateEnvVarRefs(line, inTopLevelTasksBlock);\n })\n .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 = interpolateYamlScriptEnvVars(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 resolveWebTarget(obj);\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 // Normalize object-form TUserPrompt: when the object only contains a\n // `prompt` string (no multimodal fields like `images`), unwrap it to\n // avoid double nesting like { prompt: { prompt: '...' } }.\n let normalizedLocatePrompt: TUserPrompt = locatePrompt;\n if (\n typeof locatePrompt === 'object' &&\n locatePrompt !== null &&\n 'prompt' in locatePrompt\n ) {\n const { prompt: innerPrompt, ...rest } = locatePrompt;\n const hasMultimodalFields = Object.keys(rest).length > 0;\n normalizedLocatePrompt = hasMultimodalFields ? locatePrompt : innerPrompt;\n }\n\n let prompt = normalizedLocatePrompt || 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 const promptDisplay = typeof prompt === 'string' ? prompt : prompt.prompt;\n const context = opt?.context?.trim() || undefined;\n prompt = buildLocatePromptWithContext(prompt, opt?.context);\n\n const multimodalPrompt = extractMultimodalPrompt(opt);\n if (multimodalPrompt) {\n prompt =\n typeof prompt === 'string'\n ? {\n prompt,\n ...multimodalPrompt,\n }\n : {\n ...prompt,\n ...multimodalPrompt,\n };\n }\n\n return {\n prompt,\n ...(context ? { promptDisplay, context } : {}),\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 multimodalPrompt = extractMultimodalPrompt(opt);\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 // `context` has already been merged into the locate prompt.\n const locateParamKeys = Object.keys(locateParam || {});\n const multimodalPromptKeys =\n typeof locateParam?.prompt === 'object' && locateParam?.prompt !== null\n ? Object.keys(multimodalPrompt || {})\n : [];\n\n // Extract all other keys\n for (const key of allKeys) {\n if (\n !locateParamKeys.includes(key) &&\n key !== 'context' &&\n key !== 'deepThink' &&\n !multimodalPromptKeys.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","topLevelTasksPattern","topLevelYamlKeyPattern","webTargetSources","resolveWebTarget","config","entries","source","entry","specifiedTargets","Error","target","explicitMode","mode","interpolateEnvVarRefs","value","keepUnresolvedRefs","result","lastIndex","searchFrom","start","end","rawName","envVar","envValue","process","undefined","multimodalLocateOptionFieldMap","multimodalLocateOptionKeys","extractMultimodalPrompt","opt","interpolateEnvVars","content","lines","processedLines","line","trimmedLine","interpolateYamlScriptEnvVars","inTopLevelTasksBlock","indentSize","parseYamlScript","filePath","processedContent","matchedDeviceId","match","deviceId","console","interpolatedContent","yaml","pathTip","assert","Array","buildDetailedLocateParam","locatePrompt","normalizedLocatePrompt","innerPrompt","rest","hasMultimodalFields","prompt","deepLocate","cacheable","xpath","promptDisplay","context","buildLocatePromptWithContext","multimodalPrompt","buildDetailedLocateParamAndRestParams","excludeKeys","locateParam","restParams","allKeys","locateParamKeys","multimodalPromptKeys"],"mappings":"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"}
|
|
@@ -12,6 +12,7 @@ import { UIObserver, type UIObserverOption } from './ui-observer';
|
|
|
12
12
|
export type AiActOptions = {
|
|
13
13
|
cacheable?: boolean;
|
|
14
14
|
fileChooserAccept?: string | string[];
|
|
15
|
+
fileChooserAllowedDir?: string;
|
|
15
16
|
deepThink?: DeepThinkOption;
|
|
16
17
|
deepLocate?: boolean;
|
|
17
18
|
abortSignal?: AbortSignal;
|
|
@@ -61,6 +62,8 @@ export declare class Agent<InterfaceType extends AbstractInterface = AbstractInt
|
|
|
61
62
|
private get aiActContext();
|
|
62
63
|
private executionDumpIndexByRunner;
|
|
63
64
|
private fullActionSpace;
|
|
65
|
+
private activeFileChooserAccepter?;
|
|
66
|
+
private activeFileChooserAllowedDir?;
|
|
64
67
|
private reportGenerator;
|
|
65
68
|
get page(): InterfaceType;
|
|
66
69
|
/**
|
|
@@ -204,13 +207,13 @@ export declare class Agent<InterfaceType extends AbstractInterface = AbstractInt
|
|
|
204
207
|
* on it too heavily for strict boundary semantics. If you need a stable click
|
|
205
208
|
* target, prefer `center`.
|
|
206
209
|
*/
|
|
207
|
-
aiLocate(prompt: TUserPrompt, opt?: LocateOption): Promise<Pick<LocateResultElement, "rect" | "center">>;
|
|
210
|
+
aiLocate(prompt: TUserPrompt, opt?: LocateOption): Promise<Pick<LocateResultElement, "rect" | "center" | "dpr">>;
|
|
208
211
|
aiAssert(assertion: TUserPrompt, msg?: string, opt?: AgentAssertOpt & ServiceExtractOption): Promise<{
|
|
209
212
|
pass: boolean;
|
|
210
213
|
thought: string | undefined;
|
|
211
214
|
message: string | undefined;
|
|
212
215
|
} | undefined>;
|
|
213
|
-
private
|
|
216
|
+
private aiAssertWithUIContext;
|
|
214
217
|
aiWaitFor(assertion: TUserPrompt, opt?: AgentWaitForOpt): Promise<void>;
|
|
215
218
|
ai(...args: Parameters<typeof this.aiAct>): Promise<string | undefined>;
|
|
216
219
|
runYaml(yamlScriptContent: string): Promise<{
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { AbstractInterface } from '../device';
|
|
2
|
+
export type FileChooserAccept = string | string[];
|
|
3
|
+
export declare function normalizeFileChooserAccept(files: FileChooserAccept): string[];
|
|
4
|
+
export declare function normalizeFileChooserAcceptInAllowedDir(files: FileChooserAccept, allowedDir: string): string[];
|
|
5
|
+
/**
|
|
6
|
+
* Holds the current file chooser configuration for one aiAct execution.
|
|
7
|
+
* Registering new files replaces the previous configuration; callers must
|
|
8
|
+
* clear the accepter when the aiAct scope ends.
|
|
9
|
+
*/
|
|
10
|
+
export declare class FileChooserAccepter {
|
|
11
|
+
private readonly interfaceInstance;
|
|
12
|
+
private registration?;
|
|
13
|
+
constructor(interfaceInstance: AbstractInterface);
|
|
14
|
+
register(files: FileChooserAccept): Promise<void>;
|
|
15
|
+
registerFromAllowedDir(files: FileChooserAccept, allowedDir: string): Promise<void>;
|
|
16
|
+
private replaceAcceptedFiles;
|
|
17
|
+
clear(): Promise<Error | undefined>;
|
|
18
|
+
}
|
|
19
|
+
export declare function withFileChooser<T>(interfaceInstance: AbstractInterface, fileChooserAccept: string[] | undefined, action: () => Promise<T>): Promise<T>;
|
|
@@ -1,2 +1,3 @@
|
|
|
1
1
|
import type { TUserPrompt } from '../ai-model';
|
|
2
2
|
export declare const buildPromptWithContext: (prompt: TUserPrompt, context: string | undefined) => TUserPrompt;
|
|
3
|
+
export declare const buildLocatePromptWithContext: (prompt: TUserPrompt, context: string | undefined) => TUserPrompt;
|
|
@@ -23,6 +23,7 @@ export type ActionReportOptions = {
|
|
|
23
23
|
prompt?: string;
|
|
24
24
|
};
|
|
25
25
|
export { TaskExecutionError };
|
|
26
|
+
export { withFileChooser } from './file-chooser';
|
|
26
27
|
export declare class TaskExecutor {
|
|
27
28
|
interface: AbstractInterface;
|
|
28
29
|
service: Service;
|
|
@@ -136,4 +137,3 @@ export declare class TaskExecutor {
|
|
|
136
137
|
* assertion's before/after screenshots.
|
|
137
138
|
*/
|
|
138
139
|
export declare function recordAndReleaseScreenshotSequence(task: ExecutionTask, uiContext: UIContext | undefined): void;
|
|
139
|
-
export declare function withFileChooser<T>(interfaceInstance: AbstractInterface, fileChooserAccept: string[] | undefined, action: () => Promise<T>): Promise<T>;
|
|
@@ -64,6 +64,7 @@ export interface ChatCompletionAdapter {
|
|
|
64
64
|
resolveImageDetail(input: ChatCompletionCallInput): ImageDetail | undefined;
|
|
65
65
|
extractContentAndReasoning: ExtractContentAndReasoning;
|
|
66
66
|
useReasoningAsContentFallback: boolean;
|
|
67
|
+
replayRawAssistantMessage: boolean;
|
|
67
68
|
}
|
|
68
69
|
type ChatCompletionMessageExtraction = {
|
|
69
70
|
messageExtraction?: {
|
|
@@ -81,6 +82,14 @@ export type ChatCompletionDefinition = ChatCompletionMessageExtraction & {
|
|
|
81
82
|
buildChatCompletionParams?: (input: ChatCompletionCallContext) => ChatCompletionParamsResult;
|
|
82
83
|
resolveImageDetail?: (input: ChatCompletionCallContext) => ImageDetail | undefined;
|
|
83
84
|
useReasoningAsContentFallback?: boolean;
|
|
85
|
+
/**
|
|
86
|
+
* Replay the provider's original assistant message in later planning turns.
|
|
87
|
+
*
|
|
88
|
+
* Enable this only for model families whose API requires opaque response
|
|
89
|
+
* fields (for example, reasoning state or thought signatures) to be passed
|
|
90
|
+
* back unchanged. The default replays Midscene's normalized assistant text.
|
|
91
|
+
*/
|
|
92
|
+
replayRawAssistantMessage?: boolean;
|
|
84
93
|
};
|
|
85
94
|
export type ImagePreprocessDefinition = Partial<ImagePreprocessPolicy>;
|
|
86
95
|
interface PlanningPolicy {
|
|
@@ -19,5 +19,23 @@ export declare const kimiAdapters: {
|
|
|
19
19
|
};
|
|
20
20
|
};
|
|
21
21
|
};
|
|
22
|
+
kimi3: {
|
|
23
|
+
chatCompletion: {
|
|
24
|
+
unsupportedUserConfig: ("reasoningEnabled" | "reasoningBudget")[];
|
|
25
|
+
buildChatCompletionParams: (input: ChatCompletionCallContext) => ChatCompletionParamsResult;
|
|
26
|
+
useReasoningAsContentFallback: true;
|
|
27
|
+
replayRawAssistantMessage: true;
|
|
28
|
+
};
|
|
29
|
+
locate: {
|
|
30
|
+
resultAdapter: {
|
|
31
|
+
coordinates: {
|
|
32
|
+
readonly shape: "point";
|
|
33
|
+
readonly order: "xy";
|
|
34
|
+
readonly normalizedBy: 1;
|
|
35
|
+
};
|
|
36
|
+
parseRawLocateValue: typeof parseKimiRawLocateValue;
|
|
37
|
+
};
|
|
38
|
+
};
|
|
39
|
+
};
|
|
22
40
|
};
|
|
23
41
|
export {};
|
|
@@ -25,6 +25,24 @@ export declare const MODEL_ADAPTER_CONFIGS: {
|
|
|
25
25
|
};
|
|
26
26
|
};
|
|
27
27
|
};
|
|
28
|
+
kimi3: {
|
|
29
|
+
chatCompletion: {
|
|
30
|
+
unsupportedUserConfig: ("reasoningEnabled" | "reasoningBudget")[];
|
|
31
|
+
buildChatCompletionParams: (input: import("../model-adapter/types").ChatCompletionCallContext) => import("../model-adapter/types").ChatCompletionParamsResult;
|
|
32
|
+
useReasoningAsContentFallback: true;
|
|
33
|
+
replayRawAssistantMessage: true;
|
|
34
|
+
};
|
|
35
|
+
locate: {
|
|
36
|
+
resultAdapter: {
|
|
37
|
+
coordinates: {
|
|
38
|
+
readonly shape: "point";
|
|
39
|
+
readonly order: "xy";
|
|
40
|
+
readonly normalizedBy: 1;
|
|
41
|
+
};
|
|
42
|
+
parseRawLocateValue: (input: unknown) => import("../shared/model-locate-result").LocateResultValue;
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
};
|
|
28
46
|
'gpt-5': {
|
|
29
47
|
chatCompletion: {
|
|
30
48
|
unsupportedUserConfig: "reasoningBudget"[];
|
|
@@ -8,4 +8,4 @@ export declare function systemPromptToExtract(options?: {
|
|
|
8
8
|
screenshotIncluded?: boolean;
|
|
9
9
|
referenceImagesIncluded?: boolean;
|
|
10
10
|
}): string;
|
|
11
|
-
export declare const extractDataQueryPrompt: (pageDescription: string, dataQuery: string | Record<string, string
|
|
11
|
+
export declare const extractDataQueryPrompt: (pageDescription: string, dataQuery: string | Record<string, string>, context?: string) => string;
|
|
@@ -10,12 +10,15 @@ type CodexTextInput = {
|
|
|
10
10
|
type CodexImageInput = {
|
|
11
11
|
type: 'image';
|
|
12
12
|
url: string;
|
|
13
|
+
detail?: CodexImageDetail;
|
|
13
14
|
};
|
|
14
15
|
type CodexLocalImageInput = {
|
|
15
16
|
type: 'localImage';
|
|
16
17
|
path: string;
|
|
18
|
+
detail?: CodexImageDetail;
|
|
17
19
|
};
|
|
18
20
|
type CodexTurnInput = CodexTextInput | CodexImageInput | CodexLocalImageInput;
|
|
21
|
+
type CodexImageDetail = 'auto' | 'low' | 'high' | 'original';
|
|
19
22
|
type CodexTurnResult = {
|
|
20
23
|
content: string;
|
|
21
24
|
reasoning_content?: string;
|
|
@@ -28,7 +31,7 @@ export declare const resolveCodexReasoningEffort: ({ reasoningEnabled, modelConf
|
|
|
28
31
|
reasoningEnabled?: TModelReasoningEnabled;
|
|
29
32
|
modelConfig: IModelConfig;
|
|
30
33
|
}) => CodexReasoningEffort | undefined;
|
|
31
|
-
export declare const buildCodexTurnPayloadFromMessages: (messages: ChatCompletionMessageParam[]) => {
|
|
34
|
+
export declare const buildCodexTurnPayloadFromMessages: (messages: ChatCompletionMessageParam[], imageDetailOverride?: CodexImageDetail) => {
|
|
32
35
|
developerInstructions?: string;
|
|
33
36
|
input: CodexTurnInput[];
|
|
34
37
|
};
|
|
@@ -37,6 +40,7 @@ export declare function callAIWithCodexAppServer(messages: ChatCompletionMessage
|
|
|
37
40
|
onChunk?: StreamingCallback;
|
|
38
41
|
reasoningEnabled?: TModelReasoningEnabled;
|
|
39
42
|
abortSignal?: AbortSignal;
|
|
43
|
+
imageDetail?: CodexImageDetail;
|
|
40
44
|
}): Promise<CodexTurnResult>;
|
|
41
45
|
export declare function __shutdownCodexAppServerForTests(): Promise<void>;
|
|
42
46
|
export {};
|
|
@@ -38,6 +38,13 @@ export type AndroidDeviceOpt = {
|
|
|
38
38
|
usePhysicalDisplayIdForScreenshot?: boolean;
|
|
39
39
|
/** Use physical display ID when looking up display information */
|
|
40
40
|
usePhysicalDisplayIdForDisplayLookup?: boolean;
|
|
41
|
+
/**
|
|
42
|
+
* Whether to expose the built-in `RunAdbShell` action in the Android action
|
|
43
|
+
* space.
|
|
44
|
+
*
|
|
45
|
+
* @default true
|
|
46
|
+
*/
|
|
47
|
+
exposeRunAdbShellAction?: boolean;
|
|
41
48
|
/** Custom device actions to register */
|
|
42
49
|
customActions?: DeviceAction<any>[];
|
|
43
50
|
/**
|
|
@@ -376,6 +376,17 @@ export type ActionTapParam = {
|
|
|
376
376
|
locate: LocateResultElement;
|
|
377
377
|
};
|
|
378
378
|
export declare const defineActionTap: (tap: PointerInputPrimitives["tap"]) => DeviceAction<ActionTapParam>;
|
|
379
|
+
export declare const registerFileChooserAcceptParamSchema: z.ZodObject<{
|
|
380
|
+
files: z.ZodUnion<[z.ZodString, z.ZodArray<z.ZodString, "many">]>;
|
|
381
|
+
}, "strip", z.ZodTypeAny, {
|
|
382
|
+
files: string | string[];
|
|
383
|
+
}, {
|
|
384
|
+
files: string | string[];
|
|
385
|
+
}>;
|
|
386
|
+
export type RegisterFileChooserAcceptParam = {
|
|
387
|
+
files: string | string[];
|
|
388
|
+
};
|
|
389
|
+
export declare const defineActionRegisterFileChooserAccept: (register: (files: string | string[]) => Promise<void>) => DeviceAction<RegisterFileChooserAcceptParam>;
|
|
379
390
|
export declare const actionRightClickParamSchema: z.ZodObject<{
|
|
380
391
|
locate: z.ZodObject<{
|
|
381
392
|
prompt: z.ZodUnion<[z.ZodString, z.ZodIntersection<z.ZodObject<{
|
package/dist/types/types.d.ts
CHANGED
|
@@ -465,6 +465,7 @@ export type ExecutionTaskInsightLocate = ExecutionTask<ExecutionTaskInsightLocat
|
|
|
465
465
|
export interface ExecutionTaskInsightQueryParam {
|
|
466
466
|
dataDemand: ServiceExtractParam;
|
|
467
467
|
domIncluded?: boolean | 'visible-only';
|
|
468
|
+
context?: string;
|
|
468
469
|
}
|
|
469
470
|
export interface ExecutionTaskInsightQueryOutput {
|
|
470
471
|
data: any;
|
|
@@ -730,12 +731,13 @@ export interface ReportFileAttributes {
|
|
|
730
731
|
testId: string;
|
|
731
732
|
testDescription: string;
|
|
732
733
|
}
|
|
734
|
+
type SkippedReportFileAttributes = Omit<ReportFileAttributes, 'testStatus'> & {
|
|
735
|
+
testStatus: 'skipped';
|
|
736
|
+
};
|
|
733
737
|
export type ReportFileWithAttributes = {
|
|
734
738
|
reportFilePath: string;
|
|
735
739
|
reportAttributes: ReportFileAttributes;
|
|
736
740
|
} | {
|
|
737
|
-
reportFilePath?:
|
|
738
|
-
reportAttributes:
|
|
739
|
-
testStatus: 'skipped';
|
|
740
|
-
};
|
|
741
|
+
reportFilePath?: undefined;
|
|
742
|
+
reportAttributes: SkippedReportFileAttributes;
|
|
741
743
|
};
|
package/dist/types/yaml.d.ts
CHANGED
|
@@ -4,6 +4,8 @@ import type { AgentOpt, LocateResultElement } from './types';
|
|
|
4
4
|
import type { UIContext } from './types';
|
|
5
5
|
export interface LocateOption extends Partial<TMultimodalPrompt> {
|
|
6
6
|
prompt?: TUserPrompt;
|
|
7
|
+
/** Additional context for this AI request. */
|
|
8
|
+
context?: string;
|
|
7
9
|
deepLocate?: boolean;
|
|
8
10
|
/** @deprecated Use `deepLocate` instead. Kept for backward compatibility. */
|
|
9
11
|
deepThink?: boolean;
|
|
@@ -13,12 +15,18 @@ export interface LocateOption extends Partial<TMultimodalPrompt> {
|
|
|
13
15
|
fileChooserAccept?: string | string[];
|
|
14
16
|
}
|
|
15
17
|
export interface ServiceExtractOption {
|
|
18
|
+
/** Additional context for this AI request. */
|
|
19
|
+
context?: string;
|
|
16
20
|
domIncluded?: boolean | 'visible-only';
|
|
17
21
|
screenshotIncluded?: boolean;
|
|
18
22
|
[key: string]: unknown;
|
|
19
23
|
}
|
|
20
|
-
export interface DetailedLocateParam extends Omit<LocateOption, 'deepThink' | keyof TMultimodalPrompt> {
|
|
24
|
+
export interface DetailedLocateParam extends Omit<LocateOption, 'context' | 'deepThink' | keyof TMultimodalPrompt> {
|
|
21
25
|
prompt: TUserPrompt;
|
|
26
|
+
/** Original prompt text used for user-facing reports. */
|
|
27
|
+
promptDisplay?: string;
|
|
28
|
+
/** Per-call business context used for user-facing reports. */
|
|
29
|
+
context?: string;
|
|
22
30
|
}
|
|
23
31
|
export type ScrollType = 'singleAction' | 'scrollToBottom' | 'scrollToTop' | 'scrollToRight' | 'scrollToLeft' | 'once' | 'untilBottom' | 'untilTop' | 'untilRight' | 'untilLeft';
|
|
24
32
|
export type ActionScrollParam = {
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@midscene/core",
|
|
3
3
|
"description": "Automate browser actions, extract data, and perform assertions using AI. It offers JavaScript SDK, Chrome extension, and support for scripting in YAML. See https://midscenejs.com/ for details.",
|
|
4
|
-
"version": "1.10.8
|
|
4
|
+
"version": "1.10.8",
|
|
5
5
|
"repository": "https://github.com/web-infra-dev/midscene",
|
|
6
6
|
"homepage": "https://midscenejs.com/",
|
|
7
7
|
"main": "./dist/lib/index.js",
|
|
@@ -115,7 +115,7 @@
|
|
|
115
115
|
"semver": "7.5.2",
|
|
116
116
|
"undici": "^6.0.0",
|
|
117
117
|
"zod": "^3.25.1",
|
|
118
|
-
"@midscene/shared": "1.10.8
|
|
118
|
+
"@midscene/shared": "1.10.8"
|
|
119
119
|
},
|
|
120
120
|
"devDependencies": {
|
|
121
121
|
"@rslib/core": "^0.18.3",
|