@midscene/web 1.16.5 → 1.17.0

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.
@@ -23,7 +23,7 @@ class BridgeClient {
23
23
  ]
24
24
  } : {},
25
25
  query: {
26
- version: "1.16.5"
26
+ version: "1.17.0"
27
27
  }
28
28
  });
29
29
  const timeout = setTimeout(()=>{
@@ -101,7 +101,7 @@ class BridgeServer {
101
101
  logMsg('one client connected');
102
102
  this.socket = socket;
103
103
  const clientVersion = socket.handshake.query.version;
104
- logMsg(`Bridge connected, cli-side version v1.16.5, browser-side version v${clientVersion}`);
104
+ logMsg(`Bridge connected, cli-side version v1.17.0, browser-side version v${clientVersion}`);
105
105
  socket.on(BridgeEvent.CallResponse, (params)=>{
106
106
  const id = params.id;
107
107
  const response = params.response;
@@ -125,7 +125,7 @@ class BridgeServer {
125
125
  setTimeout(()=>{
126
126
  this.onConnect?.();
127
127
  const payload = {
128
- version: "1.16.5"
128
+ version: "1.17.0"
129
129
  };
130
130
  socket.emit(BridgeEvent.Connected, payload);
131
131
  Promise.resolve().then(()=>{
@@ -100,7 +100,7 @@ class ExtensionBridgePageBrowserSide extends page {
100
100
  throw new Error('Connection denied by user');
101
101
  }
102
102
  }
103
- this.onLogMessage(`Bridge connected, cli-side version v${this.bridgeClient.serverVersion}, browser-side version v1.16.5`, 'log');
103
+ this.onLogMessage(`Bridge connected, cli-side version v${this.bridgeClient.serverVersion}, browser-side version v1.17.0`, 'log');
104
104
  }
105
105
  async connect() {
106
106
  return await this.setupBridgeClient();
package/dist/es/cli.mjs CHANGED
@@ -18,7 +18,7 @@ Promise.resolve().then(()=>{
18
18
  return runToolsCLI(tools, 'midscene-web', {
19
19
  stripPrefix: 'web_',
20
20
  argv: parsedOptions.argv,
21
- version: "1.16.5",
21
+ version: "1.17.0",
22
22
  extraCommands: createReportCliCommands()
23
23
  });
24
24
  }).catch((e)=>{
@@ -264,6 +264,7 @@ const commonWebActionsForWebPage = (page, includeTouchEvents = false)=>{
264
264
  }),
265
265
  defineAction({
266
266
  name: 'Reload',
267
+ supportedBySystemOne: true,
267
268
  description: 'Reload the current page',
268
269
  call: async ()=>{
269
270
  if (!page.reload) throw new Error('Reload operation is not supported on this page type');
@@ -273,6 +274,7 @@ const commonWebActionsForWebPage = (page, includeTouchEvents = false)=>{
273
274
  }),
274
275
  defineAction({
275
276
  name: 'GoBack',
277
+ supportedBySystemOne: true,
276
278
  description: 'Navigate back in browser history',
277
279
  call: async ()=>{
278
280
  if (!page.goBack) throw new Error('GoBack operation is not supported on this page type');
@@ -282,6 +284,7 @@ const commonWebActionsForWebPage = (page, includeTouchEvents = false)=>{
282
284
  }),
283
285
  defineAction({
284
286
  name: 'GoForward',
287
+ supportedBySystemOne: true,
285
288
  description: 'Navigate forward in browser history',
286
289
  call: async ()=>{
287
290
  if (!page.goForward) throw new Error('GoForward operation is not supported on this page type');
@@ -1 +1 @@
1
- {"version":3,"file":"web-page.mjs","sources":["../../src/web-page.ts"],"sourcesContent":["import type { Point } from '@midscene/core';\nimport { z } from '@midscene/core';\nimport {\n AbstractInterface,\n type BrowserInputPrimitives,\n type DeviceAction,\n type InputStrategy,\n defineAction,\n defineActionsFromInputPrimitives,\n resolveTextInputOptions,\n sendTextSequentially,\n} from '@midscene/core/device';\n\nimport { sleep } from '@midscene/core/utils';\nimport type { ElementInfo } from '@midscene/shared/extractor';\nimport { transformHotkeyInput } from '@midscene/shared/us-keyboard-layout';\n\nconst navigateParamSchema = z.object({\n url: z\n .string()\n .describe(\n 'The URL to navigate to. Must start with https://, file://, or a similar protocol.',\n ),\n});\n\nfunction normalizeKeyInputs(value: string | string[]): string[] {\n const inputs = Array.isArray(value) ? value : [value];\n const result: string[] = [];\n\n for (const input of inputs) {\n if (typeof input !== 'string') {\n result.push(input as unknown as string);\n continue;\n }\n\n const trimmed = input.trim();\n if (!trimmed) {\n result.push(input);\n continue;\n }\n\n let normalized = trimmed;\n if (normalized.length > 1 && normalized.includes('+')) {\n normalized = normalized.replace(/\\s*\\+\\s*/g, ' ');\n }\n if (/\\s/.test(normalized)) {\n normalized = normalized.replace(/\\s+/g, ' ');\n }\n\n const transformed = transformHotkeyInput(normalized);\n if (transformed.length === 1 && transformed[0] === '' && trimmed !== '') {\n result.push(input);\n continue;\n }\n if (transformed.length === 0) {\n result.push(input);\n continue;\n }\n\n result.push(...transformed);\n }\n\n return result;\n}\n\nexport function getKeyCommands(\n value: string | string[],\n): Array<{ key: string; command?: string }> {\n const keys = normalizeKeyInputs(value);\n\n return keys.reduce((acc: Array<{ key: string; command?: string }>, k) => {\n const includeMeta = keys.includes('Meta') || keys.includes('Control');\n if (includeMeta && (k === 'a' || k === 'A')) {\n return acc.concat([{ key: k, command: 'SelectAll' }]);\n }\n if (includeMeta && (k === 'c' || k === 'C')) {\n return acc.concat([{ key: k, command: 'Copy' }]);\n }\n if (includeMeta && (k === 'v' || k === 'V')) {\n return acc.concat([{ key: k, command: 'Paste' }]);\n }\n return acc.concat([{ key: k }]);\n }, []);\n}\n\n// this is copied from puppeteer, but we don't want to import puppeteer here\nexport declare type KeyInput =\n | '0'\n | '1'\n | '2'\n | '3'\n | '4'\n | '5'\n | '6'\n | '7'\n | '8'\n | '9'\n | 'Power'\n | 'Eject'\n | 'Abort'\n | 'Help'\n | 'Backspace'\n | 'Tab'\n | 'Numpad5'\n | 'NumpadEnter'\n | 'Enter'\n | '\\r'\n | '\\n'\n | 'ShiftLeft'\n | 'ShiftRight'\n | 'ControlLeft'\n | 'ControlRight'\n | 'AltLeft'\n | 'AltRight'\n | 'Pause'\n | 'CapsLock'\n | 'Escape'\n | 'Convert'\n | 'NonConvert'\n | 'Space'\n | 'Numpad9'\n | 'PageUp'\n | 'Numpad3'\n | 'PageDown'\n | 'End'\n | 'Numpad1'\n | 'Home'\n | 'Numpad7'\n | 'ArrowLeft'\n | 'Numpad4'\n | 'Numpad8'\n | 'ArrowUp'\n | 'ArrowRight'\n | 'Numpad6'\n | 'Numpad2'\n | 'ArrowDown'\n | 'Select'\n | 'Open'\n | 'PrintScreen'\n | 'Insert'\n | 'Numpad0'\n | 'Delete'\n | 'NumpadDecimal'\n | 'Digit0'\n | 'Digit1'\n | 'Digit2'\n | 'Digit3'\n | 'Digit4'\n | 'Digit5'\n | 'Digit6'\n | 'Digit7'\n | 'Digit8'\n | 'Digit9'\n | 'KeyA'\n | 'KeyB'\n | 'KeyC'\n | 'KeyD'\n | 'KeyE'\n | 'KeyF'\n | 'KeyG'\n | 'KeyH'\n | 'KeyI'\n | 'KeyJ'\n | 'KeyK'\n | 'KeyL'\n | 'KeyM'\n | 'KeyN'\n | 'KeyO'\n | 'KeyP'\n | 'KeyQ'\n | 'KeyR'\n | 'KeyS'\n | 'KeyT'\n | 'KeyU'\n | 'KeyV'\n | 'KeyW'\n | 'KeyX'\n | 'KeyY'\n | 'KeyZ'\n | 'MetaLeft'\n | 'MetaRight'\n | 'ContextMenu'\n | 'NumpadMultiply'\n | 'NumpadAdd'\n | 'NumpadSubtract'\n | 'NumpadDivide'\n | 'F1'\n | 'F2'\n | 'F3'\n | 'F4'\n | 'F5'\n | 'F6'\n | 'F7'\n | 'F8'\n | 'F9'\n | 'F10'\n | 'F11'\n | 'F12'\n | 'F13'\n | 'F14'\n | 'F15'\n | 'F16'\n | 'F17'\n | 'F18'\n | 'F19'\n | 'F20'\n | 'F21'\n | 'F22'\n | 'F23'\n | 'F24'\n | 'NumLock'\n | 'ScrollLock'\n | 'AudioVolumeMute'\n | 'AudioVolumeDown'\n | 'AudioVolumeUp'\n | 'MediaTrackNext'\n | 'MediaTrackPrevious'\n | 'MediaStop'\n | 'MediaPlayPause'\n | 'Semicolon'\n | 'Equal'\n | 'NumpadEqual'\n | 'Comma'\n | 'Minus'\n | 'Period'\n | 'Slash'\n | 'Backquote'\n | 'BracketLeft'\n | 'Backslash'\n | 'BracketRight'\n | 'Quote'\n | 'AltGraph'\n | 'Props'\n | 'Cancel'\n | 'Clear'\n | 'Shift'\n | 'Control'\n | 'Alt'\n | 'Accept'\n | 'ModeChange'\n | ' '\n | 'Print'\n | 'Execute'\n | '\\u0000'\n | 'a'\n | 'b'\n | 'c'\n | 'd'\n | 'e'\n | 'f'\n | 'g'\n | 'h'\n | 'i'\n | 'j'\n | 'k'\n | 'l'\n | 'm'\n | 'n'\n | 'o'\n | 'p'\n | 'q'\n | 'r'\n | 's'\n | 't'\n | 'u'\n | 'v'\n | 'w'\n | 'x'\n | 'y'\n | 'z'\n | 'Meta'\n | '*'\n | '+'\n | '-'\n | '/'\n | ';'\n | '='\n | ','\n | '.'\n | '`'\n | '['\n | '\\\\'\n | ']'\n | \"'\"\n | 'Attn'\n | 'CrSel'\n | 'ExSel'\n | 'EraseEof'\n | 'Play'\n | 'ZoomOut'\n | ')'\n | '!'\n | '@'\n | '#'\n | '$'\n | '%'\n | '^'\n | '&'\n | '('\n | 'A'\n | 'B'\n | 'C'\n | 'D'\n | 'E'\n | 'F'\n | 'G'\n | 'H'\n | 'I'\n | 'J'\n | 'K'\n | 'L'\n | 'M'\n | 'N'\n | 'O'\n | 'P'\n | 'Q'\n | 'R'\n | 'S'\n | 'T'\n | 'U'\n | 'V'\n | 'W'\n | 'X'\n | 'Y'\n | 'Z'\n | ':'\n | '<'\n | '_'\n | '>'\n | '?'\n | '~'\n | '{'\n | '|'\n | '}'\n | '\"'\n | 'SoftLeft'\n | 'SoftRight'\n | 'Camera'\n | 'Call'\n | 'EndCall'\n | 'VolumeDown'\n | 'VolumeUp';\n\nexport type MouseButton = 'left' | 'right' | 'middle';\n\nexport interface MouseAction {\n click: (\n x: number,\n y: number,\n options: { button: MouseButton; count?: number },\n ) => Promise<void>;\n wheel: (deltaX: number, deltaY: number) => Promise<void>;\n move: (x: number, y: number) => Promise<void>;\n drag: (\n from: { x: number; y: number },\n to: { x: number; y: number },\n ) => Promise<void>;\n}\n\nexport interface KeyboardAction {\n type: (text: string, options?: { delay?: number }) => Promise<void>;\n insertText: (text: string) => Promise<void>;\n press: (\n action:\n | { key: KeyInput; command?: string }\n | { key: KeyInput; command?: string }[],\n ) => Promise<void>;\n}\n\nexport interface ChromePageDestroyOptions {\n closeTab?: boolean; // should close the tab when the page object is destroyed\n}\n\nexport abstract class AbstractWebPage extends AbstractInterface {\n readonly keyboardTypeDelay?: number;\n readonly inputStrategy?: InputStrategy;\n navigate?(url: string): Promise<void>;\n reload?(): Promise<void>;\n goBack?(): Promise<void>;\n goForward?(): Promise<void>;\n stopLoading?(): Promise<void>;\n navigationState?(): Promise<{ isLoading: boolean }>;\n flushPendingVisualUpdate?(force?: boolean): Promise<void>;\n schedulePendingVisualUpdate?(force?: boolean): void;\n waitForDomQuiet?(opts?: {\n quietMs?: number;\n timeoutMs?: number;\n target?: ElementInfo;\n }): Promise<void>;\n\n get mouse(): MouseAction {\n return {\n click: async (\n x: number,\n y: number,\n options: { button: MouseButton },\n ) => {},\n wheel: async (deltaX: number, deltaY: number) => {},\n move: async (x: number, y: number) => {},\n drag: async (\n from: { x: number; y: number },\n to: { x: number; y: number },\n ) => {},\n };\n }\n\n get keyboard(): KeyboardAction {\n return {\n type: async (text: string, options?: { delay?: number }) => {},\n insertText: async (text: string) => {},\n press: async (\n action:\n | { key: KeyInput; command?: string }\n | { key: KeyInput; command?: string }[],\n ) => {},\n };\n }\n\n async clearInput(element?: ElementInfo): Promise<void> {}\n\n async selectAllInput(element?: ElementInfo): Promise<void> {\n throw new Error('Bulk text input is not supported by this web page');\n }\n\n abstract scrollUntilTop(startingPoint?: Point): Promise<void>;\n abstract scrollUntilBottom(startingPoint?: Point): Promise<void>;\n abstract scrollUntilLeft(startingPoint?: Point): Promise<void>;\n abstract scrollUntilRight(startingPoint?: Point): Promise<void>;\n abstract scrollUp(distance?: number, startingPoint?: Point): Promise<void>;\n abstract scrollDown(distance?: number, startingPoint?: Point): Promise<void>;\n abstract scrollLeft(distance?: number, startingPoint?: Point): Promise<void>;\n abstract scrollRight(distance?: number, startingPoint?: Point): Promise<void>;\n abstract longPress(x: number, y: number, duration?: number): Promise<void>;\n abstract swipe(\n from: { x: number; y: number },\n to: { x: number; y: number },\n duration?: number,\n ): Promise<void>;\n abstract pinch(\n centerX: number,\n centerY: number,\n startDistance: number,\n endDistance: number,\n duration?: number,\n ): Promise<void>;\n}\n\nconst scheduleWebVisualUpdate = (\n page: AbstractWebPage,\n force = false,\n): void => {\n if (page.schedulePendingVisualUpdate) {\n if (force) {\n page.schedulePendingVisualUpdate(true);\n } else {\n page.schedulePendingVisualUpdate();\n }\n return;\n }\n\n const pendingRefresh = force\n ? page.flushPendingVisualUpdate?.(true)\n : page.flushPendingVisualUpdate?.();\n void pendingRefresh?.catch(() => undefined);\n};\n\nexport function createWebInputPrimitives(\n page: AbstractWebPage,\n): BrowserInputPrimitives {\n const scheduleVisualUpdate = () => scheduleWebVisualUpdate(page);\n\n return {\n pointer: {\n tap: async ({ x, y }) => {\n await page.mouse.click(x, y, { button: 'left' });\n scheduleVisualUpdate();\n },\n rightClick: async ({ x, y }) => {\n await page.mouse.click(x, y, { button: 'right' });\n scheduleVisualUpdate();\n },\n doubleClick: async ({ x, y }) => {\n await page.mouse.click(x, y, { button: 'left', count: 2 });\n scheduleVisualUpdate();\n },\n hover: async ({ x, y }) => {\n await page.mouse.move(x, y);\n scheduleVisualUpdate();\n },\n dragAndDrop: async (from, to) => {\n await page.mouse.drag(from, to);\n scheduleVisualUpdate();\n },\n longPress: async ({ x, y }, opts) => {\n await page.longPress(x, y, opts?.duration);\n scheduleVisualUpdate();\n },\n },\n keyboard: {\n typeText: async (value, opts) => {\n const element = opts?.target;\n const { inputStrategy, keyboardTypeDelay } = resolveTextInputOptions(\n opts,\n page,\n );\n if (element && opts?.replace !== false) {\n if (inputStrategy === 'bulk') {\n // Keep the current value selected so insertText replaces it in one\n // input operation instead of emitting a separate empty value.\n await page.selectAllInput(element as ElementInfo);\n } else {\n await page.clearInput(element as ElementInfo);\n // Frameworks (React/Vue/etc.) often re-render in response to\n // the `input` event fired by clearing. If that re-render lands\n // between clearInput returning and the first typed character,\n // the keypresses can be dropped. Wait for the DOM to settle\n // before starting to type.\n await page.waitForDomQuiet?.({ target: element as ElementInfo });\n }\n } else if (element && opts?.focusOnly) {\n const target = element as ElementInfo;\n await page.mouse.click(target.center[0], target.center[1], {\n button: 'left',\n });\n await page.keyboard.press([{ key: 'End' }]);\n }\n\n if (opts?.focusOnly) {\n return;\n }\n\n if (inputStrategy === 'bulk') {\n await page.keyboard.insertText(value);\n } else if (inputStrategy === 'sequential') {\n await sendTextSequentially(\n value,\n {\n // The shared loop owns the inter-character delay. Explicitly\n // disable the page default so action-level zero remains\n // effective and positive delays are not applied twice.\n sendCharacter: (character) =>\n page.keyboard.type(character, { delay: 0 }),\n wait: sleep,\n },\n { delayMs: keyboardTypeDelay },\n );\n } else {\n const keyboardTypeOptions =\n keyboardTypeDelay === undefined\n ? undefined\n : { delay: keyboardTypeDelay };\n await page.keyboard.type(value, keyboardTypeOptions);\n }\n scheduleVisualUpdate();\n },\n keyboardPress: async (keyName, opts) => {\n const element = opts?.target as\n | { center: [number, number] }\n | undefined;\n if (element) {\n await page.mouse.click(element.center[0], element.center[1], {\n button: 'left',\n });\n }\n\n const keys = getKeyCommands(keyName);\n await page.keyboard.press(keys as any);\n scheduleVisualUpdate();\n },\n cursorMove: async (direction, times = 1) => {\n const arrowKey = direction === 'left' ? 'ArrowLeft' : 'ArrowRight';\n for (let i = 0; i < times; i++) {\n await page.keyboard.press([{ key: arrowKey as any }]);\n await sleep(100);\n }\n },\n clearInput: async (target) => {\n await page.clearInput(target as ElementInfo | undefined);\n },\n },\n touch: {\n pinch: async ({ x, y }, opts) => {\n await page.pinch(\n x,\n y,\n opts.startDistance,\n opts.endDistance,\n opts.duration,\n );\n },\n swipe: async (from, to, opts) => {\n await page.swipe(from, to, opts?.duration);\n },\n },\n scroll: {\n scroll: async (param) => {\n const element = param.locate;\n const startingPoint = element\n ? {\n left: element.center[0],\n top: element.center[1],\n }\n : undefined;\n const scrollToEventName = param?.scrollType;\n if (scrollToEventName === 'scrollToTop') {\n await page.scrollUntilTop(startingPoint);\n } else if (scrollToEventName === 'scrollToBottom') {\n await page.scrollUntilBottom(startingPoint);\n } else if (scrollToEventName === 'scrollToRight') {\n await page.scrollUntilRight(startingPoint);\n } else if (scrollToEventName === 'scrollToLeft') {\n await page.scrollUntilLeft(startingPoint);\n } else if (scrollToEventName === 'singleAction' || !scrollToEventName) {\n if (param?.direction === 'down' || !param || !param.direction) {\n await page.scrollDown(param?.distance || undefined, startingPoint);\n } else if (param.direction === 'up') {\n await page.scrollUp(param.distance || undefined, startingPoint);\n } else if (param.direction === 'left') {\n await page.scrollLeft(param.distance || undefined, startingPoint);\n } else if (param.direction === 'right') {\n await page.scrollRight(param.distance || undefined, startingPoint);\n } else {\n throw new Error(`Unknown scroll direction: ${param.direction}`);\n }\n await sleep(500);\n } else {\n throw new Error(\n `Unknown scroll event type: ${scrollToEventName}, param: ${JSON.stringify(\n param,\n )}`,\n );\n }\n scheduleVisualUpdate();\n },\n },\n };\n}\n\nexport const commonWebActionsForWebPage = <T extends AbstractWebPage>(\n page: T,\n includeTouchEvents = false,\n): DeviceAction<any>[] => {\n const input = createWebInputPrimitives(page);\n return [\n ...defineActionsFromInputPrimitives(input, {\n size: () => page.size(),\n includeSwipe: includeTouchEvents,\n }),\n\n defineAction<typeof navigateParamSchema, { url: string }>({\n name: 'Navigate',\n description:\n 'Navigate the browser to a specified URL. Opens the URL in the current tab.',\n paramSchema: navigateParamSchema,\n sample: {\n url: 'https://www.example.com',\n },\n call: async (param) => {\n if (!page.navigate) {\n throw new Error(\n 'Navigate operation is not supported on this page type',\n );\n }\n await page.navigate(param.url);\n scheduleWebVisualUpdate(page, true);\n },\n }),\n\n defineAction({\n name: 'Reload',\n description: 'Reload the current page',\n call: async () => {\n if (!page.reload) {\n throw new Error(\n 'Reload operation is not supported on this page type',\n );\n }\n await page.reload();\n scheduleWebVisualUpdate(page, true);\n },\n }),\n\n defineAction({\n name: 'GoBack',\n description: 'Navigate back in browser history',\n call: async () => {\n if (!page.goBack) {\n throw new Error(\n 'GoBack operation is not supported on this page type',\n );\n }\n await page.goBack();\n scheduleWebVisualUpdate(page, true);\n },\n }),\n defineAction({\n name: 'GoForward',\n description: 'Navigate forward in browser history',\n call: async () => {\n if (!page.goForward) {\n throw new Error(\n 'GoForward operation is not supported on this page type',\n );\n }\n await page.goForward();\n scheduleWebVisualUpdate(page, true);\n },\n }),\n ];\n};\n"],"names":["navigateParamSchema","z","normalizeKeyInputs","value","inputs","Array","result","input","trimmed","normalized","transformed","transformHotkeyInput","getKeyCommands","keys","acc","k","includeMeta","AbstractWebPage","AbstractInterface","x","y","options","deltaX","deltaY","from","to","text","action","element","Error","scheduleWebVisualUpdate","page","force","pendingRefresh","undefined","createWebInputPrimitives","scheduleVisualUpdate","opts","inputStrategy","keyboardTypeDelay","resolveTextInputOptions","target","sendTextSequentially","character","sleep","keyboardTypeOptions","keyName","direction","times","arrowKey","i","param","startingPoint","scrollToEventName","JSON","commonWebActionsForWebPage","includeTouchEvents","defineActionsFromInputPrimitives","defineAction"],"mappings":"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"}
1
+ {"version":3,"file":"web-page.mjs","sources":["../../src/web-page.ts"],"sourcesContent":["import type { Point } from '@midscene/core';\nimport { z } from '@midscene/core';\nimport {\n AbstractInterface,\n type BrowserInputPrimitives,\n type DeviceAction,\n type InputStrategy,\n defineAction,\n defineActionsFromInputPrimitives,\n resolveTextInputOptions,\n sendTextSequentially,\n} from '@midscene/core/device';\n\nimport { sleep } from '@midscene/core/utils';\nimport type { ElementInfo } from '@midscene/shared/extractor';\nimport { transformHotkeyInput } from '@midscene/shared/us-keyboard-layout';\n\nconst navigateParamSchema = z.object({\n url: z\n .string()\n .describe(\n 'The URL to navigate to. Must start with https://, file://, or a similar protocol.',\n ),\n});\n\nfunction normalizeKeyInputs(value: string | string[]): string[] {\n const inputs = Array.isArray(value) ? value : [value];\n const result: string[] = [];\n\n for (const input of inputs) {\n if (typeof input !== 'string') {\n result.push(input as unknown as string);\n continue;\n }\n\n const trimmed = input.trim();\n if (!trimmed) {\n result.push(input);\n continue;\n }\n\n let normalized = trimmed;\n if (normalized.length > 1 && normalized.includes('+')) {\n normalized = normalized.replace(/\\s*\\+\\s*/g, ' ');\n }\n if (/\\s/.test(normalized)) {\n normalized = normalized.replace(/\\s+/g, ' ');\n }\n\n const transformed = transformHotkeyInput(normalized);\n if (transformed.length === 1 && transformed[0] === '' && trimmed !== '') {\n result.push(input);\n continue;\n }\n if (transformed.length === 0) {\n result.push(input);\n continue;\n }\n\n result.push(...transformed);\n }\n\n return result;\n}\n\nexport function getKeyCommands(\n value: string | string[],\n): Array<{ key: string; command?: string }> {\n const keys = normalizeKeyInputs(value);\n\n return keys.reduce((acc: Array<{ key: string; command?: string }>, k) => {\n const includeMeta = keys.includes('Meta') || keys.includes('Control');\n if (includeMeta && (k === 'a' || k === 'A')) {\n return acc.concat([{ key: k, command: 'SelectAll' }]);\n }\n if (includeMeta && (k === 'c' || k === 'C')) {\n return acc.concat([{ key: k, command: 'Copy' }]);\n }\n if (includeMeta && (k === 'v' || k === 'V')) {\n return acc.concat([{ key: k, command: 'Paste' }]);\n }\n return acc.concat([{ key: k }]);\n }, []);\n}\n\n// this is copied from puppeteer, but we don't want to import puppeteer here\nexport declare type KeyInput =\n | '0'\n | '1'\n | '2'\n | '3'\n | '4'\n | '5'\n | '6'\n | '7'\n | '8'\n | '9'\n | 'Power'\n | 'Eject'\n | 'Abort'\n | 'Help'\n | 'Backspace'\n | 'Tab'\n | 'Numpad5'\n | 'NumpadEnter'\n | 'Enter'\n | '\\r'\n | '\\n'\n | 'ShiftLeft'\n | 'ShiftRight'\n | 'ControlLeft'\n | 'ControlRight'\n | 'AltLeft'\n | 'AltRight'\n | 'Pause'\n | 'CapsLock'\n | 'Escape'\n | 'Convert'\n | 'NonConvert'\n | 'Space'\n | 'Numpad9'\n | 'PageUp'\n | 'Numpad3'\n | 'PageDown'\n | 'End'\n | 'Numpad1'\n | 'Home'\n | 'Numpad7'\n | 'ArrowLeft'\n | 'Numpad4'\n | 'Numpad8'\n | 'ArrowUp'\n | 'ArrowRight'\n | 'Numpad6'\n | 'Numpad2'\n | 'ArrowDown'\n | 'Select'\n | 'Open'\n | 'PrintScreen'\n | 'Insert'\n | 'Numpad0'\n | 'Delete'\n | 'NumpadDecimal'\n | 'Digit0'\n | 'Digit1'\n | 'Digit2'\n | 'Digit3'\n | 'Digit4'\n | 'Digit5'\n | 'Digit6'\n | 'Digit7'\n | 'Digit8'\n | 'Digit9'\n | 'KeyA'\n | 'KeyB'\n | 'KeyC'\n | 'KeyD'\n | 'KeyE'\n | 'KeyF'\n | 'KeyG'\n | 'KeyH'\n | 'KeyI'\n | 'KeyJ'\n | 'KeyK'\n | 'KeyL'\n | 'KeyM'\n | 'KeyN'\n | 'KeyO'\n | 'KeyP'\n | 'KeyQ'\n | 'KeyR'\n | 'KeyS'\n | 'KeyT'\n | 'KeyU'\n | 'KeyV'\n | 'KeyW'\n | 'KeyX'\n | 'KeyY'\n | 'KeyZ'\n | 'MetaLeft'\n | 'MetaRight'\n | 'ContextMenu'\n | 'NumpadMultiply'\n | 'NumpadAdd'\n | 'NumpadSubtract'\n | 'NumpadDivide'\n | 'F1'\n | 'F2'\n | 'F3'\n | 'F4'\n | 'F5'\n | 'F6'\n | 'F7'\n | 'F8'\n | 'F9'\n | 'F10'\n | 'F11'\n | 'F12'\n | 'F13'\n | 'F14'\n | 'F15'\n | 'F16'\n | 'F17'\n | 'F18'\n | 'F19'\n | 'F20'\n | 'F21'\n | 'F22'\n | 'F23'\n | 'F24'\n | 'NumLock'\n | 'ScrollLock'\n | 'AudioVolumeMute'\n | 'AudioVolumeDown'\n | 'AudioVolumeUp'\n | 'MediaTrackNext'\n | 'MediaTrackPrevious'\n | 'MediaStop'\n | 'MediaPlayPause'\n | 'Semicolon'\n | 'Equal'\n | 'NumpadEqual'\n | 'Comma'\n | 'Minus'\n | 'Period'\n | 'Slash'\n | 'Backquote'\n | 'BracketLeft'\n | 'Backslash'\n | 'BracketRight'\n | 'Quote'\n | 'AltGraph'\n | 'Props'\n | 'Cancel'\n | 'Clear'\n | 'Shift'\n | 'Control'\n | 'Alt'\n | 'Accept'\n | 'ModeChange'\n | ' '\n | 'Print'\n | 'Execute'\n | '\\u0000'\n | 'a'\n | 'b'\n | 'c'\n | 'd'\n | 'e'\n | 'f'\n | 'g'\n | 'h'\n | 'i'\n | 'j'\n | 'k'\n | 'l'\n | 'm'\n | 'n'\n | 'o'\n | 'p'\n | 'q'\n | 'r'\n | 's'\n | 't'\n | 'u'\n | 'v'\n | 'w'\n | 'x'\n | 'y'\n | 'z'\n | 'Meta'\n | '*'\n | '+'\n | '-'\n | '/'\n | ';'\n | '='\n | ','\n | '.'\n | '`'\n | '['\n | '\\\\'\n | ']'\n | \"'\"\n | 'Attn'\n | 'CrSel'\n | 'ExSel'\n | 'EraseEof'\n | 'Play'\n | 'ZoomOut'\n | ')'\n | '!'\n | '@'\n | '#'\n | '$'\n | '%'\n | '^'\n | '&'\n | '('\n | 'A'\n | 'B'\n | 'C'\n | 'D'\n | 'E'\n | 'F'\n | 'G'\n | 'H'\n | 'I'\n | 'J'\n | 'K'\n | 'L'\n | 'M'\n | 'N'\n | 'O'\n | 'P'\n | 'Q'\n | 'R'\n | 'S'\n | 'T'\n | 'U'\n | 'V'\n | 'W'\n | 'X'\n | 'Y'\n | 'Z'\n | ':'\n | '<'\n | '_'\n | '>'\n | '?'\n | '~'\n | '{'\n | '|'\n | '}'\n | '\"'\n | 'SoftLeft'\n | 'SoftRight'\n | 'Camera'\n | 'Call'\n | 'EndCall'\n | 'VolumeDown'\n | 'VolumeUp';\n\nexport type MouseButton = 'left' | 'right' | 'middle';\n\nexport interface MouseAction {\n click: (\n x: number,\n y: number,\n options: { button: MouseButton; count?: number },\n ) => Promise<void>;\n wheel: (deltaX: number, deltaY: number) => Promise<void>;\n move: (x: number, y: number) => Promise<void>;\n drag: (\n from: { x: number; y: number },\n to: { x: number; y: number },\n ) => Promise<void>;\n}\n\nexport interface KeyboardAction {\n type: (text: string, options?: { delay?: number }) => Promise<void>;\n insertText: (text: string) => Promise<void>;\n press: (\n action:\n | { key: KeyInput; command?: string }\n | { key: KeyInput; command?: string }[],\n ) => Promise<void>;\n}\n\nexport interface ChromePageDestroyOptions {\n closeTab?: boolean; // should close the tab when the page object is destroyed\n}\n\nexport abstract class AbstractWebPage extends AbstractInterface {\n readonly keyboardTypeDelay?: number;\n readonly inputStrategy?: InputStrategy;\n navigate?(url: string): Promise<void>;\n reload?(): Promise<void>;\n goBack?(): Promise<void>;\n goForward?(): Promise<void>;\n stopLoading?(): Promise<void>;\n navigationState?(): Promise<{ isLoading: boolean }>;\n flushPendingVisualUpdate?(force?: boolean): Promise<void>;\n schedulePendingVisualUpdate?(force?: boolean): void;\n waitForDomQuiet?(opts?: {\n quietMs?: number;\n timeoutMs?: number;\n target?: ElementInfo;\n }): Promise<void>;\n\n get mouse(): MouseAction {\n return {\n click: async (\n x: number,\n y: number,\n options: { button: MouseButton },\n ) => {},\n wheel: async (deltaX: number, deltaY: number) => {},\n move: async (x: number, y: number) => {},\n drag: async (\n from: { x: number; y: number },\n to: { x: number; y: number },\n ) => {},\n };\n }\n\n get keyboard(): KeyboardAction {\n return {\n type: async (text: string, options?: { delay?: number }) => {},\n insertText: async (text: string) => {},\n press: async (\n action:\n | { key: KeyInput; command?: string }\n | { key: KeyInput; command?: string }[],\n ) => {},\n };\n }\n\n async clearInput(element?: ElementInfo): Promise<void> {}\n\n async selectAllInput(element?: ElementInfo): Promise<void> {\n throw new Error('Bulk text input is not supported by this web page');\n }\n\n abstract scrollUntilTop(startingPoint?: Point): Promise<void>;\n abstract scrollUntilBottom(startingPoint?: Point): Promise<void>;\n abstract scrollUntilLeft(startingPoint?: Point): Promise<void>;\n abstract scrollUntilRight(startingPoint?: Point): Promise<void>;\n abstract scrollUp(distance?: number, startingPoint?: Point): Promise<void>;\n abstract scrollDown(distance?: number, startingPoint?: Point): Promise<void>;\n abstract scrollLeft(distance?: number, startingPoint?: Point): Promise<void>;\n abstract scrollRight(distance?: number, startingPoint?: Point): Promise<void>;\n abstract longPress(x: number, y: number, duration?: number): Promise<void>;\n abstract swipe(\n from: { x: number; y: number },\n to: { x: number; y: number },\n duration?: number,\n ): Promise<void>;\n abstract pinch(\n centerX: number,\n centerY: number,\n startDistance: number,\n endDistance: number,\n duration?: number,\n ): Promise<void>;\n}\n\nconst scheduleWebVisualUpdate = (\n page: AbstractWebPage,\n force = false,\n): void => {\n if (page.schedulePendingVisualUpdate) {\n if (force) {\n page.schedulePendingVisualUpdate(true);\n } else {\n page.schedulePendingVisualUpdate();\n }\n return;\n }\n\n const pendingRefresh = force\n ? page.flushPendingVisualUpdate?.(true)\n : page.flushPendingVisualUpdate?.();\n void pendingRefresh?.catch(() => undefined);\n};\n\nexport function createWebInputPrimitives(\n page: AbstractWebPage,\n): BrowserInputPrimitives {\n const scheduleVisualUpdate = () => scheduleWebVisualUpdate(page);\n\n return {\n pointer: {\n tap: async ({ x, y }) => {\n await page.mouse.click(x, y, { button: 'left' });\n scheduleVisualUpdate();\n },\n rightClick: async ({ x, y }) => {\n await page.mouse.click(x, y, { button: 'right' });\n scheduleVisualUpdate();\n },\n doubleClick: async ({ x, y }) => {\n await page.mouse.click(x, y, { button: 'left', count: 2 });\n scheduleVisualUpdate();\n },\n hover: async ({ x, y }) => {\n await page.mouse.move(x, y);\n scheduleVisualUpdate();\n },\n dragAndDrop: async (from, to) => {\n await page.mouse.drag(from, to);\n scheduleVisualUpdate();\n },\n longPress: async ({ x, y }, opts) => {\n await page.longPress(x, y, opts?.duration);\n scheduleVisualUpdate();\n },\n },\n keyboard: {\n typeText: async (value, opts) => {\n const element = opts?.target;\n const { inputStrategy, keyboardTypeDelay } = resolveTextInputOptions(\n opts,\n page,\n );\n if (element && opts?.replace !== false) {\n if (inputStrategy === 'bulk') {\n // Keep the current value selected so insertText replaces it in one\n // input operation instead of emitting a separate empty value.\n await page.selectAllInput(element as ElementInfo);\n } else {\n await page.clearInput(element as ElementInfo);\n // Frameworks (React/Vue/etc.) often re-render in response to\n // the `input` event fired by clearing. If that re-render lands\n // between clearInput returning and the first typed character,\n // the keypresses can be dropped. Wait for the DOM to settle\n // before starting to type.\n await page.waitForDomQuiet?.({ target: element as ElementInfo });\n }\n } else if (element && opts?.focusOnly) {\n const target = element as ElementInfo;\n await page.mouse.click(target.center[0], target.center[1], {\n button: 'left',\n });\n await page.keyboard.press([{ key: 'End' }]);\n }\n\n if (opts?.focusOnly) {\n return;\n }\n\n if (inputStrategy === 'bulk') {\n await page.keyboard.insertText(value);\n } else if (inputStrategy === 'sequential') {\n await sendTextSequentially(\n value,\n {\n // The shared loop owns the inter-character delay. Explicitly\n // disable the page default so action-level zero remains\n // effective and positive delays are not applied twice.\n sendCharacter: (character) =>\n page.keyboard.type(character, { delay: 0 }),\n wait: sleep,\n },\n { delayMs: keyboardTypeDelay },\n );\n } else {\n const keyboardTypeOptions =\n keyboardTypeDelay === undefined\n ? undefined\n : { delay: keyboardTypeDelay };\n await page.keyboard.type(value, keyboardTypeOptions);\n }\n scheduleVisualUpdate();\n },\n keyboardPress: async (keyName, opts) => {\n const element = opts?.target as\n | { center: [number, number] }\n | undefined;\n if (element) {\n await page.mouse.click(element.center[0], element.center[1], {\n button: 'left',\n });\n }\n\n const keys = getKeyCommands(keyName);\n await page.keyboard.press(keys as any);\n scheduleVisualUpdate();\n },\n cursorMove: async (direction, times = 1) => {\n const arrowKey = direction === 'left' ? 'ArrowLeft' : 'ArrowRight';\n for (let i = 0; i < times; i++) {\n await page.keyboard.press([{ key: arrowKey as any }]);\n await sleep(100);\n }\n },\n clearInput: async (target) => {\n await page.clearInput(target as ElementInfo | undefined);\n },\n },\n touch: {\n pinch: async ({ x, y }, opts) => {\n await page.pinch(\n x,\n y,\n opts.startDistance,\n opts.endDistance,\n opts.duration,\n );\n },\n swipe: async (from, to, opts) => {\n await page.swipe(from, to, opts?.duration);\n },\n },\n scroll: {\n scroll: async (param) => {\n const element = param.locate;\n const startingPoint = element\n ? {\n left: element.center[0],\n top: element.center[1],\n }\n : undefined;\n const scrollToEventName = param?.scrollType;\n if (scrollToEventName === 'scrollToTop') {\n await page.scrollUntilTop(startingPoint);\n } else if (scrollToEventName === 'scrollToBottom') {\n await page.scrollUntilBottom(startingPoint);\n } else if (scrollToEventName === 'scrollToRight') {\n await page.scrollUntilRight(startingPoint);\n } else if (scrollToEventName === 'scrollToLeft') {\n await page.scrollUntilLeft(startingPoint);\n } else if (scrollToEventName === 'singleAction' || !scrollToEventName) {\n if (param?.direction === 'down' || !param || !param.direction) {\n await page.scrollDown(param?.distance || undefined, startingPoint);\n } else if (param.direction === 'up') {\n await page.scrollUp(param.distance || undefined, startingPoint);\n } else if (param.direction === 'left') {\n await page.scrollLeft(param.distance || undefined, startingPoint);\n } else if (param.direction === 'right') {\n await page.scrollRight(param.distance || undefined, startingPoint);\n } else {\n throw new Error(`Unknown scroll direction: ${param.direction}`);\n }\n await sleep(500);\n } else {\n throw new Error(\n `Unknown scroll event type: ${scrollToEventName}, param: ${JSON.stringify(\n param,\n )}`,\n );\n }\n scheduleVisualUpdate();\n },\n },\n };\n}\n\nexport const commonWebActionsForWebPage = <T extends AbstractWebPage>(\n page: T,\n includeTouchEvents = false,\n): DeviceAction<any>[] => {\n const input = createWebInputPrimitives(page);\n return [\n ...defineActionsFromInputPrimitives(input, {\n size: () => page.size(),\n includeSwipe: includeTouchEvents,\n }),\n\n defineAction<typeof navigateParamSchema, { url: string }>({\n name: 'Navigate',\n description:\n 'Navigate the browser to a specified URL. Opens the URL in the current tab.',\n paramSchema: navigateParamSchema,\n sample: {\n url: 'https://www.example.com',\n },\n call: async (param) => {\n if (!page.navigate) {\n throw new Error(\n 'Navigate operation is not supported on this page type',\n );\n }\n await page.navigate(param.url);\n scheduleWebVisualUpdate(page, true);\n },\n }),\n\n defineAction({\n name: 'Reload',\n supportedBySystemOne: true,\n description: 'Reload the current page',\n call: async () => {\n if (!page.reload) {\n throw new Error(\n 'Reload operation is not supported on this page type',\n );\n }\n await page.reload();\n scheduleWebVisualUpdate(page, true);\n },\n }),\n\n defineAction({\n name: 'GoBack',\n supportedBySystemOne: true,\n description: 'Navigate back in browser history',\n call: async () => {\n if (!page.goBack) {\n throw new Error(\n 'GoBack operation is not supported on this page type',\n );\n }\n await page.goBack();\n scheduleWebVisualUpdate(page, true);\n },\n }),\n defineAction({\n name: 'GoForward',\n supportedBySystemOne: true,\n description: 'Navigate forward in browser history',\n call: async () => {\n if (!page.goForward) {\n throw new Error(\n 'GoForward operation is not supported on this page type',\n );\n }\n await page.goForward();\n scheduleWebVisualUpdate(page, true);\n },\n }),\n ];\n};\n"],"names":["navigateParamSchema","z","normalizeKeyInputs","value","inputs","Array","result","input","trimmed","normalized","transformed","transformHotkeyInput","getKeyCommands","keys","acc","k","includeMeta","AbstractWebPage","AbstractInterface","x","y","options","deltaX","deltaY","from","to","text","action","element","Error","scheduleWebVisualUpdate","page","force","pendingRefresh","undefined","createWebInputPrimitives","scheduleVisualUpdate","opts","inputStrategy","keyboardTypeDelay","resolveTextInputOptions","target","sendTextSequentially","character","sleep","keyboardTypeOptions","keyName","direction","times","arrowKey","i","param","startingPoint","scrollToEventName","JSON","commonWebActionsForWebPage","includeTouchEvents","defineActionsFromInputPrimitives","defineAction"],"mappings":"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"}
@@ -51,7 +51,7 @@ class BridgeClient {
51
51
  ]
52
52
  } : {},
53
53
  query: {
54
- version: "1.16.5"
54
+ version: "1.17.0"
55
55
  }
56
56
  });
57
57
  const timeout = setTimeout(()=>{
@@ -130,7 +130,7 @@ class BridgeServer {
130
130
  (0, shared_utils_namespaceObject.logMsg)('one client connected');
131
131
  this.socket = socket;
132
132
  const clientVersion = socket.handshake.query.version;
133
- (0, shared_utils_namespaceObject.logMsg)(`Bridge connected, cli-side version v1.16.5, browser-side version v${clientVersion}`);
133
+ (0, shared_utils_namespaceObject.logMsg)(`Bridge connected, cli-side version v1.17.0, browser-side version v${clientVersion}`);
134
134
  socket.on(external_common_js_namespaceObject.BridgeEvent.CallResponse, (params)=>{
135
135
  const id = params.id;
136
136
  const response = params.response;
@@ -154,7 +154,7 @@ class BridgeServer {
154
154
  setTimeout(()=>{
155
155
  this.onConnect?.();
156
156
  const payload = {
157
- version: "1.16.5"
157
+ version: "1.17.0"
158
158
  };
159
159
  socket.emit(external_common_js_namespaceObject.BridgeEvent.Connected, payload);
160
160
  Promise.resolve().then(()=>{
@@ -138,7 +138,7 @@ class ExtensionBridgePageBrowserSide extends page_js_default() {
138
138
  throw new Error('Connection denied by user');
139
139
  }
140
140
  }
141
- this.onLogMessage(`Bridge connected, cli-side version v${this.bridgeClient.serverVersion}, browser-side version v1.16.5`, 'log');
141
+ this.onLogMessage(`Bridge connected, cli-side version v${this.bridgeClient.serverVersion}, browser-side version v1.17.0`, 'log');
142
142
  }
143
143
  async connect() {
144
144
  return await this.setupBridgeClient();
package/dist/lib/cli.js CHANGED
@@ -42,7 +42,7 @@ Promise.resolve().then(()=>{
42
42
  return (0, cli_namespaceObject.runToolsCLI)(tools, 'midscene-web', {
43
43
  stripPrefix: 'web_',
44
44
  argv: parsedOptions.argv,
45
- version: "1.16.5",
45
+ version: "1.17.0",
46
46
  extraCommands: (0, core_namespaceObject.createReportCliCommands)()
47
47
  });
48
48
  }).catch((e)=>{
@@ -295,6 +295,7 @@ const commonWebActionsForWebPage = (page, includeTouchEvents = false)=>{
295
295
  }),
296
296
  (0, device_namespaceObject.defineAction)({
297
297
  name: 'Reload',
298
+ supportedBySystemOne: true,
298
299
  description: 'Reload the current page',
299
300
  call: async ()=>{
300
301
  if (!page.reload) throw new Error('Reload operation is not supported on this page type');
@@ -304,6 +305,7 @@ const commonWebActionsForWebPage = (page, includeTouchEvents = false)=>{
304
305
  }),
305
306
  (0, device_namespaceObject.defineAction)({
306
307
  name: 'GoBack',
308
+ supportedBySystemOne: true,
307
309
  description: 'Navigate back in browser history',
308
310
  call: async ()=>{
309
311
  if (!page.goBack) throw new Error('GoBack operation is not supported on this page type');
@@ -313,6 +315,7 @@ const commonWebActionsForWebPage = (page, includeTouchEvents = false)=>{
313
315
  }),
314
316
  (0, device_namespaceObject.defineAction)({
315
317
  name: 'GoForward',
318
+ supportedBySystemOne: true,
316
319
  description: 'Navigate forward in browser history',
317
320
  call: async ()=>{
318
321
  if (!page.goForward) throw new Error('GoForward operation is not supported on this page type');
@@ -1 +1 @@
1
- {"version":3,"file":"web-page.js","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../src/web-page.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 { Point } from '@midscene/core';\nimport { z } from '@midscene/core';\nimport {\n AbstractInterface,\n type BrowserInputPrimitives,\n type DeviceAction,\n type InputStrategy,\n defineAction,\n defineActionsFromInputPrimitives,\n resolveTextInputOptions,\n sendTextSequentially,\n} from '@midscene/core/device';\n\nimport { sleep } from '@midscene/core/utils';\nimport type { ElementInfo } from '@midscene/shared/extractor';\nimport { transformHotkeyInput } from '@midscene/shared/us-keyboard-layout';\n\nconst navigateParamSchema = z.object({\n url: z\n .string()\n .describe(\n 'The URL to navigate to. Must start with https://, file://, or a similar protocol.',\n ),\n});\n\nfunction normalizeKeyInputs(value: string | string[]): string[] {\n const inputs = Array.isArray(value) ? value : [value];\n const result: string[] = [];\n\n for (const input of inputs) {\n if (typeof input !== 'string') {\n result.push(input as unknown as string);\n continue;\n }\n\n const trimmed = input.trim();\n if (!trimmed) {\n result.push(input);\n continue;\n }\n\n let normalized = trimmed;\n if (normalized.length > 1 && normalized.includes('+')) {\n normalized = normalized.replace(/\\s*\\+\\s*/g, ' ');\n }\n if (/\\s/.test(normalized)) {\n normalized = normalized.replace(/\\s+/g, ' ');\n }\n\n const transformed = transformHotkeyInput(normalized);\n if (transformed.length === 1 && transformed[0] === '' && trimmed !== '') {\n result.push(input);\n continue;\n }\n if (transformed.length === 0) {\n result.push(input);\n continue;\n }\n\n result.push(...transformed);\n }\n\n return result;\n}\n\nexport function getKeyCommands(\n value: string | string[],\n): Array<{ key: string; command?: string }> {\n const keys = normalizeKeyInputs(value);\n\n return keys.reduce((acc: Array<{ key: string; command?: string }>, k) => {\n const includeMeta = keys.includes('Meta') || keys.includes('Control');\n if (includeMeta && (k === 'a' || k === 'A')) {\n return acc.concat([{ key: k, command: 'SelectAll' }]);\n }\n if (includeMeta && (k === 'c' || k === 'C')) {\n return acc.concat([{ key: k, command: 'Copy' }]);\n }\n if (includeMeta && (k === 'v' || k === 'V')) {\n return acc.concat([{ key: k, command: 'Paste' }]);\n }\n return acc.concat([{ key: k }]);\n }, []);\n}\n\n// this is copied from puppeteer, but we don't want to import puppeteer here\nexport declare type KeyInput =\n | '0'\n | '1'\n | '2'\n | '3'\n | '4'\n | '5'\n | '6'\n | '7'\n | '8'\n | '9'\n | 'Power'\n | 'Eject'\n | 'Abort'\n | 'Help'\n | 'Backspace'\n | 'Tab'\n | 'Numpad5'\n | 'NumpadEnter'\n | 'Enter'\n | '\\r'\n | '\\n'\n | 'ShiftLeft'\n | 'ShiftRight'\n | 'ControlLeft'\n | 'ControlRight'\n | 'AltLeft'\n | 'AltRight'\n | 'Pause'\n | 'CapsLock'\n | 'Escape'\n | 'Convert'\n | 'NonConvert'\n | 'Space'\n | 'Numpad9'\n | 'PageUp'\n | 'Numpad3'\n | 'PageDown'\n | 'End'\n | 'Numpad1'\n | 'Home'\n | 'Numpad7'\n | 'ArrowLeft'\n | 'Numpad4'\n | 'Numpad8'\n | 'ArrowUp'\n | 'ArrowRight'\n | 'Numpad6'\n | 'Numpad2'\n | 'ArrowDown'\n | 'Select'\n | 'Open'\n | 'PrintScreen'\n | 'Insert'\n | 'Numpad0'\n | 'Delete'\n | 'NumpadDecimal'\n | 'Digit0'\n | 'Digit1'\n | 'Digit2'\n | 'Digit3'\n | 'Digit4'\n | 'Digit5'\n | 'Digit6'\n | 'Digit7'\n | 'Digit8'\n | 'Digit9'\n | 'KeyA'\n | 'KeyB'\n | 'KeyC'\n | 'KeyD'\n | 'KeyE'\n | 'KeyF'\n | 'KeyG'\n | 'KeyH'\n | 'KeyI'\n | 'KeyJ'\n | 'KeyK'\n | 'KeyL'\n | 'KeyM'\n | 'KeyN'\n | 'KeyO'\n | 'KeyP'\n | 'KeyQ'\n | 'KeyR'\n | 'KeyS'\n | 'KeyT'\n | 'KeyU'\n | 'KeyV'\n | 'KeyW'\n | 'KeyX'\n | 'KeyY'\n | 'KeyZ'\n | 'MetaLeft'\n | 'MetaRight'\n | 'ContextMenu'\n | 'NumpadMultiply'\n | 'NumpadAdd'\n | 'NumpadSubtract'\n | 'NumpadDivide'\n | 'F1'\n | 'F2'\n | 'F3'\n | 'F4'\n | 'F5'\n | 'F6'\n | 'F7'\n | 'F8'\n | 'F9'\n | 'F10'\n | 'F11'\n | 'F12'\n | 'F13'\n | 'F14'\n | 'F15'\n | 'F16'\n | 'F17'\n | 'F18'\n | 'F19'\n | 'F20'\n | 'F21'\n | 'F22'\n | 'F23'\n | 'F24'\n | 'NumLock'\n | 'ScrollLock'\n | 'AudioVolumeMute'\n | 'AudioVolumeDown'\n | 'AudioVolumeUp'\n | 'MediaTrackNext'\n | 'MediaTrackPrevious'\n | 'MediaStop'\n | 'MediaPlayPause'\n | 'Semicolon'\n | 'Equal'\n | 'NumpadEqual'\n | 'Comma'\n | 'Minus'\n | 'Period'\n | 'Slash'\n | 'Backquote'\n | 'BracketLeft'\n | 'Backslash'\n | 'BracketRight'\n | 'Quote'\n | 'AltGraph'\n | 'Props'\n | 'Cancel'\n | 'Clear'\n | 'Shift'\n | 'Control'\n | 'Alt'\n | 'Accept'\n | 'ModeChange'\n | ' '\n | 'Print'\n | 'Execute'\n | '\\u0000'\n | 'a'\n | 'b'\n | 'c'\n | 'd'\n | 'e'\n | 'f'\n | 'g'\n | 'h'\n | 'i'\n | 'j'\n | 'k'\n | 'l'\n | 'm'\n | 'n'\n | 'o'\n | 'p'\n | 'q'\n | 'r'\n | 's'\n | 't'\n | 'u'\n | 'v'\n | 'w'\n | 'x'\n | 'y'\n | 'z'\n | 'Meta'\n | '*'\n | '+'\n | '-'\n | '/'\n | ';'\n | '='\n | ','\n | '.'\n | '`'\n | '['\n | '\\\\'\n | ']'\n | \"'\"\n | 'Attn'\n | 'CrSel'\n | 'ExSel'\n | 'EraseEof'\n | 'Play'\n | 'ZoomOut'\n | ')'\n | '!'\n | '@'\n | '#'\n | '$'\n | '%'\n | '^'\n | '&'\n | '('\n | 'A'\n | 'B'\n | 'C'\n | 'D'\n | 'E'\n | 'F'\n | 'G'\n | 'H'\n | 'I'\n | 'J'\n | 'K'\n | 'L'\n | 'M'\n | 'N'\n | 'O'\n | 'P'\n | 'Q'\n | 'R'\n | 'S'\n | 'T'\n | 'U'\n | 'V'\n | 'W'\n | 'X'\n | 'Y'\n | 'Z'\n | ':'\n | '<'\n | '_'\n | '>'\n | '?'\n | '~'\n | '{'\n | '|'\n | '}'\n | '\"'\n | 'SoftLeft'\n | 'SoftRight'\n | 'Camera'\n | 'Call'\n | 'EndCall'\n | 'VolumeDown'\n | 'VolumeUp';\n\nexport type MouseButton = 'left' | 'right' | 'middle';\n\nexport interface MouseAction {\n click: (\n x: number,\n y: number,\n options: { button: MouseButton; count?: number },\n ) => Promise<void>;\n wheel: (deltaX: number, deltaY: number) => Promise<void>;\n move: (x: number, y: number) => Promise<void>;\n drag: (\n from: { x: number; y: number },\n to: { x: number; y: number },\n ) => Promise<void>;\n}\n\nexport interface KeyboardAction {\n type: (text: string, options?: { delay?: number }) => Promise<void>;\n insertText: (text: string) => Promise<void>;\n press: (\n action:\n | { key: KeyInput; command?: string }\n | { key: KeyInput; command?: string }[],\n ) => Promise<void>;\n}\n\nexport interface ChromePageDestroyOptions {\n closeTab?: boolean; // should close the tab when the page object is destroyed\n}\n\nexport abstract class AbstractWebPage extends AbstractInterface {\n readonly keyboardTypeDelay?: number;\n readonly inputStrategy?: InputStrategy;\n navigate?(url: string): Promise<void>;\n reload?(): Promise<void>;\n goBack?(): Promise<void>;\n goForward?(): Promise<void>;\n stopLoading?(): Promise<void>;\n navigationState?(): Promise<{ isLoading: boolean }>;\n flushPendingVisualUpdate?(force?: boolean): Promise<void>;\n schedulePendingVisualUpdate?(force?: boolean): void;\n waitForDomQuiet?(opts?: {\n quietMs?: number;\n timeoutMs?: number;\n target?: ElementInfo;\n }): Promise<void>;\n\n get mouse(): MouseAction {\n return {\n click: async (\n x: number,\n y: number,\n options: { button: MouseButton },\n ) => {},\n wheel: async (deltaX: number, deltaY: number) => {},\n move: async (x: number, y: number) => {},\n drag: async (\n from: { x: number; y: number },\n to: { x: number; y: number },\n ) => {},\n };\n }\n\n get keyboard(): KeyboardAction {\n return {\n type: async (text: string, options?: { delay?: number }) => {},\n insertText: async (text: string) => {},\n press: async (\n action:\n | { key: KeyInput; command?: string }\n | { key: KeyInput; command?: string }[],\n ) => {},\n };\n }\n\n async clearInput(element?: ElementInfo): Promise<void> {}\n\n async selectAllInput(element?: ElementInfo): Promise<void> {\n throw new Error('Bulk text input is not supported by this web page');\n }\n\n abstract scrollUntilTop(startingPoint?: Point): Promise<void>;\n abstract scrollUntilBottom(startingPoint?: Point): Promise<void>;\n abstract scrollUntilLeft(startingPoint?: Point): Promise<void>;\n abstract scrollUntilRight(startingPoint?: Point): Promise<void>;\n abstract scrollUp(distance?: number, startingPoint?: Point): Promise<void>;\n abstract scrollDown(distance?: number, startingPoint?: Point): Promise<void>;\n abstract scrollLeft(distance?: number, startingPoint?: Point): Promise<void>;\n abstract scrollRight(distance?: number, startingPoint?: Point): Promise<void>;\n abstract longPress(x: number, y: number, duration?: number): Promise<void>;\n abstract swipe(\n from: { x: number; y: number },\n to: { x: number; y: number },\n duration?: number,\n ): Promise<void>;\n abstract pinch(\n centerX: number,\n centerY: number,\n startDistance: number,\n endDistance: number,\n duration?: number,\n ): Promise<void>;\n}\n\nconst scheduleWebVisualUpdate = (\n page: AbstractWebPage,\n force = false,\n): void => {\n if (page.schedulePendingVisualUpdate) {\n if (force) {\n page.schedulePendingVisualUpdate(true);\n } else {\n page.schedulePendingVisualUpdate();\n }\n return;\n }\n\n const pendingRefresh = force\n ? page.flushPendingVisualUpdate?.(true)\n : page.flushPendingVisualUpdate?.();\n void pendingRefresh?.catch(() => undefined);\n};\n\nexport function createWebInputPrimitives(\n page: AbstractWebPage,\n): BrowserInputPrimitives {\n const scheduleVisualUpdate = () => scheduleWebVisualUpdate(page);\n\n return {\n pointer: {\n tap: async ({ x, y }) => {\n await page.mouse.click(x, y, { button: 'left' });\n scheduleVisualUpdate();\n },\n rightClick: async ({ x, y }) => {\n await page.mouse.click(x, y, { button: 'right' });\n scheduleVisualUpdate();\n },\n doubleClick: async ({ x, y }) => {\n await page.mouse.click(x, y, { button: 'left', count: 2 });\n scheduleVisualUpdate();\n },\n hover: async ({ x, y }) => {\n await page.mouse.move(x, y);\n scheduleVisualUpdate();\n },\n dragAndDrop: async (from, to) => {\n await page.mouse.drag(from, to);\n scheduleVisualUpdate();\n },\n longPress: async ({ x, y }, opts) => {\n await page.longPress(x, y, opts?.duration);\n scheduleVisualUpdate();\n },\n },\n keyboard: {\n typeText: async (value, opts) => {\n const element = opts?.target;\n const { inputStrategy, keyboardTypeDelay } = resolveTextInputOptions(\n opts,\n page,\n );\n if (element && opts?.replace !== false) {\n if (inputStrategy === 'bulk') {\n // Keep the current value selected so insertText replaces it in one\n // input operation instead of emitting a separate empty value.\n await page.selectAllInput(element as ElementInfo);\n } else {\n await page.clearInput(element as ElementInfo);\n // Frameworks (React/Vue/etc.) often re-render in response to\n // the `input` event fired by clearing. If that re-render lands\n // between clearInput returning and the first typed character,\n // the keypresses can be dropped. Wait for the DOM to settle\n // before starting to type.\n await page.waitForDomQuiet?.({ target: element as ElementInfo });\n }\n } else if (element && opts?.focusOnly) {\n const target = element as ElementInfo;\n await page.mouse.click(target.center[0], target.center[1], {\n button: 'left',\n });\n await page.keyboard.press([{ key: 'End' }]);\n }\n\n if (opts?.focusOnly) {\n return;\n }\n\n if (inputStrategy === 'bulk') {\n await page.keyboard.insertText(value);\n } else if (inputStrategy === 'sequential') {\n await sendTextSequentially(\n value,\n {\n // The shared loop owns the inter-character delay. Explicitly\n // disable the page default so action-level zero remains\n // effective and positive delays are not applied twice.\n sendCharacter: (character) =>\n page.keyboard.type(character, { delay: 0 }),\n wait: sleep,\n },\n { delayMs: keyboardTypeDelay },\n );\n } else {\n const keyboardTypeOptions =\n keyboardTypeDelay === undefined\n ? undefined\n : { delay: keyboardTypeDelay };\n await page.keyboard.type(value, keyboardTypeOptions);\n }\n scheduleVisualUpdate();\n },\n keyboardPress: async (keyName, opts) => {\n const element = opts?.target as\n | { center: [number, number] }\n | undefined;\n if (element) {\n await page.mouse.click(element.center[0], element.center[1], {\n button: 'left',\n });\n }\n\n const keys = getKeyCommands(keyName);\n await page.keyboard.press(keys as any);\n scheduleVisualUpdate();\n },\n cursorMove: async (direction, times = 1) => {\n const arrowKey = direction === 'left' ? 'ArrowLeft' : 'ArrowRight';\n for (let i = 0; i < times; i++) {\n await page.keyboard.press([{ key: arrowKey as any }]);\n await sleep(100);\n }\n },\n clearInput: async (target) => {\n await page.clearInput(target as ElementInfo | undefined);\n },\n },\n touch: {\n pinch: async ({ x, y }, opts) => {\n await page.pinch(\n x,\n y,\n opts.startDistance,\n opts.endDistance,\n opts.duration,\n );\n },\n swipe: async (from, to, opts) => {\n await page.swipe(from, to, opts?.duration);\n },\n },\n scroll: {\n scroll: async (param) => {\n const element = param.locate;\n const startingPoint = element\n ? {\n left: element.center[0],\n top: element.center[1],\n }\n : undefined;\n const scrollToEventName = param?.scrollType;\n if (scrollToEventName === 'scrollToTop') {\n await page.scrollUntilTop(startingPoint);\n } else if (scrollToEventName === 'scrollToBottom') {\n await page.scrollUntilBottom(startingPoint);\n } else if (scrollToEventName === 'scrollToRight') {\n await page.scrollUntilRight(startingPoint);\n } else if (scrollToEventName === 'scrollToLeft') {\n await page.scrollUntilLeft(startingPoint);\n } else if (scrollToEventName === 'singleAction' || !scrollToEventName) {\n if (param?.direction === 'down' || !param || !param.direction) {\n await page.scrollDown(param?.distance || undefined, startingPoint);\n } else if (param.direction === 'up') {\n await page.scrollUp(param.distance || undefined, startingPoint);\n } else if (param.direction === 'left') {\n await page.scrollLeft(param.distance || undefined, startingPoint);\n } else if (param.direction === 'right') {\n await page.scrollRight(param.distance || undefined, startingPoint);\n } else {\n throw new Error(`Unknown scroll direction: ${param.direction}`);\n }\n await sleep(500);\n } else {\n throw new Error(\n `Unknown scroll event type: ${scrollToEventName}, param: ${JSON.stringify(\n param,\n )}`,\n );\n }\n scheduleVisualUpdate();\n },\n },\n };\n}\n\nexport const commonWebActionsForWebPage = <T extends AbstractWebPage>(\n page: T,\n includeTouchEvents = false,\n): DeviceAction<any>[] => {\n const input = createWebInputPrimitives(page);\n return [\n ...defineActionsFromInputPrimitives(input, {\n size: () => page.size(),\n includeSwipe: includeTouchEvents,\n }),\n\n defineAction<typeof navigateParamSchema, { url: string }>({\n name: 'Navigate',\n description:\n 'Navigate the browser to a specified URL. Opens the URL in the current tab.',\n paramSchema: navigateParamSchema,\n sample: {\n url: 'https://www.example.com',\n },\n call: async (param) => {\n if (!page.navigate) {\n throw new Error(\n 'Navigate operation is not supported on this page type',\n );\n }\n await page.navigate(param.url);\n scheduleWebVisualUpdate(page, true);\n },\n }),\n\n defineAction({\n name: 'Reload',\n description: 'Reload the current page',\n call: async () => {\n if (!page.reload) {\n throw new Error(\n 'Reload operation is not supported on this page type',\n );\n }\n await page.reload();\n scheduleWebVisualUpdate(page, true);\n },\n }),\n\n defineAction({\n name: 'GoBack',\n description: 'Navigate back in browser history',\n call: async () => {\n if (!page.goBack) {\n throw new Error(\n 'GoBack operation is not supported on this page type',\n );\n }\n await page.goBack();\n scheduleWebVisualUpdate(page, true);\n },\n }),\n defineAction({\n name: 'GoForward',\n description: 'Navigate forward in browser history',\n call: async () => {\n if (!page.goForward) {\n throw new Error(\n 'GoForward operation is not supported on this page type',\n );\n }\n await page.goForward();\n scheduleWebVisualUpdate(page, true);\n },\n }),\n ];\n};\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","navigateParamSchema","z","normalizeKeyInputs","value","inputs","Array","result","input","trimmed","normalized","transformed","transformHotkeyInput","getKeyCommands","keys","acc","k","includeMeta","AbstractWebPage","AbstractInterface","x","y","options","deltaX","deltaY","from","to","text","action","element","Error","scheduleWebVisualUpdate","page","force","pendingRefresh","undefined","createWebInputPrimitives","scheduleVisualUpdate","opts","inputStrategy","keyboardTypeDelay","resolveTextInputOptions","target","sendTextSequentially","character","sleep","keyboardTypeOptions","keyName","direction","times","arrowKey","i","param","startingPoint","scrollToEventName","JSON","commonWebActionsForWebPage","includeTouchEvents","defineActionsFromInputPrimitives","defineAction"],"mappings":"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"}
1
+ {"version":3,"file":"web-page.js","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../src/web-page.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 { Point } from '@midscene/core';\nimport { z } from '@midscene/core';\nimport {\n AbstractInterface,\n type BrowserInputPrimitives,\n type DeviceAction,\n type InputStrategy,\n defineAction,\n defineActionsFromInputPrimitives,\n resolveTextInputOptions,\n sendTextSequentially,\n} from '@midscene/core/device';\n\nimport { sleep } from '@midscene/core/utils';\nimport type { ElementInfo } from '@midscene/shared/extractor';\nimport { transformHotkeyInput } from '@midscene/shared/us-keyboard-layout';\n\nconst navigateParamSchema = z.object({\n url: z\n .string()\n .describe(\n 'The URL to navigate to. Must start with https://, file://, or a similar protocol.',\n ),\n});\n\nfunction normalizeKeyInputs(value: string | string[]): string[] {\n const inputs = Array.isArray(value) ? value : [value];\n const result: string[] = [];\n\n for (const input of inputs) {\n if (typeof input !== 'string') {\n result.push(input as unknown as string);\n continue;\n }\n\n const trimmed = input.trim();\n if (!trimmed) {\n result.push(input);\n continue;\n }\n\n let normalized = trimmed;\n if (normalized.length > 1 && normalized.includes('+')) {\n normalized = normalized.replace(/\\s*\\+\\s*/g, ' ');\n }\n if (/\\s/.test(normalized)) {\n normalized = normalized.replace(/\\s+/g, ' ');\n }\n\n const transformed = transformHotkeyInput(normalized);\n if (transformed.length === 1 && transformed[0] === '' && trimmed !== '') {\n result.push(input);\n continue;\n }\n if (transformed.length === 0) {\n result.push(input);\n continue;\n }\n\n result.push(...transformed);\n }\n\n return result;\n}\n\nexport function getKeyCommands(\n value: string | string[],\n): Array<{ key: string; command?: string }> {\n const keys = normalizeKeyInputs(value);\n\n return keys.reduce((acc: Array<{ key: string; command?: string }>, k) => {\n const includeMeta = keys.includes('Meta') || keys.includes('Control');\n if (includeMeta && (k === 'a' || k === 'A')) {\n return acc.concat([{ key: k, command: 'SelectAll' }]);\n }\n if (includeMeta && (k === 'c' || k === 'C')) {\n return acc.concat([{ key: k, command: 'Copy' }]);\n }\n if (includeMeta && (k === 'v' || k === 'V')) {\n return acc.concat([{ key: k, command: 'Paste' }]);\n }\n return acc.concat([{ key: k }]);\n }, []);\n}\n\n// this is copied from puppeteer, but we don't want to import puppeteer here\nexport declare type KeyInput =\n | '0'\n | '1'\n | '2'\n | '3'\n | '4'\n | '5'\n | '6'\n | '7'\n | '8'\n | '9'\n | 'Power'\n | 'Eject'\n | 'Abort'\n | 'Help'\n | 'Backspace'\n | 'Tab'\n | 'Numpad5'\n | 'NumpadEnter'\n | 'Enter'\n | '\\r'\n | '\\n'\n | 'ShiftLeft'\n | 'ShiftRight'\n | 'ControlLeft'\n | 'ControlRight'\n | 'AltLeft'\n | 'AltRight'\n | 'Pause'\n | 'CapsLock'\n | 'Escape'\n | 'Convert'\n | 'NonConvert'\n | 'Space'\n | 'Numpad9'\n | 'PageUp'\n | 'Numpad3'\n | 'PageDown'\n | 'End'\n | 'Numpad1'\n | 'Home'\n | 'Numpad7'\n | 'ArrowLeft'\n | 'Numpad4'\n | 'Numpad8'\n | 'ArrowUp'\n | 'ArrowRight'\n | 'Numpad6'\n | 'Numpad2'\n | 'ArrowDown'\n | 'Select'\n | 'Open'\n | 'PrintScreen'\n | 'Insert'\n | 'Numpad0'\n | 'Delete'\n | 'NumpadDecimal'\n | 'Digit0'\n | 'Digit1'\n | 'Digit2'\n | 'Digit3'\n | 'Digit4'\n | 'Digit5'\n | 'Digit6'\n | 'Digit7'\n | 'Digit8'\n | 'Digit9'\n | 'KeyA'\n | 'KeyB'\n | 'KeyC'\n | 'KeyD'\n | 'KeyE'\n | 'KeyF'\n | 'KeyG'\n | 'KeyH'\n | 'KeyI'\n | 'KeyJ'\n | 'KeyK'\n | 'KeyL'\n | 'KeyM'\n | 'KeyN'\n | 'KeyO'\n | 'KeyP'\n | 'KeyQ'\n | 'KeyR'\n | 'KeyS'\n | 'KeyT'\n | 'KeyU'\n | 'KeyV'\n | 'KeyW'\n | 'KeyX'\n | 'KeyY'\n | 'KeyZ'\n | 'MetaLeft'\n | 'MetaRight'\n | 'ContextMenu'\n | 'NumpadMultiply'\n | 'NumpadAdd'\n | 'NumpadSubtract'\n | 'NumpadDivide'\n | 'F1'\n | 'F2'\n | 'F3'\n | 'F4'\n | 'F5'\n | 'F6'\n | 'F7'\n | 'F8'\n | 'F9'\n | 'F10'\n | 'F11'\n | 'F12'\n | 'F13'\n | 'F14'\n | 'F15'\n | 'F16'\n | 'F17'\n | 'F18'\n | 'F19'\n | 'F20'\n | 'F21'\n | 'F22'\n | 'F23'\n | 'F24'\n | 'NumLock'\n | 'ScrollLock'\n | 'AudioVolumeMute'\n | 'AudioVolumeDown'\n | 'AudioVolumeUp'\n | 'MediaTrackNext'\n | 'MediaTrackPrevious'\n | 'MediaStop'\n | 'MediaPlayPause'\n | 'Semicolon'\n | 'Equal'\n | 'NumpadEqual'\n | 'Comma'\n | 'Minus'\n | 'Period'\n | 'Slash'\n | 'Backquote'\n | 'BracketLeft'\n | 'Backslash'\n | 'BracketRight'\n | 'Quote'\n | 'AltGraph'\n | 'Props'\n | 'Cancel'\n | 'Clear'\n | 'Shift'\n | 'Control'\n | 'Alt'\n | 'Accept'\n | 'ModeChange'\n | ' '\n | 'Print'\n | 'Execute'\n | '\\u0000'\n | 'a'\n | 'b'\n | 'c'\n | 'd'\n | 'e'\n | 'f'\n | 'g'\n | 'h'\n | 'i'\n | 'j'\n | 'k'\n | 'l'\n | 'm'\n | 'n'\n | 'o'\n | 'p'\n | 'q'\n | 'r'\n | 's'\n | 't'\n | 'u'\n | 'v'\n | 'w'\n | 'x'\n | 'y'\n | 'z'\n | 'Meta'\n | '*'\n | '+'\n | '-'\n | '/'\n | ';'\n | '='\n | ','\n | '.'\n | '`'\n | '['\n | '\\\\'\n | ']'\n | \"'\"\n | 'Attn'\n | 'CrSel'\n | 'ExSel'\n | 'EraseEof'\n | 'Play'\n | 'ZoomOut'\n | ')'\n | '!'\n | '@'\n | '#'\n | '$'\n | '%'\n | '^'\n | '&'\n | '('\n | 'A'\n | 'B'\n | 'C'\n | 'D'\n | 'E'\n | 'F'\n | 'G'\n | 'H'\n | 'I'\n | 'J'\n | 'K'\n | 'L'\n | 'M'\n | 'N'\n | 'O'\n | 'P'\n | 'Q'\n | 'R'\n | 'S'\n | 'T'\n | 'U'\n | 'V'\n | 'W'\n | 'X'\n | 'Y'\n | 'Z'\n | ':'\n | '<'\n | '_'\n | '>'\n | '?'\n | '~'\n | '{'\n | '|'\n | '}'\n | '\"'\n | 'SoftLeft'\n | 'SoftRight'\n | 'Camera'\n | 'Call'\n | 'EndCall'\n | 'VolumeDown'\n | 'VolumeUp';\n\nexport type MouseButton = 'left' | 'right' | 'middle';\n\nexport interface MouseAction {\n click: (\n x: number,\n y: number,\n options: { button: MouseButton; count?: number },\n ) => Promise<void>;\n wheel: (deltaX: number, deltaY: number) => Promise<void>;\n move: (x: number, y: number) => Promise<void>;\n drag: (\n from: { x: number; y: number },\n to: { x: number; y: number },\n ) => Promise<void>;\n}\n\nexport interface KeyboardAction {\n type: (text: string, options?: { delay?: number }) => Promise<void>;\n insertText: (text: string) => Promise<void>;\n press: (\n action:\n | { key: KeyInput; command?: string }\n | { key: KeyInput; command?: string }[],\n ) => Promise<void>;\n}\n\nexport interface ChromePageDestroyOptions {\n closeTab?: boolean; // should close the tab when the page object is destroyed\n}\n\nexport abstract class AbstractWebPage extends AbstractInterface {\n readonly keyboardTypeDelay?: number;\n readonly inputStrategy?: InputStrategy;\n navigate?(url: string): Promise<void>;\n reload?(): Promise<void>;\n goBack?(): Promise<void>;\n goForward?(): Promise<void>;\n stopLoading?(): Promise<void>;\n navigationState?(): Promise<{ isLoading: boolean }>;\n flushPendingVisualUpdate?(force?: boolean): Promise<void>;\n schedulePendingVisualUpdate?(force?: boolean): void;\n waitForDomQuiet?(opts?: {\n quietMs?: number;\n timeoutMs?: number;\n target?: ElementInfo;\n }): Promise<void>;\n\n get mouse(): MouseAction {\n return {\n click: async (\n x: number,\n y: number,\n options: { button: MouseButton },\n ) => {},\n wheel: async (deltaX: number, deltaY: number) => {},\n move: async (x: number, y: number) => {},\n drag: async (\n from: { x: number; y: number },\n to: { x: number; y: number },\n ) => {},\n };\n }\n\n get keyboard(): KeyboardAction {\n return {\n type: async (text: string, options?: { delay?: number }) => {},\n insertText: async (text: string) => {},\n press: async (\n action:\n | { key: KeyInput; command?: string }\n | { key: KeyInput; command?: string }[],\n ) => {},\n };\n }\n\n async clearInput(element?: ElementInfo): Promise<void> {}\n\n async selectAllInput(element?: ElementInfo): Promise<void> {\n throw new Error('Bulk text input is not supported by this web page');\n }\n\n abstract scrollUntilTop(startingPoint?: Point): Promise<void>;\n abstract scrollUntilBottom(startingPoint?: Point): Promise<void>;\n abstract scrollUntilLeft(startingPoint?: Point): Promise<void>;\n abstract scrollUntilRight(startingPoint?: Point): Promise<void>;\n abstract scrollUp(distance?: number, startingPoint?: Point): Promise<void>;\n abstract scrollDown(distance?: number, startingPoint?: Point): Promise<void>;\n abstract scrollLeft(distance?: number, startingPoint?: Point): Promise<void>;\n abstract scrollRight(distance?: number, startingPoint?: Point): Promise<void>;\n abstract longPress(x: number, y: number, duration?: number): Promise<void>;\n abstract swipe(\n from: { x: number; y: number },\n to: { x: number; y: number },\n duration?: number,\n ): Promise<void>;\n abstract pinch(\n centerX: number,\n centerY: number,\n startDistance: number,\n endDistance: number,\n duration?: number,\n ): Promise<void>;\n}\n\nconst scheduleWebVisualUpdate = (\n page: AbstractWebPage,\n force = false,\n): void => {\n if (page.schedulePendingVisualUpdate) {\n if (force) {\n page.schedulePendingVisualUpdate(true);\n } else {\n page.schedulePendingVisualUpdate();\n }\n return;\n }\n\n const pendingRefresh = force\n ? page.flushPendingVisualUpdate?.(true)\n : page.flushPendingVisualUpdate?.();\n void pendingRefresh?.catch(() => undefined);\n};\n\nexport function createWebInputPrimitives(\n page: AbstractWebPage,\n): BrowserInputPrimitives {\n const scheduleVisualUpdate = () => scheduleWebVisualUpdate(page);\n\n return {\n pointer: {\n tap: async ({ x, y }) => {\n await page.mouse.click(x, y, { button: 'left' });\n scheduleVisualUpdate();\n },\n rightClick: async ({ x, y }) => {\n await page.mouse.click(x, y, { button: 'right' });\n scheduleVisualUpdate();\n },\n doubleClick: async ({ x, y }) => {\n await page.mouse.click(x, y, { button: 'left', count: 2 });\n scheduleVisualUpdate();\n },\n hover: async ({ x, y }) => {\n await page.mouse.move(x, y);\n scheduleVisualUpdate();\n },\n dragAndDrop: async (from, to) => {\n await page.mouse.drag(from, to);\n scheduleVisualUpdate();\n },\n longPress: async ({ x, y }, opts) => {\n await page.longPress(x, y, opts?.duration);\n scheduleVisualUpdate();\n },\n },\n keyboard: {\n typeText: async (value, opts) => {\n const element = opts?.target;\n const { inputStrategy, keyboardTypeDelay } = resolveTextInputOptions(\n opts,\n page,\n );\n if (element && opts?.replace !== false) {\n if (inputStrategy === 'bulk') {\n // Keep the current value selected so insertText replaces it in one\n // input operation instead of emitting a separate empty value.\n await page.selectAllInput(element as ElementInfo);\n } else {\n await page.clearInput(element as ElementInfo);\n // Frameworks (React/Vue/etc.) often re-render in response to\n // the `input` event fired by clearing. If that re-render lands\n // between clearInput returning and the first typed character,\n // the keypresses can be dropped. Wait for the DOM to settle\n // before starting to type.\n await page.waitForDomQuiet?.({ target: element as ElementInfo });\n }\n } else if (element && opts?.focusOnly) {\n const target = element as ElementInfo;\n await page.mouse.click(target.center[0], target.center[1], {\n button: 'left',\n });\n await page.keyboard.press([{ key: 'End' }]);\n }\n\n if (opts?.focusOnly) {\n return;\n }\n\n if (inputStrategy === 'bulk') {\n await page.keyboard.insertText(value);\n } else if (inputStrategy === 'sequential') {\n await sendTextSequentially(\n value,\n {\n // The shared loop owns the inter-character delay. Explicitly\n // disable the page default so action-level zero remains\n // effective and positive delays are not applied twice.\n sendCharacter: (character) =>\n page.keyboard.type(character, { delay: 0 }),\n wait: sleep,\n },\n { delayMs: keyboardTypeDelay },\n );\n } else {\n const keyboardTypeOptions =\n keyboardTypeDelay === undefined\n ? undefined\n : { delay: keyboardTypeDelay };\n await page.keyboard.type(value, keyboardTypeOptions);\n }\n scheduleVisualUpdate();\n },\n keyboardPress: async (keyName, opts) => {\n const element = opts?.target as\n | { center: [number, number] }\n | undefined;\n if (element) {\n await page.mouse.click(element.center[0], element.center[1], {\n button: 'left',\n });\n }\n\n const keys = getKeyCommands(keyName);\n await page.keyboard.press(keys as any);\n scheduleVisualUpdate();\n },\n cursorMove: async (direction, times = 1) => {\n const arrowKey = direction === 'left' ? 'ArrowLeft' : 'ArrowRight';\n for (let i = 0; i < times; i++) {\n await page.keyboard.press([{ key: arrowKey as any }]);\n await sleep(100);\n }\n },\n clearInput: async (target) => {\n await page.clearInput(target as ElementInfo | undefined);\n },\n },\n touch: {\n pinch: async ({ x, y }, opts) => {\n await page.pinch(\n x,\n y,\n opts.startDistance,\n opts.endDistance,\n opts.duration,\n );\n },\n swipe: async (from, to, opts) => {\n await page.swipe(from, to, opts?.duration);\n },\n },\n scroll: {\n scroll: async (param) => {\n const element = param.locate;\n const startingPoint = element\n ? {\n left: element.center[0],\n top: element.center[1],\n }\n : undefined;\n const scrollToEventName = param?.scrollType;\n if (scrollToEventName === 'scrollToTop') {\n await page.scrollUntilTop(startingPoint);\n } else if (scrollToEventName === 'scrollToBottom') {\n await page.scrollUntilBottom(startingPoint);\n } else if (scrollToEventName === 'scrollToRight') {\n await page.scrollUntilRight(startingPoint);\n } else if (scrollToEventName === 'scrollToLeft') {\n await page.scrollUntilLeft(startingPoint);\n } else if (scrollToEventName === 'singleAction' || !scrollToEventName) {\n if (param?.direction === 'down' || !param || !param.direction) {\n await page.scrollDown(param?.distance || undefined, startingPoint);\n } else if (param.direction === 'up') {\n await page.scrollUp(param.distance || undefined, startingPoint);\n } else if (param.direction === 'left') {\n await page.scrollLeft(param.distance || undefined, startingPoint);\n } else if (param.direction === 'right') {\n await page.scrollRight(param.distance || undefined, startingPoint);\n } else {\n throw new Error(`Unknown scroll direction: ${param.direction}`);\n }\n await sleep(500);\n } else {\n throw new Error(\n `Unknown scroll event type: ${scrollToEventName}, param: ${JSON.stringify(\n param,\n )}`,\n );\n }\n scheduleVisualUpdate();\n },\n },\n };\n}\n\nexport const commonWebActionsForWebPage = <T extends AbstractWebPage>(\n page: T,\n includeTouchEvents = false,\n): DeviceAction<any>[] => {\n const input = createWebInputPrimitives(page);\n return [\n ...defineActionsFromInputPrimitives(input, {\n size: () => page.size(),\n includeSwipe: includeTouchEvents,\n }),\n\n defineAction<typeof navigateParamSchema, { url: string }>({\n name: 'Navigate',\n description:\n 'Navigate the browser to a specified URL. Opens the URL in the current tab.',\n paramSchema: navigateParamSchema,\n sample: {\n url: 'https://www.example.com',\n },\n call: async (param) => {\n if (!page.navigate) {\n throw new Error(\n 'Navigate operation is not supported on this page type',\n );\n }\n await page.navigate(param.url);\n scheduleWebVisualUpdate(page, true);\n },\n }),\n\n defineAction({\n name: 'Reload',\n supportedBySystemOne: true,\n description: 'Reload the current page',\n call: async () => {\n if (!page.reload) {\n throw new Error(\n 'Reload operation is not supported on this page type',\n );\n }\n await page.reload();\n scheduleWebVisualUpdate(page, true);\n },\n }),\n\n defineAction({\n name: 'GoBack',\n supportedBySystemOne: true,\n description: 'Navigate back in browser history',\n call: async () => {\n if (!page.goBack) {\n throw new Error(\n 'GoBack operation is not supported on this page type',\n );\n }\n await page.goBack();\n scheduleWebVisualUpdate(page, true);\n },\n }),\n defineAction({\n name: 'GoForward',\n supportedBySystemOne: true,\n description: 'Navigate forward in browser history',\n call: async () => {\n if (!page.goForward) {\n throw new Error(\n 'GoForward operation is not supported on this page type',\n );\n }\n await page.goForward();\n scheduleWebVisualUpdate(page, true);\n },\n }),\n ];\n};\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","navigateParamSchema","z","normalizeKeyInputs","value","inputs","Array","result","input","trimmed","normalized","transformed","transformHotkeyInput","getKeyCommands","keys","acc","k","includeMeta","AbstractWebPage","AbstractInterface","x","y","options","deltaX","deltaY","from","to","text","action","element","Error","scheduleWebVisualUpdate","page","force","pendingRefresh","undefined","createWebInputPrimitives","scheduleVisualUpdate","opts","inputStrategy","keyboardTypeDelay","resolveTextInputOptions","target","sendTextSequentially","character","sleep","keyboardTypeOptions","keyName","direction","times","arrowKey","i","param","startingPoint","scrollToEventName","JSON","commonWebActionsForWebPage","includeTouchEvents","defineActionsFromInputPrimitives","defineAction"],"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;;;;;;;;;;;;;;;;;;;;;;;;ACWA,MAAMI,sBAAsBC,qBAAAA,CAAAA,CAAAA,MAAQ,CAAC;IACnC,KAAKA,qBAAAA,CAAAA,CAAAA,MACI,GACN,QAAQ,CACP;AAEN;AAEA,SAASC,mBAAmBC,KAAwB;IAClD,MAAMC,SAASC,MAAM,OAAO,CAACF,SAASA,QAAQ;QAACA;KAAM;IACrD,MAAMG,SAAmB,EAAE;IAE3B,KAAK,MAAMC,SAASH,OAAQ;QAC1B,IAAI,AAAiB,YAAjB,OAAOG,OAAoB;YAC7BD,OAAO,IAAI,CAACC;YACZ;QACF;QAEA,MAAMC,UAAUD,MAAM,IAAI;QAC1B,IAAI,CAACC,SAAS;YACZF,OAAO,IAAI,CAACC;YACZ;QACF;QAEA,IAAIE,aAAaD;QACjB,IAAIC,WAAW,MAAM,GAAG,KAAKA,WAAW,QAAQ,CAAC,MAC/CA,aAAaA,WAAW,OAAO,CAAC,aAAa;QAE/C,IAAI,KAAK,IAAI,CAACA,aACZA,aAAaA,WAAW,OAAO,CAAC,QAAQ;QAG1C,MAAMC,cAAcC,AAAAA,IAAAA,mCAAAA,oBAAAA,AAAAA,EAAqBF;QACzC,IAAIC,AAAuB,MAAvBA,YAAY,MAAM,IAAUA,AAAmB,OAAnBA,WAAW,CAAC,EAAE,IAAWF,AAAY,OAAZA,SAAgB;YACvEF,OAAO,IAAI,CAACC;YACZ;QACF;QACA,IAAIG,AAAuB,MAAvBA,YAAY,MAAM,EAAQ;YAC5BJ,OAAO,IAAI,CAACC;YACZ;QACF;QAEAD,OAAO,IAAI,IAAII;IACjB;IAEA,OAAOJ;AACT;AAEO,SAASM,eACdT,KAAwB;IAExB,MAAMU,OAAOX,mBAAmBC;IAEhC,OAAOU,KAAK,MAAM,CAAC,CAACC,KAA+CC;QACjE,MAAMC,cAAcH,KAAK,QAAQ,CAAC,WAAWA,KAAK,QAAQ,CAAC;QAC3D,IAAIG,eAAgBD,CAAAA,AAAM,QAANA,KAAaA,AAAM,QAANA,CAAQ,GACvC,OAAOD,IAAI,MAAM,CAAC;YAAC;gBAAE,KAAKC;gBAAG,SAAS;YAAY;SAAE;QAEtD,IAAIC,eAAgBD,CAAAA,AAAM,QAANA,KAAaA,AAAM,QAANA,CAAQ,GACvC,OAAOD,IAAI,MAAM,CAAC;YAAC;gBAAE,KAAKC;gBAAG,SAAS;YAAO;SAAE;QAEjD,IAAIC,eAAgBD,CAAAA,AAAM,QAANA,KAAaA,AAAM,QAANA,CAAQ,GACvC,OAAOD,IAAI,MAAM,CAAC;YAAC;gBAAE,KAAKC;gBAAG,SAAS;YAAQ;SAAE;QAElD,OAAOD,IAAI,MAAM,CAAC;YAAC;gBAAE,KAAKC;YAAE;SAAE;IAChC,GAAG,EAAE;AACP;AAkSO,MAAeE,wBAAwBC,uBAAAA,iBAAiBA;IAiB7D,IAAI,QAAqB;QACvB,OAAO;YACL,OAAO,OACLC,GACAC,GACAC,WACI;YACN,OAAO,OAAOC,QAAgBC,UAAoB;YAClD,MAAM,OAAOJ,GAAWC,KAAe;YACvC,MAAM,OACJI,MACAC,MACI;QACR;IACF;IAEA,IAAI,WAA2B;QAC7B,OAAO;YACL,MAAM,OAAOC,MAAcL,WAAkC;YAC7D,YAAY,OAAOK,QAAkB;YACrC,OAAO,OACLC,UAGI;QACR;IACF;IAEA,MAAM,WAAWC,OAAqB,EAAiB,CAAC;IAExD,MAAM,eAAeA,OAAqB,EAAiB;QACzD,MAAM,IAAIC,MAAM;IAClB;;QAjDK,gBACL,uBAAS,qBAAT,SACA,uBAAS,iBAAT;;AAsEF;AAEA,MAAMC,0BAA0B,CAC9BC,MACAC,QAAQ,KAAK;IAEb,IAAID,KAAK,2BAA2B,EAAE;QACpC,IAAIC,OACFD,KAAK,2BAA2B,CAAC;aAEjCA,KAAK,2BAA2B;QAElC;IACF;IAEA,MAAME,iBAAiBD,QACnBD,KAAK,wBAAwB,GAAG,QAChCA,KAAK,wBAAwB;IAC5BE,gBAAgB,MAAM,IAAMC;AACnC;AAEO,SAASC,yBACdJ,IAAqB;IAErB,MAAMK,uBAAuB,IAAMN,wBAAwBC;IAE3D,OAAO;QACL,SAAS;YACP,KAAK,OAAO,EAAEZ,CAAC,EAAEC,CAAC,EAAE;gBAClB,MAAMW,KAAK,KAAK,CAAC,KAAK,CAACZ,GAAGC,GAAG;oBAAE,QAAQ;gBAAO;gBAC9CgB;YACF;YACA,YAAY,OAAO,EAAEjB,CAAC,EAAEC,CAAC,EAAE;gBACzB,MAAMW,KAAK,KAAK,CAAC,KAAK,CAACZ,GAAGC,GAAG;oBAAE,QAAQ;gBAAQ;gBAC/CgB;YACF;YACA,aAAa,OAAO,EAAEjB,CAAC,EAAEC,CAAC,EAAE;gBAC1B,MAAMW,KAAK,KAAK,CAAC,KAAK,CAACZ,GAAGC,GAAG;oBAAE,QAAQ;oBAAQ,OAAO;gBAAE;gBACxDgB;YACF;YACA,OAAO,OAAO,EAAEjB,CAAC,EAAEC,CAAC,EAAE;gBACpB,MAAMW,KAAK,KAAK,CAAC,IAAI,CAACZ,GAAGC;gBACzBgB;YACF;YACA,aAAa,OAAOZ,MAAMC;gBACxB,MAAMM,KAAK,KAAK,CAAC,IAAI,CAACP,MAAMC;gBAC5BW;YACF;YACA,WAAW,OAAO,EAAEjB,CAAC,EAAEC,CAAC,EAAE,EAAEiB;gBAC1B,MAAMN,KAAK,SAAS,CAACZ,GAAGC,GAAGiB,MAAM;gBACjCD;YACF;QACF;QACA,UAAU;YACR,UAAU,OAAOjC,OAAOkC;gBACtB,MAAMT,UAAUS,MAAM;gBACtB,MAAM,EAAEC,aAAa,EAAEC,iBAAiB,EAAE,GAAGC,AAAAA,IAAAA,uBAAAA,uBAAAA,AAAAA,EAC3CH,MACAN;gBAEF,IAAIH,WAAWS,MAAM,YAAY,OAC/B,IAAIC,AAAkB,WAAlBA,eAGF,MAAMP,KAAK,cAAc,CAACH;qBACrB;oBACL,MAAMG,KAAK,UAAU,CAACH;oBAMtB,MAAMG,KAAK,eAAe,GAAG;wBAAE,QAAQH;oBAAuB;gBAChE;qBACK,IAAIA,WAAWS,MAAM,WAAW;oBACrC,MAAMI,SAASb;oBACf,MAAMG,KAAK,KAAK,CAAC,KAAK,CAACU,OAAO,MAAM,CAAC,EAAE,EAAEA,OAAO,MAAM,CAAC,EAAE,EAAE;wBACzD,QAAQ;oBACV;oBACA,MAAMV,KAAK,QAAQ,CAAC,KAAK,CAAC;wBAAC;4BAAE,KAAK;wBAAM;qBAAE;gBAC5C;gBAEA,IAAIM,MAAM,WACR;gBAGF,IAAIC,AAAkB,WAAlBA,eACF,MAAMP,KAAK,QAAQ,CAAC,UAAU,CAAC5B;qBAC1B,IAAImC,AAAkB,iBAAlBA,eACT,MAAMI,AAAAA,IAAAA,uBAAAA,oBAAAA,AAAAA,EACJvC,OACA;oBAIE,eAAe,CAACwC,YACdZ,KAAK,QAAQ,CAAC,IAAI,CAACY,WAAW;4BAAE,OAAO;wBAAE;oBAC3C,MAAMC,sBAAAA,KAAKA;gBACb,GACA;oBAAE,SAASL;gBAAkB;qBAE1B;oBACL,MAAMM,sBACJN,AAAsBL,WAAtBK,oBACIL,SACA;wBAAE,OAAOK;oBAAkB;oBACjC,MAAMR,KAAK,QAAQ,CAAC,IAAI,CAAC5B,OAAO0C;gBAClC;gBACAT;YACF;YACA,eAAe,OAAOU,SAAST;gBAC7B,MAAMT,UAAUS,MAAM;gBAGtB,IAAIT,SACF,MAAMG,KAAK,KAAK,CAAC,KAAK,CAACH,QAAQ,MAAM,CAAC,EAAE,EAAEA,QAAQ,MAAM,CAAC,EAAE,EAAE;oBAC3D,QAAQ;gBACV;gBAGF,MAAMf,OAAOD,eAAekC;gBAC5B,MAAMf,KAAK,QAAQ,CAAC,KAAK,CAAClB;gBAC1BuB;YACF;YACA,YAAY,OAAOW,WAAWC,QAAQ,CAAC;gBACrC,MAAMC,WAAWF,AAAc,WAAdA,YAAuB,cAAc;gBACtD,IAAK,IAAIG,IAAI,GAAGA,IAAIF,OAAOE,IAAK;oBAC9B,MAAMnB,KAAK,QAAQ,CAAC,KAAK,CAAC;wBAAC;4BAAE,KAAKkB;wBAAgB;qBAAE;oBACpD,MAAML,AAAAA,IAAAA,sBAAAA,KAAAA,AAAAA,EAAM;gBACd;YACF;YACA,YAAY,OAAOH;gBACjB,MAAMV,KAAK,UAAU,CAACU;YACxB;QACF;QACA,OAAO;YACL,OAAO,OAAO,EAAEtB,CAAC,EAAEC,CAAC,EAAE,EAAEiB;gBACtB,MAAMN,KAAK,KAAK,CACdZ,GACAC,GACAiB,KAAK,aAAa,EAClBA,KAAK,WAAW,EAChBA,KAAK,QAAQ;YAEjB;YACA,OAAO,OAAOb,MAAMC,IAAIY;gBACtB,MAAMN,KAAK,KAAK,CAACP,MAAMC,IAAIY,MAAM;YACnC;QACF;QACA,QAAQ;YACN,QAAQ,OAAOc;gBACb,MAAMvB,UAAUuB,MAAM,MAAM;gBAC5B,MAAMC,gBAAgBxB,UAClB;oBACE,MAAMA,QAAQ,MAAM,CAAC,EAAE;oBACvB,KAAKA,QAAQ,MAAM,CAAC,EAAE;gBACxB,IACAM;gBACJ,MAAMmB,oBAAoBF,OAAO;gBACjC,IAAIE,AAAsB,kBAAtBA,mBACF,MAAMtB,KAAK,cAAc,CAACqB;qBACrB,IAAIC,AAAsB,qBAAtBA,mBACT,MAAMtB,KAAK,iBAAiB,CAACqB;qBACxB,IAAIC,AAAsB,oBAAtBA,mBACT,MAAMtB,KAAK,gBAAgB,CAACqB;qBACvB,IAAIC,AAAsB,mBAAtBA,mBACT,MAAMtB,KAAK,eAAe,CAACqB;qBACtB,IAAIC,AAAsB,mBAAtBA,qBAAyCA,mBAclD,MAAM,IAAIxB,MACR,CAAC,2BAA2B,EAAEwB,kBAAkB,SAAS,EAAEC,KAAK,SAAS,CACvEH,QACC;qBAjBgE;oBACrE,IAAIA,OAAO,cAAc,UAAWA,SAAUA,MAAM,SAAS,EAEtD,IAAIA,AAAoB,SAApBA,MAAM,SAAS,EACxB,MAAMpB,KAAK,QAAQ,CAACoB,MAAM,QAAQ,IAAIjB,QAAWkB;yBAC5C,IAAID,AAAoB,WAApBA,MAAM,SAAS,EACxB,MAAMpB,KAAK,UAAU,CAACoB,MAAM,QAAQ,IAAIjB,QAAWkB;yBAC9C,IAAID,AAAoB,YAApBA,MAAM,SAAS,EACxB,MAAMpB,KAAK,WAAW,CAACoB,MAAM,QAAQ,IAAIjB,QAAWkB;yBAEpD,MAAM,IAAIvB,MAAM,CAAC,0BAA0B,EAAEsB,MAAM,SAAS,EAAE;yBAR9D,MAAMpB,KAAK,UAAU,CAACoB,OAAO,YAAYjB,QAAWkB;oBAUtD,MAAMR,AAAAA,IAAAA,sBAAAA,KAAAA,AAAAA,EAAM;gBACd;gBAOAR;YACF;QACF;IACF;AACF;AAEO,MAAMmB,6BAA6B,CACxCxB,MACAyB,qBAAqB,KAAK;IAE1B,MAAMjD,QAAQ4B,yBAAyBJ;IACvC,OAAO;WACF0B,AAAAA,IAAAA,uBAAAA,gCAAAA,AAAAA,EAAiClD,OAAO;YACzC,MAAM,IAAMwB,KAAK,IAAI;YACrB,cAAcyB;QAChB;QAEAE,IAAAA,uBAAAA,YAAAA,AAAAA,EAA0D;YACxD,MAAM;YACN,aACE;YACF,aAAa1D;YACb,QAAQ;gBACN,KAAK;YACP;YACA,MAAM,OAAOmD;gBACX,IAAI,CAACpB,KAAK,QAAQ,EAChB,MAAM,IAAIF,MACR;gBAGJ,MAAME,KAAK,QAAQ,CAACoB,MAAM,GAAG;gBAC7BrB,wBAAwBC,MAAM;YAChC;QACF;QAEA2B,IAAAA,uBAAAA,YAAAA,AAAAA,EAAa;YACX,MAAM;YACN,sBAAsB;YACtB,aAAa;YACb,MAAM;gBACJ,IAAI,CAAC3B,KAAK,MAAM,EACd,MAAM,IAAIF,MACR;gBAGJ,MAAME,KAAK,MAAM;gBACjBD,wBAAwBC,MAAM;YAChC;QACF;QAEA2B,IAAAA,uBAAAA,YAAAA,AAAAA,EAAa;YACX,MAAM;YACN,sBAAsB;YACtB,aAAa;YACb,MAAM;gBACJ,IAAI,CAAC3B,KAAK,MAAM,EACd,MAAM,IAAIF,MACR;gBAGJ,MAAME,KAAK,MAAM;gBACjBD,wBAAwBC,MAAM;YAChC;QACF;QACA2B,IAAAA,uBAAAA,YAAAA,AAAAA,EAAa;YACX,MAAM;YACN,sBAAsB;YACtB,aAAa;YACb,MAAM;gBACJ,IAAI,CAAC3B,KAAK,SAAS,EACjB,MAAM,IAAIF,MACR;gBAGJ,MAAME,KAAK,SAAS;gBACpBD,wBAAwBC,MAAM;YAChC;QACF;KACD;AACH"}
@@ -1 +1 @@
1
- {"version":3,"file":"web-page.d.ts","sourceRoot":"","sources":["../../src/web-page.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"web-page.d.ts","sourceRoot":"","sources":["../../src/web-page.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -8,7 +8,7 @@
8
8
  "Browser use",
9
9
  "Android use"
10
10
  ],
11
- "version": "1.16.5",
11
+ "version": "1.17.0",
12
12
  "repository": "https://github.com/web-infra-dev/midscene",
13
13
  "homepage": "https://midscenejs.com/",
14
14
  "main": "./dist/lib/index.js",
@@ -122,9 +122,9 @@
122
122
  "socket.io-client": "4.8.1",
123
123
  "ws": "^8.18.1",
124
124
  "zod": "^3.25.1",
125
- "@midscene/core": "1.16.5",
126
- "@midscene/shared": "1.16.5",
127
- "@midscene/playground": "1.16.5"
125
+ "@midscene/core": "1.17.0",
126
+ "@midscene/playground": "1.17.0",
127
+ "@midscene/shared": "1.17.0"
128
128
  },
129
129
  "devDependencies": {
130
130
  "@playwright/test": "^1.45.0",