@midscene/core 1.17.3-beta-20261029072240.0 → 1.17.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/dist/es/agent/task-builder.mjs +1 -2
- package/dist/es/agent/task-builder.mjs.map +1 -1
- package/dist/es/agent/utils.mjs +1 -1
- package/dist/es/dump/execution-recorder.mjs +70 -0
- package/dist/es/dump/execution-recorder.mjs.map +1 -0
- package/dist/es/dump/html-utils.mjs +51 -1
- package/dist/es/dump/html-utils.mjs.map +1 -1
- package/dist/es/dump/report-artifact-reader.mjs +85 -0
- package/dist/es/dump/report-artifact-reader.mjs.map +1 -0
- package/dist/es/dump/report-artifact-store.mjs +164 -0
- package/dist/es/dump/report-artifact-store.mjs.map +1 -0
- package/dist/es/dump/screenshot-store.mjs +40 -15
- package/dist/es/dump/screenshot-store.mjs.map +1 -1
- package/dist/es/dump/test-report-images.mjs +120 -0
- package/dist/es/dump/test-report-images.mjs.map +1 -0
- package/dist/es/report-cli.mjs +8 -7
- package/dist/es/report-cli.mjs.map +1 -1
- package/dist/es/report-generator.mjs +56 -47
- package/dist/es/report-generator.mjs.map +1 -1
- package/dist/es/report-html-template.mjs +1 -1
- package/dist/es/report.mjs +29 -55
- package/dist/es/report.mjs.map +1 -1
- package/dist/es/test-run-report.mjs.map +1 -1
- package/dist/es/utils.mjs +1 -1
- package/dist/lib/agent/task-builder.js +1 -2
- package/dist/lib/agent/task-builder.js.map +1 -1
- package/dist/lib/agent/utils.js +1 -1
- package/dist/lib/dump/execution-recorder.js +104 -0
- package/dist/lib/dump/execution-recorder.js.map +1 -0
- package/dist/lib/dump/html-utils.js +67 -5
- package/dist/lib/dump/html-utils.js.map +1 -1
- package/dist/lib/dump/report-artifact-reader.js +134 -0
- package/dist/lib/dump/report-artifact-reader.js.map +1 -0
- package/dist/lib/dump/report-artifact-store.js +204 -0
- package/dist/lib/dump/report-artifact-store.js.map +1 -0
- package/dist/lib/dump/screenshot-store.js +42 -14
- package/dist/lib/dump/screenshot-store.js.map +1 -1
- package/dist/lib/dump/test-report-images.js +154 -0
- package/dist/lib/dump/test-report-images.js.map +1 -0
- package/dist/lib/report-cli.js +8 -7
- package/dist/lib/report-cli.js.map +1 -1
- package/dist/lib/report-generator.js +54 -45
- package/dist/lib/report-generator.js.map +1 -1
- package/dist/lib/report-html-template.js +1 -1
- package/dist/lib/report.js +54 -56
- package/dist/lib/report.js.map +1 -1
- package/dist/lib/test-run-report.js.map +1 -1
- package/dist/lib/utils.js +1 -1
- package/dist/types/agent/task-builder.d.ts.map +1 -1
- package/dist/types/dump/execution-recorder.d.ts +23 -0
- package/dist/types/dump/execution-recorder.d.ts.map +1 -0
- package/dist/types/dump/html-utils.d.ts +9 -0
- package/dist/types/dump/html-utils.d.ts.map +1 -1
- package/dist/types/dump/report-artifact-reader.d.ts +19 -0
- package/dist/types/dump/report-artifact-reader.d.ts.map +1 -0
- package/dist/types/dump/report-artifact-store.d.ts +22 -0
- package/dist/types/dump/report-artifact-store.d.ts.map +1 -0
- package/dist/types/dump/screenshot-store.d.ts +6 -0
- package/dist/types/dump/screenshot-store.d.ts.map +1 -1
- package/dist/types/dump/test-report-images.d.ts +14 -0
- package/dist/types/dump/test-report-images.d.ts.map +1 -0
- package/dist/types/report-cli.d.ts.map +1 -1
- package/dist/types/report-generator.d.ts +4 -3
- package/dist/types/report-generator.d.ts.map +1 -1
- package/dist/types/report.d.ts +3 -0
- package/dist/types/report.d.ts.map +1 -1
- package/dist/types/test-run-report.d.ts +2 -0
- package/dist/types/test-run-report.d.ts.map +1 -1
- package/package.json +2 -2
|
@@ -298,8 +298,7 @@ class TaskBuilder {
|
|
|
298
298
|
rectFromXpath = await this.interface.rectMatchesCacheFeature({
|
|
299
299
|
xpaths: [
|
|
300
300
|
locateParam.xpath
|
|
301
|
-
]
|
|
302
|
-
allowShadowHost: true
|
|
301
|
+
]
|
|
303
302
|
});
|
|
304
303
|
} catch {}
|
|
305
304
|
const elementFromXpath = rectFromXpath ? (0, external_utils_js_namespaceObject.transformLogicalElementToScreenshot)({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent/task-builder.js","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../../src/agent/task-builder.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 { findAllMidsceneLocatorField, parseActionParam } from '@/ai-model';\nimport type { ModelRuntime } from '@/ai-model/models';\nimport {\n type TMultimodalPrompt,\n findActionInActionSpaceOrThrow,\n userPromptToMultimodalPrompt,\n userPromptToString,\n validateRequiredLocateFields,\n} from '@/common';\nimport { type AbstractInterface, defineActionSleep } from '@/device';\nimport type Service from '@/service';\nimport { setTimingFieldOnce } from '@/task-timing';\nimport type {\n AIUsageInfo,\n DetailedLocateParam,\n DeviceAction,\n ElementCacheFeature,\n ExecutionTaskActionApply,\n ExecutionTaskApply,\n ExecutionTaskHitBy,\n ExecutionTaskPlanningLocateApply,\n LocateResultElement,\n LocateResultWithDump,\n PlanningAction,\n Rect,\n ServiceDump,\n} from '@/types';\nimport { ServiceError } from '@/types';\nimport { getDebug } from '@midscene/shared/logger';\nimport { assert } from '@midscene/shared/utils';\nimport type { ActionReadiness } from './action-readiness';\nimport type { TaskCache } from './task-cache';\nimport { withUsageIntent } from './usage-intent';\nimport {\n ifLocateParamHasLocatedPixelResult,\n matchElementFromCache,\n matchElementFromPlan,\n transformLogicalElementToScreenshot,\n} from './utils';\n\nconst debug = getDebug('agent:task-builder');\n\n/**\n * Check if a cache object is non-empty\n */\nfunction hasNonEmptyCache(cache: unknown): boolean {\n return (\n cache !== null &&\n cache !== undefined &&\n typeof cache === 'object' &&\n Object.keys(cache).length > 0\n );\n}\n\nfunction invalidLocateElementReason(\n element: LocateResultElement,\n): string | undefined {\n const values = [element.center?.[0], element.center?.[1]];\n if (\n element.center?.length !== 2 ||\n values.some((value) => typeof value !== 'number' || !Number.isFinite(value))\n ) {\n return `Invalid locate result coordinates: ${JSON.stringify(element)}`;\n }\n return undefined;\n}\n\ntype LocateParamWithDeprecatedAlias = DetailedLocateParam & {\n deepThink?: boolean;\n};\n\nfunction normalizeLocateParam(\n param: string | DetailedLocateParam,\n): DetailedLocateParam {\n if (typeof param === 'string') {\n return { prompt: param };\n }\n\n const { deepThink, ...rest } = param as LocateParamWithDeprecatedAlias;\n const deepLocate = rest.deepLocate ?? deepThink;\n\n return deepLocate === undefined ? rest : { ...rest, deepLocate };\n}\n\nexport function locatePlanForLocate(param: string | DetailedLocateParam) {\n const locate = normalizeLocateParam(param);\n const locatePlan: PlanningAction<DetailedLocateParam> = {\n type: 'Locate',\n param: locate,\n thought: '',\n };\n return locatePlan;\n}\n\ninterface TaskBuilderDeps {\n getDefaultModelRuntime: () => ModelRuntime;\n interfaceInstance: AbstractInterface;\n service: Service;\n taskCache?: TaskCache;\n actionSpace: DeviceAction[];\n waitAfterAction?: number;\n actionReadiness?: ActionReadiness;\n operationResource?: object;\n}\n\ninterface BuildOptions {\n cacheable?: boolean;\n multimodalPrompt?: TMultimodalPrompt;\n deepLocate?: boolean;\n abortSignal?: AbortSignal;\n}\n\ninterface PlanBuildContext {\n tasks: ExecutionTaskApply[];\n planningModel: ModelRuntime;\n locateModel: ModelRuntime;\n cacheable?: boolean;\n multimodalPrompt?: TMultimodalPrompt;\n deepLocate?: boolean;\n abortSignal?: AbortSignal;\n}\n\nexport class TaskBuilder {\n private readonly interface: AbstractInterface;\n\n private readonly service: Service;\n private readonly getDefaultModelRuntime: () => ModelRuntime;\n\n private readonly taskCache?: TaskCache;\n\n private readonly actionSpace: DeviceAction[];\n\n private readonly waitAfterAction?: number;\n private readonly actionReadiness?: ActionReadiness;\n private readonly operationResource: object;\n\n constructor({\n getDefaultModelRuntime,\n interfaceInstance,\n service,\n taskCache,\n actionSpace,\n waitAfterAction,\n actionReadiness,\n operationResource,\n }: TaskBuilderDeps) {\n this.getDefaultModelRuntime = getDefaultModelRuntime;\n this.interface = interfaceInstance;\n this.service = service;\n this.taskCache = taskCache;\n this.actionSpace = actionSpace;\n this.waitAfterAction = waitAfterAction;\n this.actionReadiness = actionReadiness;\n this.operationResource = operationResource ?? interfaceInstance;\n }\n\n public async build(\n plans: PlanningAction[],\n planningModel: ModelRuntime,\n locateModel: ModelRuntime,\n options?: BuildOptions,\n ): Promise<{ tasks: ExecutionTaskApply[] }> {\n const tasks: ExecutionTaskApply[] = [];\n const cacheable = options?.cacheable;\n\n const context: PlanBuildContext = {\n tasks,\n planningModel,\n locateModel,\n cacheable,\n multimodalPrompt: options?.multimodalPrompt,\n deepLocate: options?.deepLocate,\n abortSignal: options?.abortSignal,\n };\n\n type PlanHandler = (plan: PlanningAction) => Promise<void> | void;\n\n const planHandlers = new Map<string, PlanHandler>([\n [\n 'Locate',\n (plan) =>\n this.handleLocatePlan(\n plan as PlanningAction<DetailedLocateParam>,\n context,\n ),\n ],\n ['Finished', (plan) => this.handleFinishedPlan(plan, context)],\n ]);\n\n const defaultHandler: PlanHandler = (plan) =>\n this.handleActionPlan(plan, context);\n\n for (const plan of plans) {\n context.abortSignal?.throwIfAborted();\n const handler = planHandlers.get(plan.type) ?? defaultHandler;\n await handler(plan);\n }\n\n return {\n tasks,\n };\n }\n\n private handleFinishedPlan(\n plan: PlanningAction,\n context: PlanBuildContext,\n ): void {\n const taskActionFinished: ExecutionTaskActionApply<null> = {\n type: 'Action Space',\n subType: 'Finished',\n param: null,\n thought: plan.thought,\n executor: async () => {},\n };\n context.tasks.push(taskActionFinished);\n }\n\n private async handleLocatePlan(\n plan: PlanningAction<DetailedLocateParam>,\n context: PlanBuildContext,\n ): Promise<void> {\n const taskLocate = this.createLocateTask(plan, plan.param, context);\n context.tasks.push(taskLocate);\n }\n\n private async handleActionPlan(\n plan: PlanningAction,\n context: PlanBuildContext,\n ): Promise<void> {\n const planType = plan.type;\n const actionSpace = this.actionSpace;\n const action = findActionInActionSpaceOrThrow(planType, actionSpace);\n const param = plan.param;\n\n const locateFields = findAllMidsceneLocatorField(action.paramSchema);\n\n validateRequiredLocateFields(param, action.paramSchema);\n\n locateFields.forEach((field) => {\n if (param?.[field]) {\n // Always use createLocateTask for all locate params.\n // This ensures cache writing happens even when locatedPixelResult is available\n const locatePlan = locatePlanForLocate(param[field]);\n debug(\n 'will prepend locate param for field',\n `action.type=${planType}`,\n `param=${JSON.stringify(param[field])}`,\n `locatePlan=${JSON.stringify(locatePlan)}`,\n `hasLocatedPixelResult=${ifLocateParamHasLocatedPixelResult(param[field])}`,\n );\n const locateTask = this.createLocateTask(\n locatePlan,\n param[field],\n context,\n (result) => {\n param[field] = result;\n },\n );\n context.tasks.push(locateTask);\n } else {\n debug(`field '${field}' is not provided for action ${planType}`);\n }\n });\n\n const task: ExecutionTaskApply<\n 'Action Space',\n any,\n { success: boolean; action: string; param: any },\n void\n > = {\n type: 'Action Space',\n subType: planType,\n thought: plan.thought,\n param: plan.param,\n planningFeedbackMaxLength: action.planningFeedbackMaxLength,\n executor: async (taskContext) => {\n const abortSignal = context.abortSignal ?? taskContext.signal;\n const timing = taskContext.task.timing;\n\n debug(\n 'executing action',\n planType,\n param,\n `taskContext.element.center: ${taskContext.element?.center}`,\n );\n\n const uiContext = taskContext.uiContext;\n assert(uiContext, 'uiContext is required for Action task');\n\n validateRequiredLocateFields(param, action.paramSchema);\n\n const { shrunkShotToLogicalRatio } = uiContext;\n if (shrunkShotToLogicalRatio === undefined) {\n throw new Error(\n 'shrunkShotToLogicalRatio is not defined in Action task',\n );\n }\n const parsedParam = (() => {\n if (!action.paramSchema) return param;\n try {\n return parseActionParam(param, action.paramSchema, {\n shrunkShotToLogicalRatio,\n });\n } catch (error: any) {\n throw new Error(\n `Invalid parameters for action ${action.name}: ${error.message}\\nParameters: ${JSON.stringify(param)}`,\n { cause: error },\n );\n }\n })();\n\n const useDefaultWait = !this.actionReadiness;\n taskContext.task.actionReadiness = useDefaultWait\n ? 'default'\n : 'custom';\n abortSignal?.throwIfAborted();\n\n setTimingFieldOnce(timing, 'beforeInvokeActionHookStart');\n const delayBeforeRunner = useDefaultWait\n ? (action.delayBeforeRunner ?? 200)\n : 0;\n try {\n const preparation = await Promise.allSettled([\n this.interface.beforeInvokeAction?.(\n action.name,\n param,\n abortSignal,\n ),\n delayBeforeRunner > 0\n ? defineActionSleep(abortSignal).call({\n timeMs: delayBeforeRunner,\n })\n : Promise.resolve(),\n ]);\n const rejected = preparation.find(\n (item) => item.status === 'rejected',\n );\n if (rejected?.status === 'rejected') throw rejected.reason;\n } catch (originalError: any) {\n throw new Error(\n `error in running beforeInvokeAction for ${action.name}: ${originalError?.message || String(originalError)}`,\n { cause: originalError },\n );\n } finally {\n setTimingFieldOnce(timing, 'beforeInvokeActionHookEnd');\n }\n\n abortSignal?.throwIfAborted();\n setTimingFieldOnce(timing, 'callActionStart');\n debug('calling action', action.name);\n const actionResult = await action.call.call(\n this.interface,\n parsedParam,\n useDefaultWait\n ? { ...taskContext, signal: abortSignal }\n : { ...taskContext, signal: abortSignal, skipDefaultWait: true },\n );\n setTimingFieldOnce(timing, 'callActionEnd');\n debug('called action', action.name, 'result:', actionResult);\n abortSignal?.throwIfAborted();\n\n setTimingFieldOnce(timing, 'afterInvokeActionHookStart');\n setTimingFieldOnce(timing, 'waitForActionReadyStart');\n try {\n if (useDefaultWait) {\n const delayAfterRunner =\n action.delayAfterRunner ?? this.waitAfterAction ?? 300;\n if (delayAfterRunner > 0)\n await defineActionSleep(abortSignal).call({\n timeMs: delayAfterRunner,\n });\n await this.interface.defaultActionWait?.(\n action.name,\n parsedParam,\n abortSignal,\n );\n } else {\n await this.actionReadiness!.wait(\n {\n id: taskContext.task.taskId,\n name: action.name,\n param: parsedParam,\n },\n abortSignal,\n this.operationResource,\n );\n }\n } finally {\n setTimingFieldOnce(timing, 'waitForActionReadyEnd');\n }\n abortSignal?.throwIfAborted();\n try {\n await this.interface.afterInvokeAction?.(\n action.name,\n parsedParam,\n abortSignal,\n );\n } catch (originalError: any) {\n throw new Error(\n `error in running afterInvokeAction for ${action.name}: ${originalError?.message || String(originalError)}`,\n { cause: originalError },\n );\n } finally {\n setTimingFieldOnce(timing, 'afterInvokeActionHookEnd');\n }\n return { output: actionResult };\n },\n };\n\n context.tasks.push(task);\n }\n\n private createLocateTask(\n plan: PlanningAction<DetailedLocateParam>,\n detailedLocateParam: DetailedLocateParam | string,\n context: PlanBuildContext,\n onResult?: (result: LocateResultElement) => void,\n ): ExecutionTaskPlanningLocateApply {\n const { cacheable, locateModel, deepLocate } = context;\n\n let locateParam = normalizeLocateParam(detailedLocateParam);\n\n // Planning produces text locators; carry the user's reference images into\n // independent grounding calls while preserving explicit locator images.\n if (\n context.multimodalPrompt?.images?.length &&\n locateParam.prompt &&\n !userPromptToMultimodalPrompt(locateParam.prompt)?.images?.length\n ) {\n locateParam = {\n ...locateParam,\n prompt: {\n ...context.multimodalPrompt,\n prompt: userPromptToString(locateParam.prompt),\n },\n };\n }\n\n if (cacheable !== undefined) {\n locateParam = {\n ...locateParam,\n cacheable,\n };\n }\n\n if (deepLocate && !locateParam.deepLocate) {\n locateParam = {\n ...locateParam,\n deepLocate: true,\n };\n }\n\n const taskLocator: ExecutionTaskPlanningLocateApply = {\n type: 'Planning',\n subType: 'Locate',\n param: locateParam,\n thought: plan.thought,\n executor: async (taskContext) => {\n const abortSignal = context.abortSignal ?? taskContext.signal;\n abortSignal?.throwIfAborted();\n const { task } = taskContext;\n let { uiContext } = taskContext;\n const paramWithLocatedPixelResult = ifLocateParamHasLocatedPixelResult(\n locateParam,\n )\n ? locateParam\n : undefined;\n\n assert(\n locateParam?.prompt || paramWithLocatedPixelResult,\n `No prompt or id or position or locatedPixelResult to locate, param=${JSON.stringify(\n locateParam,\n )}`,\n );\n\n if (!uiContext) {\n uiContext = await this.service.contextRetrieverFn(abortSignal);\n abortSignal?.throwIfAborted();\n }\n\n assert(uiContext, 'uiContext is required for Service task');\n\n const { shrunkShotToLogicalRatio } = uiContext;\n\n if (shrunkShotToLogicalRatio === undefined) {\n throw new Error(\n 'shrunkShotToLogicalRatio is not defined in locate task',\n );\n }\n\n let locateDump: ServiceDump | undefined;\n let locateResult: LocateResultWithDump | undefined;\n\n const applyDump = (dump?: ServiceDump) => {\n if (!dump) {\n return;\n }\n locateDump = dump;\n task.log = {\n dump,\n rawResponse: dump.taskInfo?.rawResponse,\n rawAssistantOutput: dump.taskInfo?.rawAssistantOutput,\n searchAreaRawChoiceMessage:\n dump.taskInfo?.searchAreaRawChoiceMessage,\n };\n task.usage = withUsageIntent(dump.taskInfo?.usage, 'locate');\n task.searchArea = dump.taskInfo?.searchArea;\n if (dump.taskInfo?.searchAreaUsage) {\n // The deepLocate search-area call belongs to the same locate task,\n // so it shares the companion usage intent.\n task.searchAreaUsage = withUsageIntent(\n dump.taskInfo.searchAreaUsage,\n 'locate',\n );\n }\n if (dump.taskInfo?.reasoning_content) {\n task.reasoning_content = dump.taskInfo.reasoning_content;\n }\n };\n\n const planLocatedElement = paramWithLocatedPixelResult\n ? matchElementFromPlan(paramWithLocatedPixelResult)\n : undefined;\n\n // Separate planning normally returns target descriptions, but may still\n // return coordinates. Reuse them even with a dedicated Locate model,\n // preserving the existing direct-plan-hit behavior.\n // when deepLocate is enabled, locatedPixelResult should be used as search\n // area hint, not as a final direct hit\n const elementFromPlan = locateParam.deepLocate\n ? undefined\n : planLocatedElement;\n const isPlanDirectHit = !!elementFromPlan;\n\n // from xpath\n let rectFromXpath: Rect | undefined;\n if (\n !isPlanDirectHit &&\n locateParam.xpath &&\n this.interface.rectMatchesCacheFeature\n ) {\n try {\n rectFromXpath = await this.interface.rectMatchesCacheFeature({\n xpaths: [locateParam.xpath],\n allowShadowHost: true,\n });\n } catch {\n // xpath locate failed, allow fallback to cache or AI locate\n }\n }\n\n const elementFromXpath = rectFromXpath\n ? transformLogicalElementToScreenshot(\n {\n center: [\n rectFromXpath.left + rectFromXpath.width / 2,\n rectFromXpath.top + rectFromXpath.height / 2,\n ],\n description:\n typeof locateParam.prompt === 'string'\n ? locateParam.prompt\n : locateParam.prompt?.prompt || '',\n rect: rectFromXpath,\n },\n shrunkShotToLogicalRatio,\n )\n : undefined;\n\n const isXpathHit = !!elementFromXpath;\n\n const cachePrompt = locateParam.prompt;\n const locateCacheRecord = this.taskCache?.matchLocateCache(cachePrompt);\n const cacheEntry = locateCacheRecord?.cacheContent?.cache;\n\n const elementFromCacheResult =\n isPlanDirectHit || isXpathHit\n ? null\n : await matchElementFromCache(\n {\n taskCache: this.taskCache,\n interfaceInstance: this.interface,\n },\n cacheEntry,\n cachePrompt,\n locateParam.cacheable,\n );\n\n // elementFromCacheResult is in logical coordinates, which should be transformed to screenshot coordinates;\n const elementFromCache = elementFromCacheResult\n ? transformLogicalElementToScreenshot(\n elementFromCacheResult,\n shrunkShotToLogicalRatio,\n )\n : undefined;\n\n const isCacheHit = !!elementFromCache;\n\n let elementFromAiLocate: LocateResultElement | null | undefined;\n const timing = taskContext.task.timing;\n if (!isXpathHit && !isCacheHit && !isPlanDirectHit) {\n try {\n setTimingFieldOnce(timing, 'callAiStart');\n locateResult = await this.service.locate(\n locateParam,\n {\n context: uiContext,\n planLocatedElement,\n },\n locateModel,\n abortSignal,\n );\n applyDump(locateResult.dump);\n elementFromAiLocate = locateResult.element;\n } catch (error) {\n if (error instanceof ServiceError) {\n applyDump(error.dump);\n }\n throw error;\n } finally {\n setTimingFieldOnce(timing, 'callAiEnd');\n }\n }\n\n const element =\n elementFromPlan ||\n elementFromXpath ||\n elementFromCache ||\n elementFromAiLocate;\n\n if (element) {\n const invalidElementReason = invalidLocateElementReason(element);\n if (invalidElementReason) {\n if (locateDump) {\n throw new ServiceError(invalidElementReason, locateDump);\n }\n throw new Error(invalidElementReason);\n }\n }\n\n // Check if locate cache already exists (for planHitFlag case)\n const locateCacheAlreadyExists = hasNonEmptyCache(\n locateCacheRecord?.cacheContent?.cache,\n );\n\n let currentCacheEntry: ElementCacheFeature | undefined;\n // Write cache if:\n // 1. element found\n // 2. taskCache enabled\n // 3. not a cache hit (otherwise we'd be writing what we just read)\n // 4. not already cached for plan hit case (avoid redundant writes), OR allow update if cache validation failed\n // 5. cacheable is not explicitly false\n if (\n element &&\n this.taskCache &&\n !isCacheHit &&\n (!isPlanDirectHit || !locateCacheAlreadyExists) &&\n locateParam.cacheable !== false\n ) {\n if (this.interface.cacheFeatureForPoint) {\n try {\n // Transform coordinates to logical space for cacheFeatureForPoint\n // cacheFeatureForPoint needs logical coordinates to locate elements in DOM\n const pointForCache: [number, number] = [\n Math.round(element.center[0] / shrunkShotToLogicalRatio),\n Math.round(element.center[1] / shrunkShotToLogicalRatio),\n ];\n\n const defaultModel = this.getDefaultModelRuntime();\n const feature = await this.interface.cacheFeatureForPoint(\n pointForCache,\n {\n targetDescription:\n typeof locateParam.prompt === 'string'\n ? locateParam.prompt\n : locateParam.prompt?.prompt,\n modelRuntime: {\n ...defaultModel,\n executionId: locateModel.executionId,\n },\n },\n );\n if (hasNonEmptyCache(feature)) {\n debug(\n 'update cache, prompt: %s, cache: %o',\n cachePrompt,\n feature,\n );\n currentCacheEntry = feature;\n this.taskCache.updateOrAppendCacheRecord(\n {\n type: 'locate',\n prompt: cachePrompt,\n cache: feature,\n },\n locateCacheRecord,\n );\n } else {\n debug(\n 'no cache data returned, skip cache update, prompt: %s',\n cachePrompt,\n );\n }\n } catch (error) {\n debug('cacheFeatureForPoint failed: %s', error);\n }\n } else {\n debug('cacheFeatureForPoint is not supported, skip cache update');\n }\n }\n\n if (!element) {\n if (locateDump) {\n throw new ServiceError(\n `Element not found : ${locateParam.prompt}`,\n locateDump,\n );\n }\n throw new Error(`Element not found: ${locateParam.prompt}`);\n }\n\n let hitBy: ExecutionTaskHitBy | undefined;\n\n if (isPlanDirectHit && paramWithLocatedPixelResult) {\n hitBy = {\n from: 'Plan',\n context: {\n locatedPixelResult:\n paramWithLocatedPixelResult.locatedPixelResult,\n },\n };\n } else if (isXpathHit) {\n hitBy = {\n from: 'User expected path',\n context: {\n xpath: locateParam.xpath,\n },\n };\n } else if (isCacheHit) {\n hitBy = {\n from: 'Cache',\n context: {\n cacheEntry,\n cacheToSave: currentCacheEntry,\n },\n };\n }\n\n const promptDisplay = locateParam.promptDisplay;\n const elementForAction = promptDisplay\n ? {\n ...element,\n description: promptDisplay,\n }\n : element;\n\n if (promptDisplay && locateDump?.matchedElement) {\n locateDump.matchedElement = locateDump.matchedElement.map(\n (matchedElement) => ({\n ...matchedElement,\n description: promptDisplay,\n }),\n );\n }\n\n onResult?.(elementForAction);\n\n return {\n output: {\n element: {\n ...elementForAction,\n // backward compatibility for aiLocate, which return value needs a dpr field\n dpr: uiContext.deprecatedDpr,\n },\n },\n hitBy,\n };\n },\n };\n\n return taskLocator;\n }\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","debug","getDebug","hasNonEmptyCache","cache","invalidLocateElementReason","element","values","value","Number","JSON","normalizeLocateParam","param","deepThink","rest","deepLocate","undefined","locatePlanForLocate","locate","locatePlan","TaskBuilder","plans","planningModel","locateModel","options","tasks","cacheable","context","planHandlers","Map","plan","defaultHandler","handler","taskActionFinished","taskLocate","planType","actionSpace","action","findActionInActionSpaceOrThrow","locateFields","findAllMidsceneLocatorField","validateRequiredLocateFields","field","ifLocateParamHasLocatedPixelResult","locateTask","result","task","taskContext","abortSignal","timing","uiContext","assert","shrunkShotToLogicalRatio","Error","parsedParam","parseActionParam","error","useDefaultWait","setTimingFieldOnce","delayBeforeRunner","preparation","Promise","defineActionSleep","rejected","item","originalError","String","actionResult","delayAfterRunner","detailedLocateParam","onResult","locateParam","userPromptToMultimodalPrompt","userPromptToString","taskLocator","paramWithLocatedPixelResult","locateDump","locateResult","applyDump","dump","withUsageIntent","planLocatedElement","matchElementFromPlan","elementFromPlan","isPlanDirectHit","rectFromXpath","elementFromXpath","transformLogicalElementToScreenshot","isXpathHit","cachePrompt","locateCacheRecord","cacheEntry","elementFromCacheResult","matchElementFromCache","elementFromCache","isCacheHit","elementFromAiLocate","ServiceError","invalidElementReason","locateCacheAlreadyExists","currentCacheEntry","pointForCache","Math","defaultModel","feature","hitBy","promptDisplay","elementForAction","matchedElement","getDefaultModelRuntime","interfaceInstance","service","taskCache","waitAfterAction","actionReadiness","operationResource"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"agent/task-builder.js","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../../src/agent/task-builder.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 { findAllMidsceneLocatorField, parseActionParam } from '@/ai-model';\nimport type { ModelRuntime } from '@/ai-model/models';\nimport {\n type TMultimodalPrompt,\n findActionInActionSpaceOrThrow,\n userPromptToMultimodalPrompt,\n userPromptToString,\n validateRequiredLocateFields,\n} from '@/common';\nimport { type AbstractInterface, defineActionSleep } from '@/device';\nimport type Service from '@/service';\nimport { setTimingFieldOnce } from '@/task-timing';\nimport type {\n AIUsageInfo,\n DetailedLocateParam,\n DeviceAction,\n ElementCacheFeature,\n ExecutionTaskActionApply,\n ExecutionTaskApply,\n ExecutionTaskHitBy,\n ExecutionTaskPlanningLocateApply,\n LocateResultElement,\n LocateResultWithDump,\n PlanningAction,\n Rect,\n ServiceDump,\n} from '@/types';\nimport { ServiceError } from '@/types';\nimport { getDebug } from '@midscene/shared/logger';\nimport { assert } from '@midscene/shared/utils';\nimport type { ActionReadiness } from './action-readiness';\nimport type { TaskCache } from './task-cache';\nimport { withUsageIntent } from './usage-intent';\nimport {\n ifLocateParamHasLocatedPixelResult,\n matchElementFromCache,\n matchElementFromPlan,\n transformLogicalElementToScreenshot,\n} from './utils';\n\nconst debug = getDebug('agent:task-builder');\n\n/**\n * Check if a cache object is non-empty\n */\nfunction hasNonEmptyCache(cache: unknown): boolean {\n return (\n cache !== null &&\n cache !== undefined &&\n typeof cache === 'object' &&\n Object.keys(cache).length > 0\n );\n}\n\nfunction invalidLocateElementReason(\n element: LocateResultElement,\n): string | undefined {\n const values = [element.center?.[0], element.center?.[1]];\n if (\n element.center?.length !== 2 ||\n values.some((value) => typeof value !== 'number' || !Number.isFinite(value))\n ) {\n return `Invalid locate result coordinates: ${JSON.stringify(element)}`;\n }\n return undefined;\n}\n\ntype LocateParamWithDeprecatedAlias = DetailedLocateParam & {\n deepThink?: boolean;\n};\n\nfunction normalizeLocateParam(\n param: string | DetailedLocateParam,\n): DetailedLocateParam {\n if (typeof param === 'string') {\n return { prompt: param };\n }\n\n const { deepThink, ...rest } = param as LocateParamWithDeprecatedAlias;\n const deepLocate = rest.deepLocate ?? deepThink;\n\n return deepLocate === undefined ? rest : { ...rest, deepLocate };\n}\n\nexport function locatePlanForLocate(param: string | DetailedLocateParam) {\n const locate = normalizeLocateParam(param);\n const locatePlan: PlanningAction<DetailedLocateParam> = {\n type: 'Locate',\n param: locate,\n thought: '',\n };\n return locatePlan;\n}\n\ninterface TaskBuilderDeps {\n getDefaultModelRuntime: () => ModelRuntime;\n interfaceInstance: AbstractInterface;\n service: Service;\n taskCache?: TaskCache;\n actionSpace: DeviceAction[];\n waitAfterAction?: number;\n actionReadiness?: ActionReadiness;\n operationResource?: object;\n}\n\ninterface BuildOptions {\n cacheable?: boolean;\n multimodalPrompt?: TMultimodalPrompt;\n deepLocate?: boolean;\n abortSignal?: AbortSignal;\n}\n\ninterface PlanBuildContext {\n tasks: ExecutionTaskApply[];\n planningModel: ModelRuntime;\n locateModel: ModelRuntime;\n cacheable?: boolean;\n multimodalPrompt?: TMultimodalPrompt;\n deepLocate?: boolean;\n abortSignal?: AbortSignal;\n}\n\nexport class TaskBuilder {\n private readonly interface: AbstractInterface;\n\n private readonly service: Service;\n private readonly getDefaultModelRuntime: () => ModelRuntime;\n\n private readonly taskCache?: TaskCache;\n\n private readonly actionSpace: DeviceAction[];\n\n private readonly waitAfterAction?: number;\n private readonly actionReadiness?: ActionReadiness;\n private readonly operationResource: object;\n\n constructor({\n getDefaultModelRuntime,\n interfaceInstance,\n service,\n taskCache,\n actionSpace,\n waitAfterAction,\n actionReadiness,\n operationResource,\n }: TaskBuilderDeps) {\n this.getDefaultModelRuntime = getDefaultModelRuntime;\n this.interface = interfaceInstance;\n this.service = service;\n this.taskCache = taskCache;\n this.actionSpace = actionSpace;\n this.waitAfterAction = waitAfterAction;\n this.actionReadiness = actionReadiness;\n this.operationResource = operationResource ?? interfaceInstance;\n }\n\n public async build(\n plans: PlanningAction[],\n planningModel: ModelRuntime,\n locateModel: ModelRuntime,\n options?: BuildOptions,\n ): Promise<{ tasks: ExecutionTaskApply[] }> {\n const tasks: ExecutionTaskApply[] = [];\n const cacheable = options?.cacheable;\n\n const context: PlanBuildContext = {\n tasks,\n planningModel,\n locateModel,\n cacheable,\n multimodalPrompt: options?.multimodalPrompt,\n deepLocate: options?.deepLocate,\n abortSignal: options?.abortSignal,\n };\n\n type PlanHandler = (plan: PlanningAction) => Promise<void> | void;\n\n const planHandlers = new Map<string, PlanHandler>([\n [\n 'Locate',\n (plan) =>\n this.handleLocatePlan(\n plan as PlanningAction<DetailedLocateParam>,\n context,\n ),\n ],\n ['Finished', (plan) => this.handleFinishedPlan(plan, context)],\n ]);\n\n const defaultHandler: PlanHandler = (plan) =>\n this.handleActionPlan(plan, context);\n\n for (const plan of plans) {\n context.abortSignal?.throwIfAborted();\n const handler = planHandlers.get(plan.type) ?? defaultHandler;\n await handler(plan);\n }\n\n return {\n tasks,\n };\n }\n\n private handleFinishedPlan(\n plan: PlanningAction,\n context: PlanBuildContext,\n ): void {\n const taskActionFinished: ExecutionTaskActionApply<null> = {\n type: 'Action Space',\n subType: 'Finished',\n param: null,\n thought: plan.thought,\n executor: async () => {},\n };\n context.tasks.push(taskActionFinished);\n }\n\n private async handleLocatePlan(\n plan: PlanningAction<DetailedLocateParam>,\n context: PlanBuildContext,\n ): Promise<void> {\n const taskLocate = this.createLocateTask(plan, plan.param, context);\n context.tasks.push(taskLocate);\n }\n\n private async handleActionPlan(\n plan: PlanningAction,\n context: PlanBuildContext,\n ): Promise<void> {\n const planType = plan.type;\n const actionSpace = this.actionSpace;\n const action = findActionInActionSpaceOrThrow(planType, actionSpace);\n const param = plan.param;\n\n const locateFields = findAllMidsceneLocatorField(action.paramSchema);\n\n validateRequiredLocateFields(param, action.paramSchema);\n\n locateFields.forEach((field) => {\n if (param?.[field]) {\n // Always use createLocateTask for all locate params.\n // This ensures cache writing happens even when locatedPixelResult is available\n const locatePlan = locatePlanForLocate(param[field]);\n debug(\n 'will prepend locate param for field',\n `action.type=${planType}`,\n `param=${JSON.stringify(param[field])}`,\n `locatePlan=${JSON.stringify(locatePlan)}`,\n `hasLocatedPixelResult=${ifLocateParamHasLocatedPixelResult(param[field])}`,\n );\n const locateTask = this.createLocateTask(\n locatePlan,\n param[field],\n context,\n (result) => {\n param[field] = result;\n },\n );\n context.tasks.push(locateTask);\n } else {\n debug(`field '${field}' is not provided for action ${planType}`);\n }\n });\n\n const task: ExecutionTaskApply<\n 'Action Space',\n any,\n { success: boolean; action: string; param: any },\n void\n > = {\n type: 'Action Space',\n subType: planType,\n thought: plan.thought,\n param: plan.param,\n planningFeedbackMaxLength: action.planningFeedbackMaxLength,\n executor: async (taskContext) => {\n const abortSignal = context.abortSignal ?? taskContext.signal;\n const timing = taskContext.task.timing;\n\n debug(\n 'executing action',\n planType,\n param,\n `taskContext.element.center: ${taskContext.element?.center}`,\n );\n\n const uiContext = taskContext.uiContext;\n assert(uiContext, 'uiContext is required for Action task');\n\n validateRequiredLocateFields(param, action.paramSchema);\n\n const { shrunkShotToLogicalRatio } = uiContext;\n if (shrunkShotToLogicalRatio === undefined) {\n throw new Error(\n 'shrunkShotToLogicalRatio is not defined in Action task',\n );\n }\n const parsedParam = (() => {\n if (!action.paramSchema) return param;\n try {\n return parseActionParam(param, action.paramSchema, {\n shrunkShotToLogicalRatio,\n });\n } catch (error: any) {\n throw new Error(\n `Invalid parameters for action ${action.name}: ${error.message}\\nParameters: ${JSON.stringify(param)}`,\n { cause: error },\n );\n }\n })();\n\n const useDefaultWait = !this.actionReadiness;\n taskContext.task.actionReadiness = useDefaultWait\n ? 'default'\n : 'custom';\n abortSignal?.throwIfAborted();\n\n setTimingFieldOnce(timing, 'beforeInvokeActionHookStart');\n const delayBeforeRunner = useDefaultWait\n ? (action.delayBeforeRunner ?? 200)\n : 0;\n try {\n const preparation = await Promise.allSettled([\n this.interface.beforeInvokeAction?.(\n action.name,\n param,\n abortSignal,\n ),\n delayBeforeRunner > 0\n ? defineActionSleep(abortSignal).call({\n timeMs: delayBeforeRunner,\n })\n : Promise.resolve(),\n ]);\n const rejected = preparation.find(\n (item) => item.status === 'rejected',\n );\n if (rejected?.status === 'rejected') throw rejected.reason;\n } catch (originalError: any) {\n throw new Error(\n `error in running beforeInvokeAction for ${action.name}: ${originalError?.message || String(originalError)}`,\n { cause: originalError },\n );\n } finally {\n setTimingFieldOnce(timing, 'beforeInvokeActionHookEnd');\n }\n\n abortSignal?.throwIfAborted();\n setTimingFieldOnce(timing, 'callActionStart');\n debug('calling action', action.name);\n const actionResult = await action.call.call(\n this.interface,\n parsedParam,\n useDefaultWait\n ? { ...taskContext, signal: abortSignal }\n : { ...taskContext, signal: abortSignal, skipDefaultWait: true },\n );\n setTimingFieldOnce(timing, 'callActionEnd');\n debug('called action', action.name, 'result:', actionResult);\n abortSignal?.throwIfAborted();\n\n setTimingFieldOnce(timing, 'afterInvokeActionHookStart');\n setTimingFieldOnce(timing, 'waitForActionReadyStart');\n try {\n if (useDefaultWait) {\n const delayAfterRunner =\n action.delayAfterRunner ?? this.waitAfterAction ?? 300;\n if (delayAfterRunner > 0)\n await defineActionSleep(abortSignal).call({\n timeMs: delayAfterRunner,\n });\n await this.interface.defaultActionWait?.(\n action.name,\n parsedParam,\n abortSignal,\n );\n } else {\n await this.actionReadiness!.wait(\n {\n id: taskContext.task.taskId,\n name: action.name,\n param: parsedParam,\n },\n abortSignal,\n this.operationResource,\n );\n }\n } finally {\n setTimingFieldOnce(timing, 'waitForActionReadyEnd');\n }\n abortSignal?.throwIfAborted();\n try {\n await this.interface.afterInvokeAction?.(\n action.name,\n parsedParam,\n abortSignal,\n );\n } catch (originalError: any) {\n throw new Error(\n `error in running afterInvokeAction for ${action.name}: ${originalError?.message || String(originalError)}`,\n { cause: originalError },\n );\n } finally {\n setTimingFieldOnce(timing, 'afterInvokeActionHookEnd');\n }\n return { output: actionResult };\n },\n };\n\n context.tasks.push(task);\n }\n\n private createLocateTask(\n plan: PlanningAction<DetailedLocateParam>,\n detailedLocateParam: DetailedLocateParam | string,\n context: PlanBuildContext,\n onResult?: (result: LocateResultElement) => void,\n ): ExecutionTaskPlanningLocateApply {\n const { cacheable, locateModel, deepLocate } = context;\n\n let locateParam = normalizeLocateParam(detailedLocateParam);\n\n // Planning produces text locators; carry the user's reference images into\n // independent grounding calls while preserving explicit locator images.\n if (\n context.multimodalPrompt?.images?.length &&\n locateParam.prompt &&\n !userPromptToMultimodalPrompt(locateParam.prompt)?.images?.length\n ) {\n locateParam = {\n ...locateParam,\n prompt: {\n ...context.multimodalPrompt,\n prompt: userPromptToString(locateParam.prompt),\n },\n };\n }\n\n if (cacheable !== undefined) {\n locateParam = {\n ...locateParam,\n cacheable,\n };\n }\n\n if (deepLocate && !locateParam.deepLocate) {\n locateParam = {\n ...locateParam,\n deepLocate: true,\n };\n }\n\n const taskLocator: ExecutionTaskPlanningLocateApply = {\n type: 'Planning',\n subType: 'Locate',\n param: locateParam,\n thought: plan.thought,\n executor: async (taskContext) => {\n const abortSignal = context.abortSignal ?? taskContext.signal;\n abortSignal?.throwIfAborted();\n const { task } = taskContext;\n let { uiContext } = taskContext;\n const paramWithLocatedPixelResult = ifLocateParamHasLocatedPixelResult(\n locateParam,\n )\n ? locateParam\n : undefined;\n\n assert(\n locateParam?.prompt || paramWithLocatedPixelResult,\n `No prompt or id or position or locatedPixelResult to locate, param=${JSON.stringify(\n locateParam,\n )}`,\n );\n\n if (!uiContext) {\n uiContext = await this.service.contextRetrieverFn(abortSignal);\n abortSignal?.throwIfAborted();\n }\n\n assert(uiContext, 'uiContext is required for Service task');\n\n const { shrunkShotToLogicalRatio } = uiContext;\n\n if (shrunkShotToLogicalRatio === undefined) {\n throw new Error(\n 'shrunkShotToLogicalRatio is not defined in locate task',\n );\n }\n\n let locateDump: ServiceDump | undefined;\n let locateResult: LocateResultWithDump | undefined;\n\n const applyDump = (dump?: ServiceDump) => {\n if (!dump) {\n return;\n }\n locateDump = dump;\n task.log = {\n dump,\n rawResponse: dump.taskInfo?.rawResponse,\n rawAssistantOutput: dump.taskInfo?.rawAssistantOutput,\n searchAreaRawChoiceMessage:\n dump.taskInfo?.searchAreaRawChoiceMessage,\n };\n task.usage = withUsageIntent(dump.taskInfo?.usage, 'locate');\n task.searchArea = dump.taskInfo?.searchArea;\n if (dump.taskInfo?.searchAreaUsage) {\n // The deepLocate search-area call belongs to the same locate task,\n // so it shares the companion usage intent.\n task.searchAreaUsage = withUsageIntent(\n dump.taskInfo.searchAreaUsage,\n 'locate',\n );\n }\n if (dump.taskInfo?.reasoning_content) {\n task.reasoning_content = dump.taskInfo.reasoning_content;\n }\n };\n\n const planLocatedElement = paramWithLocatedPixelResult\n ? matchElementFromPlan(paramWithLocatedPixelResult)\n : undefined;\n\n // Separate planning normally returns target descriptions, but may still\n // return coordinates. Reuse them even with a dedicated Locate model,\n // preserving the existing direct-plan-hit behavior.\n // when deepLocate is enabled, locatedPixelResult should be used as search\n // area hint, not as a final direct hit\n const elementFromPlan = locateParam.deepLocate\n ? undefined\n : planLocatedElement;\n const isPlanDirectHit = !!elementFromPlan;\n\n // from xpath\n let rectFromXpath: Rect | undefined;\n if (\n !isPlanDirectHit &&\n locateParam.xpath &&\n this.interface.rectMatchesCacheFeature\n ) {\n try {\n rectFromXpath = await this.interface.rectMatchesCacheFeature({\n xpaths: [locateParam.xpath],\n });\n } catch {\n // xpath locate failed, allow fallback to cache or AI locate\n }\n }\n\n const elementFromXpath = rectFromXpath\n ? transformLogicalElementToScreenshot(\n {\n center: [\n rectFromXpath.left + rectFromXpath.width / 2,\n rectFromXpath.top + rectFromXpath.height / 2,\n ],\n description:\n typeof locateParam.prompt === 'string'\n ? locateParam.prompt\n : locateParam.prompt?.prompt || '',\n rect: rectFromXpath,\n },\n shrunkShotToLogicalRatio,\n )\n : undefined;\n\n const isXpathHit = !!elementFromXpath;\n\n const cachePrompt = locateParam.prompt;\n const locateCacheRecord = this.taskCache?.matchLocateCache(cachePrompt);\n const cacheEntry = locateCacheRecord?.cacheContent?.cache;\n\n const elementFromCacheResult =\n isPlanDirectHit || isXpathHit\n ? null\n : await matchElementFromCache(\n {\n taskCache: this.taskCache,\n interfaceInstance: this.interface,\n },\n cacheEntry,\n cachePrompt,\n locateParam.cacheable,\n );\n\n // elementFromCacheResult is in logical coordinates, which should be transformed to screenshot coordinates;\n const elementFromCache = elementFromCacheResult\n ? transformLogicalElementToScreenshot(\n elementFromCacheResult,\n shrunkShotToLogicalRatio,\n )\n : undefined;\n\n const isCacheHit = !!elementFromCache;\n\n let elementFromAiLocate: LocateResultElement | null | undefined;\n const timing = taskContext.task.timing;\n if (!isXpathHit && !isCacheHit && !isPlanDirectHit) {\n try {\n setTimingFieldOnce(timing, 'callAiStart');\n locateResult = await this.service.locate(\n locateParam,\n {\n context: uiContext,\n planLocatedElement,\n },\n locateModel,\n abortSignal,\n );\n applyDump(locateResult.dump);\n elementFromAiLocate = locateResult.element;\n } catch (error) {\n if (error instanceof ServiceError) {\n applyDump(error.dump);\n }\n throw error;\n } finally {\n setTimingFieldOnce(timing, 'callAiEnd');\n }\n }\n\n const element =\n elementFromPlan ||\n elementFromXpath ||\n elementFromCache ||\n elementFromAiLocate;\n\n if (element) {\n const invalidElementReason = invalidLocateElementReason(element);\n if (invalidElementReason) {\n if (locateDump) {\n throw new ServiceError(invalidElementReason, locateDump);\n }\n throw new Error(invalidElementReason);\n }\n }\n\n // Check if locate cache already exists (for planHitFlag case)\n const locateCacheAlreadyExists = hasNonEmptyCache(\n locateCacheRecord?.cacheContent?.cache,\n );\n\n let currentCacheEntry: ElementCacheFeature | undefined;\n // Write cache if:\n // 1. element found\n // 2. taskCache enabled\n // 3. not a cache hit (otherwise we'd be writing what we just read)\n // 4. not already cached for plan hit case (avoid redundant writes), OR allow update if cache validation failed\n // 5. cacheable is not explicitly false\n if (\n element &&\n this.taskCache &&\n !isCacheHit &&\n (!isPlanDirectHit || !locateCacheAlreadyExists) &&\n locateParam.cacheable !== false\n ) {\n if (this.interface.cacheFeatureForPoint) {\n try {\n // Transform coordinates to logical space for cacheFeatureForPoint\n // cacheFeatureForPoint needs logical coordinates to locate elements in DOM\n const pointForCache: [number, number] = [\n Math.round(element.center[0] / shrunkShotToLogicalRatio),\n Math.round(element.center[1] / shrunkShotToLogicalRatio),\n ];\n\n const defaultModel = this.getDefaultModelRuntime();\n const feature = await this.interface.cacheFeatureForPoint(\n pointForCache,\n {\n targetDescription:\n typeof locateParam.prompt === 'string'\n ? locateParam.prompt\n : locateParam.prompt?.prompt,\n modelRuntime: {\n ...defaultModel,\n executionId: locateModel.executionId,\n },\n },\n );\n if (hasNonEmptyCache(feature)) {\n debug(\n 'update cache, prompt: %s, cache: %o',\n cachePrompt,\n feature,\n );\n currentCacheEntry = feature;\n this.taskCache.updateOrAppendCacheRecord(\n {\n type: 'locate',\n prompt: cachePrompt,\n cache: feature,\n },\n locateCacheRecord,\n );\n } else {\n debug(\n 'no cache data returned, skip cache update, prompt: %s',\n cachePrompt,\n );\n }\n } catch (error) {\n debug('cacheFeatureForPoint failed: %s', error);\n }\n } else {\n debug('cacheFeatureForPoint is not supported, skip cache update');\n }\n }\n\n if (!element) {\n if (locateDump) {\n throw new ServiceError(\n `Element not found : ${locateParam.prompt}`,\n locateDump,\n );\n }\n throw new Error(`Element not found: ${locateParam.prompt}`);\n }\n\n let hitBy: ExecutionTaskHitBy | undefined;\n\n if (isPlanDirectHit && paramWithLocatedPixelResult) {\n hitBy = {\n from: 'Plan',\n context: {\n locatedPixelResult:\n paramWithLocatedPixelResult.locatedPixelResult,\n },\n };\n } else if (isXpathHit) {\n hitBy = {\n from: 'User expected path',\n context: {\n xpath: locateParam.xpath,\n },\n };\n } else if (isCacheHit) {\n hitBy = {\n from: 'Cache',\n context: {\n cacheEntry,\n cacheToSave: currentCacheEntry,\n },\n };\n }\n\n const promptDisplay = locateParam.promptDisplay;\n const elementForAction = promptDisplay\n ? {\n ...element,\n description: promptDisplay,\n }\n : element;\n\n if (promptDisplay && locateDump?.matchedElement) {\n locateDump.matchedElement = locateDump.matchedElement.map(\n (matchedElement) => ({\n ...matchedElement,\n description: promptDisplay,\n }),\n );\n }\n\n onResult?.(elementForAction);\n\n return {\n output: {\n element: {\n ...elementForAction,\n // backward compatibility for aiLocate, which return value needs a dpr field\n dpr: uiContext.deprecatedDpr,\n },\n },\n hitBy,\n };\n },\n };\n\n return taskLocator;\n }\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","debug","getDebug","hasNonEmptyCache","cache","invalidLocateElementReason","element","values","value","Number","JSON","normalizeLocateParam","param","deepThink","rest","deepLocate","undefined","locatePlanForLocate","locate","locatePlan","TaskBuilder","plans","planningModel","locateModel","options","tasks","cacheable","context","planHandlers","Map","plan","defaultHandler","handler","taskActionFinished","taskLocate","planType","actionSpace","action","findActionInActionSpaceOrThrow","locateFields","findAllMidsceneLocatorField","validateRequiredLocateFields","field","ifLocateParamHasLocatedPixelResult","locateTask","result","task","taskContext","abortSignal","timing","uiContext","assert","shrunkShotToLogicalRatio","Error","parsedParam","parseActionParam","error","useDefaultWait","setTimingFieldOnce","delayBeforeRunner","preparation","Promise","defineActionSleep","rejected","item","originalError","String","actionResult","delayAfterRunner","detailedLocateParam","onResult","locateParam","userPromptToMultimodalPrompt","userPromptToString","taskLocator","paramWithLocatedPixelResult","locateDump","locateResult","applyDump","dump","withUsageIntent","planLocatedElement","matchElementFromPlan","elementFromPlan","isPlanDirectHit","rectFromXpath","elementFromXpath","transformLogicalElementToScreenshot","isXpathHit","cachePrompt","locateCacheRecord","cacheEntry","elementFromCacheResult","matchElementFromCache","elementFromCache","isCacheHit","elementFromAiLocate","ServiceError","invalidElementReason","locateCacheAlreadyExists","currentCacheEntry","pointForCache","Math","defaultModel","feature","hitBy","promptDisplay","elementForAction","matchedElement","getDefaultModelRuntime","interfaceInstance","service","taskCache","waitAfterAction","actionReadiness","operationResource"],"mappings":"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"}
|
package/dist/lib/agent/utils.js
CHANGED
|
@@ -193,7 +193,7 @@ async function matchElementFromCache(context, cacheEntry, cachePrompt, cacheable
|
|
|
193
193
|
return;
|
|
194
194
|
}
|
|
195
195
|
}
|
|
196
|
-
const getMidsceneVersion = ()=>"1.17.3
|
|
196
|
+
const getMidsceneVersion = ()=>"1.17.3";
|
|
197
197
|
const parsePrompt = (prompt)=>{
|
|
198
198
|
if ('string' == typeof prompt) return {
|
|
199
199
|
textPrompt: prompt,
|
|
@@ -0,0 +1,104 @@
|
|
|
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
|
+
ExecutionRecorder: ()=>ExecutionRecorder
|
|
28
|
+
});
|
|
29
|
+
const external_types_js_namespaceObject = require("../types.js");
|
|
30
|
+
function _define_property(obj, key, value) {
|
|
31
|
+
if (key in obj) Object.defineProperty(obj, key, {
|
|
32
|
+
value: value,
|
|
33
|
+
enumerable: true,
|
|
34
|
+
configurable: true,
|
|
35
|
+
writable: true
|
|
36
|
+
});
|
|
37
|
+
else obj[key] = value;
|
|
38
|
+
return obj;
|
|
39
|
+
}
|
|
40
|
+
class ExecutionRecorder {
|
|
41
|
+
record(execution, meta) {
|
|
42
|
+
this.meta = meta;
|
|
43
|
+
let key = execution.id ? `id:${execution.id}` : this.anonymousKeys.get(execution);
|
|
44
|
+
if (!key) {
|
|
45
|
+
key = `anonymous:${++this.nextAnonymousKey}`;
|
|
46
|
+
this.anonymousKeys.set(execution, key);
|
|
47
|
+
}
|
|
48
|
+
this.records.set(key, execution);
|
|
49
|
+
return key;
|
|
50
|
+
}
|
|
51
|
+
get executions() {
|
|
52
|
+
return [
|
|
53
|
+
...this.records.values()
|
|
54
|
+
];
|
|
55
|
+
}
|
|
56
|
+
get reportMeta() {
|
|
57
|
+
return this.meta;
|
|
58
|
+
}
|
|
59
|
+
toDump(meta = this.meta) {
|
|
60
|
+
if (!meta) throw new Error('Cannot create a report without execution metadata');
|
|
61
|
+
return new external_types_js_namespaceObject.ReportActionDump({
|
|
62
|
+
...meta,
|
|
63
|
+
executions: this.executions
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
capture(executionIds, meta = this.meta) {
|
|
67
|
+
const selected = executionIds ? new Set(executionIds) : void 0;
|
|
68
|
+
const executions = this.executions.filter((execution)=>!selected || execution.id && selected.has(execution.id));
|
|
69
|
+
if (!meta) throw new Error('Cannot capture a report without execution metadata');
|
|
70
|
+
return {
|
|
71
|
+
capturedAt: new Date().toISOString(),
|
|
72
|
+
screenshots: executions.flatMap((execution)=>execution.collectScreenshots()),
|
|
73
|
+
referenceImageUrls: [
|
|
74
|
+
...new Set(executions.flatMap((execution)=>[
|
|
75
|
+
...execution.getReferenceImageUrls()
|
|
76
|
+
]))
|
|
77
|
+
],
|
|
78
|
+
dump: external_types_js_namespaceObject.ReportActionDump.fromSerializedString(new external_types_js_namespaceObject.ReportActionDump({
|
|
79
|
+
...meta,
|
|
80
|
+
executions
|
|
81
|
+
}).serialize())
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
clear() {
|
|
85
|
+
this.records.clear();
|
|
86
|
+
this.anonymousKeys = new WeakMap();
|
|
87
|
+
this.meta = void 0;
|
|
88
|
+
}
|
|
89
|
+
constructor(){
|
|
90
|
+
_define_property(this, "records", new Map());
|
|
91
|
+
_define_property(this, "anonymousKeys", new WeakMap());
|
|
92
|
+
_define_property(this, "nextAnonymousKey", 0);
|
|
93
|
+
_define_property(this, "meta", void 0);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
exports.ExecutionRecorder = __webpack_exports__.ExecutionRecorder;
|
|
97
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
98
|
+
"ExecutionRecorder"
|
|
99
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
100
|
+
Object.defineProperty(exports, '__esModule', {
|
|
101
|
+
value: true
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
//# sourceMappingURL=execution-recorder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dump/execution-recorder.js","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../../src/dump/execution-recorder.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 type { ScreenshotItem } from '../screenshot-item';\nimport {\n type ExecutionDump,\n ReportActionDump,\n type ReportMeta,\n} from '../types';\n\nexport interface ExecutionRecordSnapshot {\n capturedAt: string;\n dump: ReportActionDump;\n screenshots: ScreenshotItem[];\n referenceImageUrls: string[];\n}\n\n/** Execution facts and immutable cutoffs, independent of HTML and file I/O. */\nexport class ExecutionRecorder {\n private readonly records = new Map<string, ExecutionDump>();\n private anonymousKeys = new WeakMap<ExecutionDump, string>();\n private nextAnonymousKey = 0;\n private meta?: ReportMeta;\n\n record(execution: ExecutionDump, meta: ReportMeta): string {\n this.meta = meta;\n let key = execution.id\n ? `id:${execution.id}`\n : this.anonymousKeys.get(execution);\n if (!key) {\n key = `anonymous:${++this.nextAnonymousKey}`;\n this.anonymousKeys.set(execution, key);\n }\n this.records.set(key, execution);\n return key;\n }\n\n get executions(): ExecutionDump[] {\n return [...this.records.values()];\n }\n\n get reportMeta(): ReportMeta | undefined {\n return this.meta;\n }\n\n toDump(meta = this.meta): ReportActionDump {\n if (!meta)\n throw new Error('Cannot create a report without execution metadata');\n return new ReportActionDump({ ...meta, executions: this.executions });\n }\n\n /** Freeze facts before any asynchronous asset writes or subsequent progress. */\n capture(\n executionIds?: readonly string[],\n meta = this.meta,\n ): ExecutionRecordSnapshot {\n const selected = executionIds ? new Set(executionIds) : undefined;\n const executions = this.executions.filter(\n (execution) => !selected || (execution.id && selected.has(execution.id)),\n );\n if (!meta)\n throw new Error('Cannot capture a report without execution metadata');\n return {\n capturedAt: new Date().toISOString(),\n screenshots: executions.flatMap((execution) =>\n execution.collectScreenshots(),\n ),\n referenceImageUrls: [\n ...new Set(\n executions.flatMap((execution) => [\n ...execution.getReferenceImageUrls(),\n ]),\n ),\n ],\n dump: ReportActionDump.fromSerializedString(\n new ReportActionDump({ ...meta, executions }).serialize(),\n ),\n };\n }\n\n clear(): void {\n this.records.clear();\n this.anonymousKeys = new WeakMap();\n this.meta = undefined;\n }\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","ExecutionRecorder","execution","meta","Error","ReportActionDump","executionIds","selected","Set","undefined","executions","Date","WeakMap","Map"],"mappings":";;;IAAAA,oBAAoB,CAAC,GAAG,CAAC,UAASC;QACjC,IAAI,IAAIC,OAAOD,WACR,IAAGD,oBAAoB,CAAC,CAACC,YAAYC,QAAQ,CAACF,oBAAoB,CAAC,CAAC,UAASE,MACzEC,OAAO,cAAc,CAAC,UAASD,KAAK;YAAE,YAAY;YAAM,KAAKD,UAAU,CAACC,IAAI;QAAC;IAGzF;;;ICNAF,oBAAoB,CAAC,GAAG,CAACI,KAAKC,OAAUF,OAAO,SAAS,CAAC,cAAc,CAAC,IAAI,CAACC,KAAKC;;;ICClFL,oBAAoB,CAAC,GAAG,CAAC;QACxB,IAAG,AAAkB,eAAlB,OAAOM,UAA0BA,OAAO,WAAW,EACrDH,OAAO,cAAc,CAAC,UAASG,OAAO,WAAW,EAAE;YAAE,OAAO;QAAS;QAEtEH,OAAO,cAAc,CAAC,UAAS,cAAc;YAAE,OAAO;QAAK;IAC5D;;;;;;;;;;;;;;;;;;ACSO,MAAMI;IAMX,OAAOC,SAAwB,EAAEC,IAAgB,EAAU;QACzD,IAAI,CAAC,IAAI,GAAGA;QACZ,IAAIP,MAAMM,UAAU,EAAE,GAClB,CAAC,GAAG,EAAEA,UAAU,EAAE,EAAE,GACpB,IAAI,CAAC,aAAa,CAAC,GAAG,CAACA;QAC3B,IAAI,CAACN,KAAK;YACRA,MAAM,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,gBAAgB,EAAE;YAC5C,IAAI,CAAC,aAAa,CAAC,GAAG,CAACM,WAAWN;QACpC;QACA,IAAI,CAAC,OAAO,CAAC,GAAG,CAACA,KAAKM;QACtB,OAAON;IACT;IAEA,IAAI,aAA8B;QAChC,OAAO;eAAI,IAAI,CAAC,OAAO,CAAC,MAAM;SAAG;IACnC;IAEA,IAAI,aAAqC;QACvC,OAAO,IAAI,CAAC,IAAI;IAClB;IAEA,OAAOO,OAAO,IAAI,CAAC,IAAI,EAAoB;QACzC,IAAI,CAACA,MACH,MAAM,IAAIC,MAAM;QAClB,OAAO,IAAIC,kCAAAA,gBAAgBA,CAAC;YAAE,GAAGF,IAAI;YAAE,YAAY,IAAI,CAAC,UAAU;QAAC;IACrE;IAGA,QACEG,YAAgC,EAChCH,OAAO,IAAI,CAAC,IAAI,EACS;QACzB,MAAMI,WAAWD,eAAe,IAAIE,IAAIF,gBAAgBG;QACxD,MAAMC,aAAa,IAAI,CAAC,UAAU,CAAC,MAAM,CACvC,CAACR,YAAc,CAACK,YAAaL,UAAU,EAAE,IAAIK,SAAS,GAAG,CAACL,UAAU,EAAE;QAExE,IAAI,CAACC,MACH,MAAM,IAAIC,MAAM;QAClB,OAAO;YACL,YAAY,IAAIO,OAAO,WAAW;YAClC,aAAaD,WAAW,OAAO,CAAC,CAACR,YAC/BA,UAAU,kBAAkB;YAE9B,oBAAoB;mBACf,IAAIM,IACLE,WAAW,OAAO,CAAC,CAACR,YAAc;2BAC7BA,UAAU,qBAAqB;qBACnC;aAEJ;YACD,MAAMG,kCAAAA,gBAAAA,CAAAA,oBAAqC,CACzC,IAAIA,kCAAAA,gBAAgBA,CAAC;gBAAE,GAAGF,IAAI;gBAAEO;YAAW,GAAG,SAAS;QAE3D;IACF;IAEA,QAAc;QACZ,IAAI,CAAC,OAAO,CAAC,KAAK;QAClB,IAAI,CAAC,aAAa,GAAG,IAAIE;QACzB,IAAI,CAAC,IAAI,GAAGH;IACd;;QAjEA,uBAAiB,WAAU,IAAII;QAC/B,uBAAQ,iBAAgB,IAAID;QAC5B,uBAAQ,oBAAmB;QAC3B,uBAAQ,QAAR;;AA+DF"}
|
|
@@ -46,24 +46,29 @@ var __webpack_exports__ = {};
|
|
|
46
46
|
parseDumpScriptAttributes: ()=>parseDumpScriptAttributes,
|
|
47
47
|
extractImageByIdSync: ()=>extractImageByIdSync,
|
|
48
48
|
escapeContent: ()=>escapeContent,
|
|
49
|
-
DATA_SCREENSHOT_MODE_ATTR: ()=>DATA_SCREENSHOT_MODE_ATTR,
|
|
50
|
-
generateDumpScriptTag: ()=>generateDumpScriptTag,
|
|
51
49
|
extractTestRunReportDumpSync: ()=>extractTestRunReportDumpSync,
|
|
50
|
+
generateDumpScriptTag: ()=>generateDumpScriptTag,
|
|
51
|
+
DATA_SCREENSHOT_MODE_ATTR: ()=>DATA_SCREENSHOT_MODE_ATTR,
|
|
52
52
|
STREAMING_CHUNK_SIZE: ()=>STREAMING_CHUNK_SIZE,
|
|
53
|
-
|
|
53
|
+
streamDumpScriptsAsync: ()=>streamDumpScriptsAsync,
|
|
54
54
|
extractLastDumpScriptSync: ()=>extractLastDumpScriptSync,
|
|
55
55
|
generateTestRunReportScriptTag: ()=>generateTestRunReportScriptTag,
|
|
56
|
+
generateReportArtifactScriptTag: ()=>generateReportArtifactScriptTag,
|
|
56
57
|
parseDumpScript: ()=>parseDumpScript,
|
|
58
|
+
streamDumpScriptsSync: ()=>streamDumpScriptsSync,
|
|
59
|
+
extractReportArtifactPathSync: ()=>extractReportArtifactPathSync,
|
|
57
60
|
streamImageScriptsToFile: ()=>streamImageScriptsToFile,
|
|
58
|
-
streamScanTags: ()=>streamScanTags,
|
|
59
|
-
streamScanTagsAsync: ()=>streamScanTagsAsync,
|
|
60
61
|
parseImageScripts: ()=>parseImageScripts,
|
|
61
62
|
extractAllDumpScriptsSync: ()=>extractAllDumpScriptsSync,
|
|
63
|
+
extractReportArtifactPathAsync: ()=>extractReportArtifactPathAsync,
|
|
64
|
+
streamScanTags: ()=>streamScanTags,
|
|
65
|
+
streamScanTagsAsync: ()=>streamScanTagsAsync,
|
|
62
66
|
unescapeContent: ()=>unescapeContent
|
|
63
67
|
});
|
|
64
68
|
var external_node_fs_ = __webpack_require__("node:fs");
|
|
65
69
|
const promises_namespaceObject = require("node:fs/promises");
|
|
66
70
|
const external_node_string_decoder_namespaceObject = require("node:string_decoder");
|
|
71
|
+
const report_artifact_namespaceObject = require("@midscene/shared/report-artifact");
|
|
67
72
|
const utils_namespaceObject = require("@midscene/shared/utils");
|
|
68
73
|
const external_test_run_report_js_namespaceObject = require("../test-run-report.js");
|
|
69
74
|
function _define_property(obj, key, value) {
|
|
@@ -143,6 +148,55 @@ var __webpack_exports__ = {};
|
|
|
143
148
|
function htmlScriptCloseTag() {
|
|
144
149
|
return String.fromCharCode(60) + "/script>";
|
|
145
150
|
}
|
|
151
|
+
function generateReportArtifactScriptTag(path) {
|
|
152
|
+
(0, report_artifact_namespaceObject.assertReportArtifactPath)(path);
|
|
153
|
+
return [
|
|
154
|
+
String.fromCharCode(60),
|
|
155
|
+
'script type="',
|
|
156
|
+
report_artifact_namespaceObject.REPORT_ARTIFACT_SCRIPT_TYPE,
|
|
157
|
+
'">',
|
|
158
|
+
JSON.stringify(path),
|
|
159
|
+
htmlScriptCloseTag()
|
|
160
|
+
].join('');
|
|
161
|
+
}
|
|
162
|
+
function reportArtifactPathExtractor(filePath) {
|
|
163
|
+
let result;
|
|
164
|
+
return {
|
|
165
|
+
get path () {
|
|
166
|
+
return result;
|
|
167
|
+
},
|
|
168
|
+
visit: (content)=>{
|
|
169
|
+
const tagEnd = content.indexOf('>');
|
|
170
|
+
const type = content.slice(0, tagEnd).match(/(?:^|\s)type\s*=\s*["']([^"']+)["']/i)?.[1];
|
|
171
|
+
if (type !== report_artifact_namespaceObject.REPORT_ARTIFACT_SCRIPT_TYPE) return false;
|
|
172
|
+
if (void 0 !== result) throw new Error(`Report contains multiple artifact entries: ${filePath}`);
|
|
173
|
+
const path = JSON.parse(unescapeContent(content.slice(tagEnd + 1)));
|
|
174
|
+
(0, report_artifact_namespaceObject.assertReportArtifactPath)(path);
|
|
175
|
+
result = path;
|
|
176
|
+
return false;
|
|
177
|
+
}
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
function extractReportArtifactPathSync(filePath) {
|
|
181
|
+
const extractor = reportArtifactPathExtractor(filePath);
|
|
182
|
+
streamScanTags(filePath, `${String.fromCharCode(60)}script`, htmlScriptCloseTag(), extractor.visit);
|
|
183
|
+
return extractor.path;
|
|
184
|
+
}
|
|
185
|
+
async function extractReportArtifactPathAsync(filePath) {
|
|
186
|
+
const extractor = reportArtifactPathExtractor(filePath);
|
|
187
|
+
await streamScanTagsAsync(filePath, `${String.fromCharCode(60)}script`, htmlScriptCloseTag(), extractor.visit);
|
|
188
|
+
return extractor.path;
|
|
189
|
+
}
|
|
190
|
+
async function streamDumpScriptsAsync(filePath, visitor) {
|
|
191
|
+
await streamScanTagsAsync(filePath, `${String.fromCharCode(60)}script`, htmlScriptCloseTag(), (content)=>{
|
|
192
|
+
const tagEnd = content.indexOf('>');
|
|
193
|
+
const type = content.slice(0, tagEnd).match(/(?:^|\s)type\s*=\s*["']([^"']+)["']/i)?.[1];
|
|
194
|
+
return 'midscene_web_dump' === type ? visitor({
|
|
195
|
+
openTag: content.slice(0, tagEnd + 1),
|
|
196
|
+
content: content.slice(tagEnd + 1)
|
|
197
|
+
}) : false;
|
|
198
|
+
});
|
|
199
|
+
}
|
|
146
200
|
function generateTestRunReportScriptTag(dump) {
|
|
147
201
|
return [
|
|
148
202
|
String.fromCharCode(60),
|
|
@@ -497,15 +551,19 @@ exports.escapeContent = __webpack_exports__.escapeContent;
|
|
|
497
551
|
exports.extractAllDumpScriptsSync = __webpack_exports__.extractAllDumpScriptsSync;
|
|
498
552
|
exports.extractImageByIdSync = __webpack_exports__.extractImageByIdSync;
|
|
499
553
|
exports.extractLastDumpScriptSync = __webpack_exports__.extractLastDumpScriptSync;
|
|
554
|
+
exports.extractReportArtifactPathAsync = __webpack_exports__.extractReportArtifactPathAsync;
|
|
555
|
+
exports.extractReportArtifactPathSync = __webpack_exports__.extractReportArtifactPathSync;
|
|
500
556
|
exports.extractTestRunReportDumpSync = __webpack_exports__.extractTestRunReportDumpSync;
|
|
501
557
|
exports.generateAgentReportComment = __webpack_exports__.generateAgentReportComment;
|
|
502
558
|
exports.generateDumpScriptTag = __webpack_exports__.generateDumpScriptTag;
|
|
503
559
|
exports.generateImageScriptTag = __webpack_exports__.generateImageScriptTag;
|
|
560
|
+
exports.generateReportArtifactScriptTag = __webpack_exports__.generateReportArtifactScriptTag;
|
|
504
561
|
exports.generateTestRunReportScriptTag = __webpack_exports__.generateTestRunReportScriptTag;
|
|
505
562
|
exports.getBaseUrlFixScript = __webpack_exports__.getBaseUrlFixScript;
|
|
506
563
|
exports.parseDumpScript = __webpack_exports__.parseDumpScript;
|
|
507
564
|
exports.parseDumpScriptAttributes = __webpack_exports__.parseDumpScriptAttributes;
|
|
508
565
|
exports.parseImageScripts = __webpack_exports__.parseImageScripts;
|
|
566
|
+
exports.streamDumpScriptsAsync = __webpack_exports__.streamDumpScriptsAsync;
|
|
509
567
|
exports.streamDumpScriptsSync = __webpack_exports__.streamDumpScriptsSync;
|
|
510
568
|
exports.streamImageScriptsToFile = __webpack_exports__.streamImageScriptsToFile;
|
|
511
569
|
exports.streamScanTags = __webpack_exports__.streamScanTags;
|
|
@@ -519,15 +577,19 @@ for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
|
519
577
|
"extractAllDumpScriptsSync",
|
|
520
578
|
"extractImageByIdSync",
|
|
521
579
|
"extractLastDumpScriptSync",
|
|
580
|
+
"extractReportArtifactPathAsync",
|
|
581
|
+
"extractReportArtifactPathSync",
|
|
522
582
|
"extractTestRunReportDumpSync",
|
|
523
583
|
"generateAgentReportComment",
|
|
524
584
|
"generateDumpScriptTag",
|
|
525
585
|
"generateImageScriptTag",
|
|
586
|
+
"generateReportArtifactScriptTag",
|
|
526
587
|
"generateTestRunReportScriptTag",
|
|
527
588
|
"getBaseUrlFixScript",
|
|
528
589
|
"parseDumpScript",
|
|
529
590
|
"parseDumpScriptAttributes",
|
|
530
591
|
"parseImageScripts",
|
|
592
|
+
"streamDumpScriptsAsync",
|
|
531
593
|
"streamDumpScriptsSync",
|
|
532
594
|
"streamImageScriptsToFile",
|
|
533
595
|
"streamScanTags",
|