@midscene/web 0.30.10 → 1.0.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.
Files changed (112) hide show
  1. package/dist/es/bin.mjs +0 -4
  2. package/dist/es/bin.mjs.map +1 -1
  3. package/dist/es/bridge-mode/agent-cli-side.mjs +22 -11
  4. package/dist/es/bridge-mode/agent-cli-side.mjs.map +1 -1
  5. package/dist/es/bridge-mode/common.mjs +8 -2
  6. package/dist/es/bridge-mode/common.mjs.map +1 -1
  7. package/dist/es/bridge-mode/io-client.mjs +10 -16
  8. package/dist/es/bridge-mode/io-client.mjs.map +1 -1
  9. package/dist/es/bridge-mode/io-server.mjs +21 -19
  10. package/dist/es/bridge-mode/io-server.mjs.map +1 -1
  11. package/dist/es/bridge-mode/page-browser-side.mjs +10 -11
  12. package/dist/es/bridge-mode/page-browser-side.mjs.map +1 -1
  13. package/dist/es/chrome-extension/agent.mjs.map +1 -1
  14. package/dist/es/chrome-extension/cdpInput.mjs.map +1 -1
  15. package/dist/es/chrome-extension/dynamic-scripts.mjs.map +1 -1
  16. package/dist/es/chrome-extension/page.mjs +85 -89
  17. package/dist/es/chrome-extension/page.mjs.map +1 -1
  18. package/dist/es/playwright/ai-fixture.mjs +43 -14
  19. package/dist/es/playwright/ai-fixture.mjs.map +1 -1
  20. package/dist/es/playwright/index.mjs +18 -2
  21. package/dist/es/playwright/index.mjs.map +1 -1
  22. package/dist/es/playwright/page.mjs.map +1 -1
  23. package/dist/es/playwright/reporter/index.mjs +30 -16
  24. package/dist/es/playwright/reporter/index.mjs.map +1 -1
  25. package/dist/es/puppeteer/agent-launcher.mjs +48 -22
  26. package/dist/es/puppeteer/agent-launcher.mjs.map +1 -1
  27. package/dist/es/puppeteer/base-page.mjs +67 -26
  28. package/dist/es/puppeteer/base-page.mjs.map +1 -1
  29. package/dist/es/puppeteer/index.mjs +18 -2
  30. package/dist/es/puppeteer/index.mjs.map +1 -1
  31. package/dist/es/puppeteer/page.mjs.map +1 -1
  32. package/dist/es/static/static-agent.mjs.map +1 -1
  33. package/dist/es/static/static-page.mjs +1 -10
  34. package/dist/es/static/static-page.mjs.map +1 -1
  35. package/dist/es/utils.mjs +8 -0
  36. package/dist/es/utils.mjs.map +1 -0
  37. package/dist/es/web-element.mjs +2 -24
  38. package/dist/es/web-element.mjs.map +1 -1
  39. package/dist/es/web-page.mjs +71 -41
  40. package/dist/es/web-page.mjs.map +1 -1
  41. package/dist/lib/bin.js +1 -5
  42. package/dist/lib/bin.js.map +1 -1
  43. package/dist/lib/bridge-mode/agent-cli-side.js +23 -12
  44. package/dist/lib/bridge-mode/agent-cli-side.js.map +1 -1
  45. package/dist/lib/bridge-mode/browser.js +2 -2
  46. package/dist/lib/bridge-mode/browser.js.map +1 -1
  47. package/dist/lib/bridge-mode/common.js +17 -5
  48. package/dist/lib/bridge-mode/common.js.map +1 -1
  49. package/dist/lib/bridge-mode/index.js +3 -3
  50. package/dist/lib/bridge-mode/index.js.map +1 -1
  51. package/dist/lib/bridge-mode/io-client.js +12 -18
  52. package/dist/lib/bridge-mode/io-client.js.map +1 -1
  53. package/dist/lib/bridge-mode/io-server.js +25 -23
  54. package/dist/lib/bridge-mode/io-server.js.map +1 -1
  55. package/dist/lib/bridge-mode/page-browser-side.js +12 -13
  56. package/dist/lib/bridge-mode/page-browser-side.js.map +1 -1
  57. package/dist/lib/chrome-extension/agent.js +2 -2
  58. package/dist/lib/chrome-extension/agent.js.map +1 -1
  59. package/dist/lib/chrome-extension/cdpInput.js +2 -2
  60. package/dist/lib/chrome-extension/cdpInput.js.map +1 -1
  61. package/dist/lib/chrome-extension/dynamic-scripts.js +2 -2
  62. package/dist/lib/chrome-extension/dynamic-scripts.js.map +1 -1
  63. package/dist/lib/chrome-extension/index.js +3 -3
  64. package/dist/lib/chrome-extension/index.js.map +1 -1
  65. package/dist/lib/chrome-extension/page.js +87 -91
  66. package/dist/lib/chrome-extension/page.js.map +1 -1
  67. package/dist/lib/index.js +6 -6
  68. package/dist/lib/index.js.map +1 -1
  69. package/dist/lib/playwright/ai-fixture.js +46 -17
  70. package/dist/lib/playwright/ai-fixture.js.map +1 -1
  71. package/dist/lib/playwright/index.js +32 -6
  72. package/dist/lib/playwright/index.js.map +1 -1
  73. package/dist/lib/playwright/page.js +2 -2
  74. package/dist/lib/playwright/page.js.map +1 -1
  75. package/dist/lib/playwright/reporter/index.js +32 -18
  76. package/dist/lib/playwright/reporter/index.js.map +1 -1
  77. package/dist/lib/puppeteer/agent-launcher.js +57 -28
  78. package/dist/lib/puppeteer/agent-launcher.js.map +1 -1
  79. package/dist/lib/puppeteer/base-page.js +73 -29
  80. package/dist/lib/puppeteer/base-page.js.map +1 -1
  81. package/dist/lib/puppeteer/index.js +31 -5
  82. package/dist/lib/puppeteer/index.js.map +1 -1
  83. package/dist/lib/puppeteer/page.js +2 -2
  84. package/dist/lib/puppeteer/page.js.map +1 -1
  85. package/dist/lib/static/index.js +4 -4
  86. package/dist/lib/static/index.js.map +1 -1
  87. package/dist/lib/static/static-agent.js +2 -2
  88. package/dist/lib/static/static-agent.js.map +1 -1
  89. package/dist/lib/static/static-page.js +3 -12
  90. package/dist/lib/static/static-page.js.map +1 -1
  91. package/dist/lib/utils.js +40 -0
  92. package/dist/lib/utils.js.map +1 -0
  93. package/dist/lib/web-element.js +6 -28
  94. package/dist/lib/web-element.js.map +1 -1
  95. package/dist/lib/web-page.js +73 -43
  96. package/dist/lib/web-page.js.map +1 -1
  97. package/dist/types/bridge-mode/agent-cli-side.d.ts +23 -2
  98. package/dist/types/bridge-mode/common.d.ts +9 -0
  99. package/dist/types/bridge-mode/io-server.d.ts +3 -2
  100. package/dist/types/bridge-mode/page-browser-side.d.ts +2 -1
  101. package/dist/types/chrome-extension/page.d.ts +19 -6
  102. package/dist/types/playwright/ai-fixture.d.ts +16 -2
  103. package/dist/types/playwright/index.d.ts +1 -0
  104. package/dist/types/playwright/reporter/index.d.ts +2 -0
  105. package/dist/types/puppeteer/agent-launcher.d.ts +3 -4
  106. package/dist/types/puppeteer/base-page.d.ts +18 -5
  107. package/dist/types/puppeteer/index.d.ts +1 -0
  108. package/dist/types/static/static-page.d.ts +0 -1
  109. package/dist/types/utils.d.ts +6 -0
  110. package/dist/types/web-element.d.ts +10 -0
  111. package/dist/types/web-page.d.ts +4 -1
  112. package/package.json +13 -20
@@ -1,4 +1,3 @@
1
- import { traverseTree } from "@midscene/shared/extractor";
2
1
  import { getDebug } from "@midscene/shared/logger";
3
2
  import { commonContextParser } from "@midscene/core/agent";
4
3
  function _define_property(obj, key, value) {
@@ -34,33 +33,12 @@ class WebElementInfoImpl {
34
33
  this.isVisible = isVisible;
35
34
  }
36
35
  }
37
- const debug = getDebug('web:parse-context');
36
+ getDebug('web:parse-context');
38
37
  async function WebPageContextParser(page, _opt) {
39
- var _page_getElementsNodeTree;
40
38
  const basicContext = await commonContextParser(page, {
41
39
  uploadServerUrl: _opt.uploadServerUrl
42
40
  });
43
- debug('will traverse element tree');
44
- const tree = await (null == (_page_getElementsNodeTree = page.getElementsNodeTree) ? void 0 : _page_getElementsNodeTree.call(page)) || {
45
- node: null,
46
- children: []
47
- };
48
- const webTree = traverseTree(tree, (elementInfo)=>{
49
- const { rect, id, content, attributes, indexId, isVisible } = elementInfo;
50
- return new WebElementInfoImpl({
51
- rect,
52
- id,
53
- content,
54
- attributes,
55
- indexId,
56
- isVisible
57
- });
58
- });
59
- debug('traverse element tree end');
60
- return {
61
- ...basicContext,
62
- tree: webTree
63
- };
41
+ return basicContext;
64
42
  }
65
43
  const limitOpenNewTabScript = `
66
44
  if (!window.__MIDSCENE_NEW_TAB_INTERCEPTOR_INITIALIZED__) {
@@ -1 +1 @@
1
- {"version":3,"file":"web-element.mjs","sources":["webpack://@midscene/web/./src/web-element.ts"],"sourcesContent":["import type {\n AgentOpt,\n DeviceAction,\n Rect,\n UIContext,\n WebElementInfo,\n} from '@midscene/core';\nimport type { AbstractInterface } from '@midscene/core/device';\nimport { traverseTree } from '@midscene/shared/extractor';\nimport { getDebug } from '@midscene/shared/logger';\nimport { _keyDefinitions } from '@midscene/shared/us-keyboard-layout';\n\nimport { commonContextParser } from '@midscene/core/agent';\nimport type { NodeType } from '@midscene/shared/constants';\nimport type ChromeExtensionProxyPage from './chrome-extension/page';\nimport type { PlaywrightWebPage } from './playwright';\nimport type { PuppeteerWebPage } from './puppeteer';\nimport type { StaticPage } from './static';\nexport type { WebElementInfo };\n\nexport type WebPageAgentOpt = AgentOpt & WebPageOpt;\nexport type WebPageOpt = {\n waitForNavigationTimeout?: number;\n waitForNetworkIdleTimeout?: number;\n forceSameTabNavigation?: boolean /* if limit the new tab to the current page, default true */;\n beforeInvokeAction?: () => Promise<void>;\n afterInvokeAction?: () => Promise<void>;\n customActions?: DeviceAction<any>[];\n};\n\nexport type WebPage =\n | PlaywrightWebPage\n | PuppeteerWebPage\n | StaticPage\n | ChromeExtensionProxyPage;\n\nexport class WebElementInfoImpl implements WebElementInfo {\n content: string;\n\n rect: Rect;\n\n center: [number, number];\n\n id: string;\n\n indexId: number;\n\n attributes: {\n nodeType: NodeType;\n [key: string]: string;\n };\n\n xpaths?: string[];\n\n isVisible: boolean;\n\n constructor({\n content,\n rect,\n id,\n attributes,\n indexId,\n xpaths,\n isVisible,\n }: {\n content: string;\n rect: Rect;\n id: string;\n attributes: {\n nodeType: NodeType;\n [key: string]: string;\n };\n indexId: number;\n xpaths?: string[];\n isVisible: boolean;\n }) {\n this.content = content;\n this.rect = rect;\n this.center = [\n Math.floor(rect.left + rect.width / 2),\n Math.floor(rect.top + rect.height / 2),\n ];\n this.id = id;\n this.attributes = attributes;\n this.indexId = indexId;\n this.xpaths = xpaths;\n this.isVisible = isVisible;\n }\n}\n\nconst debug = getDebug('web:parse-context');\nexport async function WebPageContextParser(\n page: AbstractInterface,\n _opt: { uploadServerUrl?: string },\n): Promise<UIContext> {\n const basicContext = await commonContextParser(page, {\n uploadServerUrl: _opt.uploadServerUrl,\n });\n\n debug('will traverse element tree');\n const tree = (await page.getElementsNodeTree?.()) || {\n node: null,\n children: [],\n };\n const webTree = traverseTree(tree!, (elementInfo) => {\n const { rect, id, content, attributes, indexId, isVisible } = elementInfo;\n return new WebElementInfoImpl({\n rect,\n id,\n content,\n attributes,\n indexId,\n isVisible,\n });\n });\n debug('traverse element tree end');\n\n return {\n ...basicContext,\n tree: webTree,\n };\n}\n\nexport const limitOpenNewTabScript = `\nif (!window.__MIDSCENE_NEW_TAB_INTERCEPTOR_INITIALIZED__) {\n window.__MIDSCENE_NEW_TAB_INTERCEPTOR_INITIALIZED__ = true;\n\n // Intercept the window.open method (only once)\n window.open = function(url) {\n console.log('Blocked window.open:', url);\n window.location.href = url;\n return null;\n };\n\n // Block all a tag clicks with target=\"_blank\" (only once)\n document.addEventListener('click', function(e) {\n const target = e.target.closest('a');\n if (target && target.target === '_blank') {\n e.preventDefault();\n console.log('Blocked new tab:', target.href);\n window.location.href = target.href;\n target.removeAttribute('target');\n }\n }, true);\n}\n`;\n"],"names":["WebElementInfoImpl","content","rect","id","attributes","indexId","xpaths","isVisible","Math","debug","getDebug","WebPageContextParser","page","_opt","basicContext","commonContextParser","tree","webTree","traverseTree","elementInfo","limitOpenNewTabScript"],"mappings":";;;;;;;;;;;;;AAoCO,MAAMA;IAoBX,YAAY,EACVC,OAAO,EACPC,IAAI,EACJC,EAAE,EACFC,UAAU,EACVC,OAAO,EACPC,MAAM,EACNC,SAAS,EAYV,CAAE;QAtCH;QAEA;QAEA;QAEA;QAEA;QAEA;QAKA;QAEA;QAsBE,IAAI,CAAC,OAAO,GAAGN;QACf,IAAI,CAAC,IAAI,GAAGC;QACZ,IAAI,CAAC,MAAM,GAAG;YACZM,KAAK,KAAK,CAACN,KAAK,IAAI,GAAGA,KAAK,KAAK,GAAG;YACpCM,KAAK,KAAK,CAACN,KAAK,GAAG,GAAGA,KAAK,MAAM,GAAG;SACrC;QACD,IAAI,CAAC,EAAE,GAAGC;QACV,IAAI,CAAC,UAAU,GAAGC;QAClB,IAAI,CAAC,OAAO,GAAGC;QACf,IAAI,CAAC,MAAM,GAAGC;QACd,IAAI,CAAC,SAAS,GAAGC;IACnB;AACF;AAEA,MAAME,QAAQC,SAAS;AAChB,eAAeC,qBACpBC,IAAuB,EACvBC,IAAkC;QAOdD;IALpB,MAAME,eAAe,MAAMC,oBAAoBH,MAAM;QACnD,iBAAiBC,KAAK,eAAe;IACvC;IAEAJ,MAAM;IACN,MAAMO,OAAQ,eAAMJ,CAAAA,4BAAAA,KAAK,mBAAmB,AAAD,IAAvBA,KAAAA,IAAAA,0BAAAA,IAAAA,CAAAA,KAAI,KAA6B;QACnD,MAAM;QACN,UAAU,EAAE;IACd;IACA,MAAMK,UAAUC,aAAaF,MAAO,CAACG;QACnC,MAAM,EAAEjB,IAAI,EAAEC,EAAE,EAAEF,OAAO,EAAEG,UAAU,EAAEC,OAAO,EAAEE,SAAS,EAAE,GAAGY;QAC9D,OAAO,IAAInB,mBAAmB;YAC5BE;YACAC;YACAF;YACAG;YACAC;YACAE;QACF;IACF;IACAE,MAAM;IAEN,OAAO;QACL,GAAGK,YAAY;QACf,MAAMG;IACR;AACF;AAEO,MAAMG,wBAAwB,CAAC;;;;;;;;;;;;;;;;;;;;;;AAsBtC,CAAC"}
1
+ {"version":3,"file":"web-element.mjs","sources":["../../src/web-element.ts"],"sourcesContent":["import type {\n AgentOpt,\n DeviceAction,\n Rect,\n UIContext,\n WebElementInfo,\n} from '@midscene/core';\nimport type { AbstractInterface } from '@midscene/core/device';\nimport { getDebug } from '@midscene/shared/logger';\nimport { _keyDefinitions } from '@midscene/shared/us-keyboard-layout';\n\nimport { commonContextParser } from '@midscene/core/agent';\nimport type { NodeType } from '@midscene/shared/constants';\nimport type ChromeExtensionProxyPage from './chrome-extension/page';\nimport type { PlaywrightWebPage } from './playwright';\nimport type { PuppeteerWebPage } from './puppeteer';\nimport type { StaticPage } from './static';\nexport type { WebElementInfo };\n\nexport type WebPageAgentOpt = AgentOpt & WebPageOpt;\nexport type WebPageOpt = {\n waitForNavigationTimeout?: number;\n waitForNetworkIdleTimeout?: number;\n forceSameTabNavigation?: boolean /* if limit the new tab to the current page, default true */;\n enableTouchEventsInActionSpace?: boolean;\n /**\n * Force Chrome to render select elements using base-select appearance instead of OS-native rendering.\n * This makes select elements visible in screenshots captured by Playwright/Puppeteer.\n *\n * Reference: https://developer.chrome.com/blog/a-customizable-select\n *\n * When enabled, adds a style tag with `select { appearance: base-select !important; }` to the page.\n */\n forceChromeSelectRendering?: boolean;\n beforeInvokeAction?: () => Promise<void>;\n afterInvokeAction?: () => Promise<void>;\n customActions?: DeviceAction<any>[];\n};\n\nexport type WebPage =\n | PlaywrightWebPage\n | PuppeteerWebPage\n | StaticPage\n | ChromeExtensionProxyPage;\n\nexport class WebElementInfoImpl implements WebElementInfo {\n content: string;\n\n rect: Rect;\n\n center: [number, number];\n\n id: string;\n\n indexId: number;\n\n attributes: {\n nodeType: NodeType;\n [key: string]: string;\n };\n\n xpaths?: string[];\n\n isVisible: boolean;\n\n constructor({\n content,\n rect,\n id,\n attributes,\n indexId,\n xpaths,\n isVisible,\n }: {\n content: string;\n rect: Rect;\n id: string;\n attributes: {\n nodeType: NodeType;\n [key: string]: string;\n };\n indexId: number;\n xpaths?: string[];\n isVisible: boolean;\n }) {\n this.content = content;\n this.rect = rect;\n this.center = [\n Math.floor(rect.left + rect.width / 2),\n Math.floor(rect.top + rect.height / 2),\n ];\n this.id = id;\n this.attributes = attributes;\n this.indexId = indexId;\n this.xpaths = xpaths;\n this.isVisible = isVisible;\n }\n}\n\nconst debug = getDebug('web:parse-context');\nexport async function WebPageContextParser(\n page: AbstractInterface,\n _opt: { uploadServerUrl?: string },\n): Promise<UIContext> {\n const basicContext = await commonContextParser(page, {\n uploadServerUrl: _opt.uploadServerUrl,\n });\n\n // debug('will traverse element tree');\n // const tree = (await page.getElementsNodeTree?.()) || {\n // node: null,\n // children: [],\n // };\n // // const webTree = traverseTree(tree!, (elementInfo) => {\n // // const { rect, id, content, attributes, indexId, isVisible } = elementInfo;\n // // return new WebElementInfoImpl({\n // // rect,\n // // id,\n // // content,\n // // attributes,\n // // indexId,\n // // isVisible,\n // // });\n // // });\n // debug('traverse element tree end');\n\n return basicContext;\n}\n\nexport const limitOpenNewTabScript = `\nif (!window.__MIDSCENE_NEW_TAB_INTERCEPTOR_INITIALIZED__) {\n window.__MIDSCENE_NEW_TAB_INTERCEPTOR_INITIALIZED__ = true;\n\n // Intercept the window.open method (only once)\n window.open = function(url) {\n console.log('Blocked window.open:', url);\n window.location.href = url;\n return null;\n };\n\n // Block all a tag clicks with target=\"_blank\" (only once)\n document.addEventListener('click', function(e) {\n const target = e.target.closest('a');\n if (target && target.target === '_blank') {\n e.preventDefault();\n console.log('Blocked new tab:', target.href);\n window.location.href = target.href;\n target.removeAttribute('target');\n }\n }, true);\n}\n`;\n"],"names":["WebElementInfoImpl","content","rect","id","attributes","indexId","xpaths","isVisible","Math","getDebug","WebPageContextParser","page","_opt","basicContext","commonContextParser","limitOpenNewTabScript"],"mappings":";;;;;;;;;;;;AA6CO,MAAMA;IAoBX,YAAY,EACVC,OAAO,EACPC,IAAI,EACJC,EAAE,EACFC,UAAU,EACVC,OAAO,EACPC,MAAM,EACNC,SAAS,EAYV,CAAE;QAtCH;QAEA;QAEA;QAEA;QAEA;QAEA;QAKA;QAEA;QAsBE,IAAI,CAAC,OAAO,GAAGN;QACf,IAAI,CAAC,IAAI,GAAGC;QACZ,IAAI,CAAC,MAAM,GAAG;YACZM,KAAK,KAAK,CAACN,KAAK,IAAI,GAAGA,KAAK,KAAK,GAAG;YACpCM,KAAK,KAAK,CAACN,KAAK,GAAG,GAAGA,KAAK,MAAM,GAAG;SACrC;QACD,IAAI,CAAC,EAAE,GAAGC;QACV,IAAI,CAAC,UAAU,GAAGC;QAClB,IAAI,CAAC,OAAO,GAAGC;QACf,IAAI,CAAC,MAAM,GAAGC;QACd,IAAI,CAAC,SAAS,GAAGC;IACnB;AACF;AAEcE,SAAS;AAChB,eAAeC,qBACpBC,IAAuB,EACvBC,IAAkC;IAElC,MAAMC,eAAe,MAAMC,oBAAoBH,MAAM;QACnD,iBAAiBC,KAAK,eAAe;IACvC;IAoBA,OAAOC;AACT;AAEO,MAAME,wBAAwB,CAAC;;;;;;;;;;;;;;;;;;;;;;AAsBtC,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import node_assert from "node:assert";
2
- import { AbstractInterface, defineActionClearInput, defineActionDoubleClick, defineActionDragAndDrop, defineActionHover, defineActionInput, defineActionKeyboardPress, defineActionLongPress, defineActionRightClick, defineActionScroll, defineActionSwipe, defineActionTap } from "@midscene/core/device";
2
+ import { z } from "@midscene/core";
3
+ import { AbstractInterface, defineAction, defineActionClearInput, defineActionDoubleClick, defineActionDragAndDrop, defineActionHover, defineActionInput, defineActionKeyboardPress, defineActionLongPress, defineActionRightClick, defineActionScroll, defineActionSwipe, defineActionTap } from "@midscene/core/device";
3
4
  import { sleep } from "@midscene/core/utils";
4
5
  import { getDebug } from "@midscene/shared/logger";
5
6
  import { transformHotkeyInput } from "@midscene/shared/us-keyboard-layout";
@@ -81,7 +82,7 @@ class AbstractWebPage extends AbstractInterface {
81
82
  }
82
83
  async clearInput(element) {}
83
84
  }
84
- const commonWebActionsForWebPage = (page)=>[
85
+ const commonWebActionsForWebPage = (page, includeTouchEvents = false)=>[
85
86
  defineActionTap(async (param)=>{
86
87
  const element = param.locate;
87
88
  node_assert(element, 'Element not found, cannot tap');
@@ -130,18 +131,18 @@ const commonWebActionsForWebPage = (page)=>[
130
131
  left: element.center[0],
131
132
  top: element.center[1]
132
133
  } : void 0;
133
- const scrollToEventName = null == param ? void 0 : param.scrollType;
134
- if ('untilTop' === scrollToEventName) await page.scrollUntilTop(startingPoint);
135
- else if ('untilBottom' === scrollToEventName) await page.scrollUntilBottom(startingPoint);
136
- else if ('untilRight' === scrollToEventName) await page.scrollUntilRight(startingPoint);
137
- else if ('untilLeft' === scrollToEventName) await page.scrollUntilLeft(startingPoint);
138
- else if ('once' !== scrollToEventName && scrollToEventName) throw new Error(`Unknown scroll event type: ${scrollToEventName}, param: ${JSON.stringify(param)}`);
134
+ const scrollToEventName = param?.scrollType;
135
+ if ('scrollToTop' === scrollToEventName) await page.scrollUntilTop(startingPoint);
136
+ else if ('scrollToBottom' === scrollToEventName) await page.scrollUntilBottom(startingPoint);
137
+ else if ('scrollToRight' === scrollToEventName) await page.scrollUntilRight(startingPoint);
138
+ else if ('scrollToLeft' === scrollToEventName) await page.scrollUntilLeft(startingPoint);
139
+ else if ('singleAction' !== scrollToEventName && scrollToEventName) throw new Error(`Unknown scroll event type: ${scrollToEventName}, param: ${JSON.stringify(param)}`);
139
140
  else {
140
- if ((null == param ? void 0 : param.direction) !== 'down' && param && param.direction) if ('up' === param.direction) await page.scrollUp(param.distance || void 0, startingPoint);
141
+ if (param?.direction !== 'down' && param && param.direction) if ('up' === param.direction) await page.scrollUp(param.distance || void 0, startingPoint);
141
142
  else if ('left' === param.direction) await page.scrollLeft(param.distance || void 0, startingPoint);
142
143
  else if ('right' === param.direction) await page.scrollRight(param.distance || void 0, startingPoint);
143
144
  else throw new Error(`Unknown scroll direction: ${param.direction}`);
144
- else await page.scrollDown((null == param ? void 0 : param.distance) || void 0, startingPoint);
145
+ else await page.scrollDown(param?.distance || void 0, startingPoint);
145
146
  await sleep(500);
146
147
  }
147
148
  }),
@@ -161,44 +162,73 @@ const commonWebActionsForWebPage = (page)=>[
161
162
  defineActionLongPress(async (param)=>{
162
163
  const element = param.locate;
163
164
  node_assert(element, 'Element not found, cannot long press');
164
- const duration = null == param ? void 0 : param.duration;
165
+ const duration = param?.duration;
165
166
  await page.longPress(element.center[0], element.center[1], duration);
166
167
  }),
167
- defineActionSwipe(async (param)=>{
168
- const { width, height } = await page.size();
169
- const { start, end } = param;
170
- const startPoint = start ? {
171
- x: start.center[0],
172
- y: start.center[1]
173
- } : {
174
- x: width / 2,
175
- y: height / 2
176
- };
177
- let endPoint;
178
- if (end) endPoint = {
179
- x: end.center[0],
180
- y: end.center[1]
181
- };
182
- else if (param.distance) {
183
- const direction = param.direction;
184
- if (!direction) throw new Error('direction is required for swipe gesture');
185
- endPoint = {
186
- x: startPoint.x + ('right' === direction ? param.distance : 'left' === direction ? -param.distance : 0),
187
- y: startPoint.y + ('down' === direction ? param.distance : 'up' === direction ? -param.distance : 0)
168
+ ...includeTouchEvents ? [
169
+ defineActionSwipe(async (param)=>{
170
+ const { width, height } = await page.size();
171
+ const { start, end } = param;
172
+ const startPoint = start ? {
173
+ x: start.center[0],
174
+ y: start.center[1]
175
+ } : {
176
+ x: width / 2,
177
+ y: height / 2
188
178
  };
189
- } else throw new Error('Either end or distance must be specified for swipe gesture');
190
- endPoint.x = Math.max(0, Math.min(endPoint.x, width));
191
- endPoint.y = Math.max(0, Math.min(endPoint.y, height));
192
- const duration = param.duration;
193
- debug(`swipe from ${startPoint.x}, ${startPoint.y} to ${endPoint.x}, ${endPoint.y} with duration ${duration}ms, repeat is set to ${param.repeat}`);
194
- let repeat = 'number' == typeof param.repeat ? param.repeat : 1;
195
- if (0 === repeat) repeat = 10;
196
- for(let i = 0; i < repeat; i++)await page.swipe(startPoint, endPoint, duration);
197
- }),
179
+ let endPoint;
180
+ if (end) endPoint = {
181
+ x: end.center[0],
182
+ y: end.center[1]
183
+ };
184
+ else if (param.distance) {
185
+ const direction = param.direction;
186
+ if (!direction) throw new Error('direction is required for swipe gesture');
187
+ endPoint = {
188
+ x: startPoint.x + ('right' === direction ? param.distance : 'left' === direction ? -param.distance : 0),
189
+ y: startPoint.y + ('down' === direction ? param.distance : 'up' === direction ? -param.distance : 0)
190
+ };
191
+ } else throw new Error('Either end or distance must be specified for swipe gesture');
192
+ endPoint.x = Math.max(0, Math.min(endPoint.x, width));
193
+ endPoint.y = Math.max(0, Math.min(endPoint.y, height));
194
+ const duration = param.duration;
195
+ debug(`swipe from ${startPoint.x}, ${startPoint.y} to ${endPoint.x}, ${endPoint.y} with duration ${duration}ms, repeat is set to ${param.repeat}`);
196
+ let repeat = 'number' == typeof param.repeat ? param.repeat : 1;
197
+ if (0 === repeat) repeat = 10;
198
+ for(let i = 0; i < repeat; i++)await page.swipe(startPoint, endPoint, duration);
199
+ })
200
+ ] : [],
198
201
  defineActionClearInput(async (param)=>{
199
202
  const element = param.locate;
200
203
  node_assert(element, 'Element not found, cannot clear input');
201
204
  await page.clearInput(element);
205
+ }),
206
+ defineAction({
207
+ name: 'Navigate',
208
+ description: 'Navigate the browser to a specified URL. Opens the URL in the current tab.',
209
+ paramSchema: z.object({
210
+ url: z.string().describe('The URL to navigate to')
211
+ }),
212
+ call: async (param)=>{
213
+ if (!page.navigate) throw new Error('Navigate operation is not supported on this page type');
214
+ await page.navigate(param.url);
215
+ }
216
+ }),
217
+ defineAction({
218
+ name: 'Reload',
219
+ description: 'Reload the current page',
220
+ call: async ()=>{
221
+ if (!page.reload) throw new Error('Reload operation is not supported on this page type');
222
+ await page.reload();
223
+ }
224
+ }),
225
+ defineAction({
226
+ name: 'GoBack',
227
+ description: 'Navigate back in browser history',
228
+ call: async ()=>{
229
+ if (!page.goBack) throw new Error('GoBack operation is not supported on this page type');
230
+ await page.goBack();
231
+ }
202
232
  })
203
233
  ];
204
234
  export { AbstractWebPage, commonWebActionsForWebPage, getKeyCommands };
@@ -1 +1 @@
1
- {"version":3,"file":"web-page.mjs","sources":["webpack://@midscene/web/./src/web-page.ts"],"sourcesContent":["import assert from 'node:assert';\nimport type { Point } from '@midscene/core';\nimport {\n AbstractInterface,\n type DeviceAction,\n defineActionClearInput,\n defineActionDoubleClick,\n defineActionDragAndDrop,\n defineActionHover,\n defineActionInput,\n defineActionKeyboardPress,\n defineActionLongPress,\n defineActionRightClick,\n defineActionScroll,\n defineActionSwipe,\n defineActionTap,\n} from '@midscene/core/device';\n\nimport { sleep } from '@midscene/core/utils';\nimport type { ElementInfo } from '@midscene/shared/extractor';\nimport { getDebug } from '@midscene/shared/logger';\nimport { transformHotkeyInput } from '@midscene/shared/us-keyboard-layout';\n\nconst debug = getDebug('web:page');\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) => 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 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) => {},\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 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}\n\nexport const commonWebActionsForWebPage = <T extends AbstractWebPage>(\n page: T,\n): DeviceAction<any>[] => [\n defineActionTap(async (param) => {\n const element = param.locate;\n assert(element, 'Element not found, cannot tap');\n await page.mouse.click(element.center[0], element.center[1], {\n button: 'left',\n });\n }),\n defineActionRightClick(async (param) => {\n const element = param.locate;\n assert(element, 'Element not found, cannot right click');\n await page.mouse.click(element.center[0], element.center[1], {\n button: 'right',\n });\n }),\n defineActionDoubleClick(async (param) => {\n const element = param.locate;\n assert(element, 'Element not found, cannot double click');\n\n await page.mouse.click(element.center[0], element.center[1], {\n button: 'left',\n count: 2,\n });\n }),\n defineActionHover(async (param) => {\n const element = param.locate;\n assert(element, 'Element not found, cannot hover');\n await page.mouse.move(element.center[0], element.center[1]);\n }),\n defineActionInput(async (param) => {\n const element = param.locate;\n if (element && param.mode !== 'append') {\n await page.clearInput(element as unknown as ElementInfo);\n }\n\n if (param.mode === 'clear') {\n // Clear mode removes existing text without entering new characters\n return;\n }\n\n if (!param || !param.value) {\n return;\n }\n\n // Note: there is another implementation in AndroidDevicePage, which is more complex\n await page.keyboard.type(param.value);\n }),\n defineActionKeyboardPress(async (param) => {\n const element = param.locate;\n if (element) {\n await page.mouse.click(element.center[0], element.center[1], {\n button: 'left',\n });\n }\n\n const keys = getKeyCommands(param.keyName);\n await page.keyboard.press(keys as any); // TODO: fix this type error\n }),\n defineActionScroll(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 === 'untilTop') {\n await page.scrollUntilTop(startingPoint);\n } else if (scrollToEventName === 'untilBottom') {\n await page.scrollUntilBottom(startingPoint);\n } else if (scrollToEventName === 'untilRight') {\n await page.scrollUntilRight(startingPoint);\n } else if (scrollToEventName === 'untilLeft') {\n await page.scrollUntilLeft(startingPoint);\n } else if (scrollToEventName === 'once' || !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 // until mouse event is done\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 }),\n defineActionDragAndDrop(async (param) => {\n const from = param.from;\n const to = param.to;\n assert(from, 'missing \"from\" param for drag and drop');\n assert(to, 'missing \"to\" param for drag and drop');\n await page.mouse.drag(\n {\n x: from.center[0],\n y: from.center[1],\n },\n {\n x: to.center[0],\n y: to.center[1],\n },\n );\n }),\n\n defineActionLongPress(async (param) => {\n const element = param.locate;\n assert(element, 'Element not found, cannot long press');\n const duration = param?.duration;\n await page.longPress(element.center[0], element.center[1], duration);\n }),\n\n defineActionSwipe(async (param) => {\n const { width, height } = await page.size();\n const { start, end } = param;\n\n const startPoint = start\n ? {\n x: start.center[0],\n y: start.center[1],\n }\n : {\n x: width / 2,\n y: height / 2,\n };\n\n let endPoint: {\n x: number;\n y: number;\n };\n\n if (end) {\n endPoint = {\n x: end.center[0],\n y: end.center[1],\n };\n } else if (param.distance) {\n const direction = param.direction;\n if (!direction) {\n throw new Error('direction is required for swipe gesture');\n }\n\n endPoint = {\n x:\n startPoint.x +\n (direction === 'right'\n ? param.distance\n : direction === 'left'\n ? -param.distance\n : 0),\n y:\n startPoint.y +\n (direction === 'down'\n ? param.distance\n : direction === 'up'\n ? -param.distance\n : 0),\n };\n } else {\n throw new Error(\n 'Either end or distance must be specified for swipe gesture',\n );\n }\n\n // Ensure end coordinates are within bounds\n endPoint.x = Math.max(0, Math.min(endPoint.x, width));\n endPoint.y = Math.max(0, Math.min(endPoint.y, height));\n\n const duration = param.duration;\n\n debug(\n `swipe from ${startPoint.x}, ${startPoint.y} to ${endPoint.x}, ${endPoint.y} with duration ${duration}ms, repeat is set to ${param.repeat}`,\n );\n let repeat = typeof param.repeat === 'number' ? param.repeat : 1;\n if (repeat === 0) {\n repeat = 10; // 10 times is enough for infinite swipe\n }\n for (let i = 0; i < repeat; i++) {\n await page.swipe(startPoint, endPoint, duration);\n }\n }),\n\n defineActionClearInput(async (param) => {\n const element = param.locate;\n assert(element, 'Element not found, cannot clear input');\n await page.clearInput(element as unknown as ElementInfo);\n }),\n];\n"],"names":["debug","getDebug","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","commonWebActionsForWebPage","page","defineActionTap","param","assert","defineActionRightClick","defineActionDoubleClick","defineActionHover","defineActionInput","defineActionKeyboardPress","defineActionScroll","startingPoint","undefined","scrollToEventName","Error","JSON","sleep","defineActionDragAndDrop","defineActionLongPress","duration","defineActionSwipe","width","height","start","end","startPoint","endPoint","direction","Math","repeat","i","defineActionClearInput"],"mappings":"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"}
1
+ {"version":3,"file":"web-page.mjs","sources":["../../src/web-page.ts"],"sourcesContent":["import assert from 'node:assert';\nimport type { Point } from '@midscene/core';\nimport { z } from '@midscene/core';\nimport {\n AbstractInterface,\n type DeviceAction,\n defineAction,\n defineActionClearInput,\n defineActionDoubleClick,\n defineActionDragAndDrop,\n defineActionHover,\n defineActionInput,\n defineActionKeyboardPress,\n defineActionLongPress,\n defineActionRightClick,\n defineActionScroll,\n defineActionSwipe,\n defineActionTap,\n} from '@midscene/core/device';\n\nimport { sleep } from '@midscene/core/utils';\nimport type { ElementInfo } from '@midscene/shared/extractor';\nimport { getDebug } from '@midscene/shared/logger';\nimport { transformHotkeyInput } from '@midscene/shared/us-keyboard-layout';\n\nconst debug = getDebug('web:page');\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) => 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 navigate?(url: string): Promise<void>;\n reload?(): Promise<void>;\n goBack?(): 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) => {},\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 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}\n\nexport const commonWebActionsForWebPage = <T extends AbstractWebPage>(\n page: T,\n includeTouchEvents = false,\n): DeviceAction<any>[] => [\n defineActionTap(async (param) => {\n const element = param.locate;\n assert(element, 'Element not found, cannot tap');\n await page.mouse.click(element.center[0], element.center[1], {\n button: 'left',\n });\n }),\n defineActionRightClick(async (param) => {\n const element = param.locate;\n assert(element, 'Element not found, cannot right click');\n await page.mouse.click(element.center[0], element.center[1], {\n button: 'right',\n });\n }),\n defineActionDoubleClick(async (param) => {\n const element = param.locate;\n assert(element, 'Element not found, cannot double click');\n\n await page.mouse.click(element.center[0], element.center[1], {\n button: 'left',\n count: 2,\n });\n }),\n defineActionHover(async (param) => {\n const element = param.locate;\n assert(element, 'Element not found, cannot hover');\n await page.mouse.move(element.center[0], element.center[1]);\n }),\n defineActionInput(async (param) => {\n const element = param.locate;\n if (element && param.mode !== 'append') {\n await page.clearInput(element as unknown as ElementInfo);\n }\n\n if (param.mode === 'clear') {\n // Clear mode removes existing text without entering new characters\n return;\n }\n\n if (!param || !param.value) {\n return;\n }\n\n // Note: there is another implementation in AndroidDevicePage, which is more complex\n await page.keyboard.type(param.value);\n }),\n defineActionKeyboardPress(async (param) => {\n const element = param.locate;\n if (element) {\n await page.mouse.click(element.center[0], element.center[1], {\n button: 'left',\n });\n }\n\n const keys = getKeyCommands(param.keyName);\n await page.keyboard.press(keys as any); // TODO: fix this type error\n }),\n defineActionScroll(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 // until mouse event is done\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 }),\n defineActionDragAndDrop(async (param) => {\n const from = param.from;\n const to = param.to;\n assert(from, 'missing \"from\" param for drag and drop');\n assert(to, 'missing \"to\" param for drag and drop');\n await page.mouse.drag(\n {\n x: from.center[0],\n y: from.center[1],\n },\n {\n x: to.center[0],\n y: to.center[1],\n },\n );\n }),\n\n defineActionLongPress(async (param) => {\n const element = param.locate;\n assert(element, 'Element not found, cannot long press');\n const duration = param?.duration;\n await page.longPress(element.center[0], element.center[1], duration);\n }),\n\n ...(includeTouchEvents\n ? [\n defineActionSwipe(async (param) => {\n const { width, height } = await page.size();\n const { start, end } = param;\n\n const startPoint = start\n ? {\n x: start.center[0],\n y: start.center[1],\n }\n : {\n x: width / 2,\n y: height / 2,\n };\n\n let endPoint: {\n x: number;\n y: number;\n };\n\n if (end) {\n endPoint = {\n x: end.center[0],\n y: end.center[1],\n };\n } else if (param.distance) {\n const direction = param.direction;\n if (!direction) {\n throw new Error('direction is required for swipe gesture');\n }\n\n endPoint = {\n x:\n startPoint.x +\n (direction === 'right'\n ? param.distance\n : direction === 'left'\n ? -param.distance\n : 0),\n y:\n startPoint.y +\n (direction === 'down'\n ? param.distance\n : direction === 'up'\n ? -param.distance\n : 0),\n };\n } else {\n throw new Error(\n 'Either end or distance must be specified for swipe gesture',\n );\n }\n\n // Ensure end coordinates are within bounds\n endPoint.x = Math.max(0, Math.min(endPoint.x, width));\n endPoint.y = Math.max(0, Math.min(endPoint.y, height));\n\n const duration = param.duration;\n\n debug(\n `swipe from ${startPoint.x}, ${startPoint.y} to ${endPoint.x}, ${endPoint.y} with duration ${duration}ms, repeat is set to ${param.repeat}`,\n );\n let repeat = typeof param.repeat === 'number' ? param.repeat : 1;\n if (repeat === 0) {\n repeat = 10; // 10 times is enough for infinite swipe\n }\n for (let i = 0; i < repeat; i++) {\n await page.swipe(startPoint, endPoint, duration);\n }\n }),\n ]\n : []),\n\n defineActionClearInput(async (param) => {\n const element = param.locate;\n assert(element, 'Element not found, cannot clear input');\n await page.clearInput(element as unknown as ElementInfo);\n }),\n\n defineAction({\n name: 'Navigate',\n description:\n 'Navigate the browser to a specified URL. Opens the URL in the current tab.',\n paramSchema: z.object({\n url: z.string().describe('The URL to navigate to'),\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 },\n }),\n\n defineAction({\n name: 'Reload',\n description: 'Reload the current page',\n call: async () => {\n if (!page.reload) {\n throw new Error('Reload operation is not supported on this page type');\n }\n await page.reload();\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('GoBack operation is not supported on this page type');\n }\n await page.goBack();\n },\n }),\n];\n"],"names":["debug","getDebug","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","commonWebActionsForWebPage","page","includeTouchEvents","defineActionTap","param","assert","defineActionRightClick","defineActionDoubleClick","defineActionHover","defineActionInput","defineActionKeyboardPress","defineActionScroll","startingPoint","undefined","scrollToEventName","Error","JSON","sleep","defineActionDragAndDrop","defineActionLongPress","duration","defineActionSwipe","width","height","start","end","startPoint","endPoint","direction","Math","repeat","i","defineActionClearInput","defineAction","z"],"mappings":"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"}
package/dist/lib/bin.js CHANGED
@@ -27,10 +27,6 @@ var external_cors_default = /*#__PURE__*/ __webpack_require__.n(external_cors_na
27
27
  const index_js_namespaceObject = require("./static/index.js");
28
28
  require("dotenv/config");
29
29
  const page = new index_js_namespaceObject.StaticPage({
30
- tree: {
31
- node: null,
32
- children: []
33
- },
34
30
  size: {
35
31
  width: 800,
36
32
  height: 600
@@ -46,7 +42,7 @@ server.app.use(external_cors_default()({
46
42
  Promise.resolve().then(()=>server.launch()).then(()=>{
47
43
  console.log(`Midscene playground server is running on http://localhost:${server.port}`);
48
44
  });
49
- for(var __webpack_i__ in __webpack_exports__)exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
45
+ for(var __rspack_i in __webpack_exports__)exports[__rspack_i] = __webpack_exports__[__rspack_i];
50
46
  Object.defineProperty(exports, '__esModule', {
51
47
  value: true
52
48
  });
@@ -1 +1 @@
1
- {"version":3,"file":"bin.js","sources":["webpack://@midscene/web/webpack/runtime/compat_get_default_export","webpack://@midscene/web/webpack/runtime/define_property_getters","webpack://@midscene/web/webpack/runtime/has_own_property","webpack://@midscene/web/./src/bin.ts"],"sourcesContent":["// getDefaultExport function for compatibility with non-ESM modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};\n","__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","import { PlaygroundServer } from '@midscene/playground';\nimport cors from 'cors';\nimport { StaticPage, StaticPageAgent } from './static';\nimport 'dotenv/config';\n\n// Create page and agent instances with minimal valid data\nconst page = new StaticPage({\n tree: {\n node: null,\n children: [],\n },\n size: { width: 800, height: 600 },\n screenshotBase64: '',\n});\nconst agent = new StaticPageAgent(page);\n\n// Create server with agent only\nconst server = new PlaygroundServer(agent);\n\n// Register CORS middleware\nserver.app.use(\n cors({\n origin: '*',\n credentials: true,\n }),\n);\n\nPromise.resolve()\n .then(() => server.launch())\n .then(() => {\n console.log(\n `Midscene playground server is running on http://localhost:${server.port}`,\n );\n });\n"],"names":["__webpack_require__","module","getter","definition","key","Object","obj","prop","page","StaticPage","agent","StaticPageAgent","server","PlaygroundServer","cors","Promise","console"],"mappings":";;;IACAA,oBAAoB,CAAC,GAAG,CAACC;QACxB,IAAIC,SAASD,UAAUA,OAAO,UAAU,GACvC,IAAOA,MAAM,CAAC,UAAU,GACxB,IAAOA;QACRD,oBAAoB,CAAC,CAACE,QAAQ;YAAE,GAAGA;QAAO;QAC1C,OAAOA;IACR;;;ICPAF,oBAAoB,CAAC,GAAG,CAAC,UAASG;QACjC,IAAI,IAAIC,OAAOD,WACR,IAAGH,oBAAoB,CAAC,CAACG,YAAYC,QAAQ,CAACJ,oBAAoB,CAAC,CAAC,UAASI,MACzEC,OAAO,cAAc,CAAC,UAASD,KAAK;YAAE,YAAY;YAAM,KAAKD,UAAU,CAACC,IAAI;QAAC;IAGzF;;;ICNAJ,oBAAoB,CAAC,GAAG,CAACM,KAAKC,OAAUF,OAAO,SAAS,CAAC,cAAc,CAAC,IAAI,CAACC,KAAKC;;;;;;;;ACMlF,MAAMC,OAAO,IAAIC,yBAAAA,UAAUA,CAAC;IAC1B,MAAM;QACJ,MAAM;QACN,UAAU,EAAE;IACd;IACA,MAAM;QAAE,OAAO;QAAK,QAAQ;IAAI;IAChC,kBAAkB;AACpB;AACA,MAAMC,QAAQ,IAAIC,yBAAAA,eAAeA,CAACH;AAGlC,MAAMI,SAAS,IAAIC,2BAAAA,gBAAgBA,CAACH;AAGpCE,OAAO,GAAG,CAAC,GAAG,CACZE,wBAAK;IACH,QAAQ;IACR,aAAa;AACf;AAGFC,QAAQ,OAAO,GACZ,IAAI,CAAC,IAAMH,OAAO,MAAM,IACxB,IAAI,CAAC;IACJI,QAAQ,GAAG,CACT,CAAC,0DAA0D,EAAEJ,OAAO,IAAI,EAAE;AAE9E"}
1
+ {"version":3,"file":"bin.js","sources":["webpack/runtime/compat_get_default_export","webpack/runtime/define_property_getters","webpack/runtime/has_own_property","../../src/bin.ts"],"sourcesContent":["// getDefaultExport function for compatibility with non-ESM modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};\n","__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","import { PlaygroundServer } from '@midscene/playground';\nimport cors from 'cors';\nimport { StaticPage, StaticPageAgent } from './static';\nimport 'dotenv/config';\n\n// Create page and agent instances with minimal valid data\nconst page = new StaticPage({\n size: { width: 800, height: 600 },\n screenshotBase64: '',\n});\nconst agent = new StaticPageAgent(page);\n\n// Create server with agent only\nconst server = new PlaygroundServer(agent);\n\n// Register CORS middleware\nserver.app.use(\n cors({\n origin: '*',\n credentials: true,\n }),\n);\n\nPromise.resolve()\n .then(() => server.launch())\n .then(() => {\n console.log(\n `Midscene playground server is running on http://localhost:${server.port}`,\n );\n });\n"],"names":["__webpack_require__","module","getter","definition","key","Object","obj","prop","page","StaticPage","agent","StaticPageAgent","server","PlaygroundServer","cors","Promise","console"],"mappings":";;;IACAA,oBAAoB,CAAC,GAAG,CAACC;QACxB,IAAIC,SAASD,UAAUA,OAAO,UAAU,GACvC,IAAOA,MAAM,CAAC,UAAU,GACxB,IAAOA;QACRD,oBAAoB,CAAC,CAACE,QAAQ;YAAE,GAAGA;QAAO;QAC1C,OAAOA;IACR;;;ICPAF,oBAAoB,CAAC,GAAG,CAAC,UAASG;QACjC,IAAI,IAAIC,OAAOD,WACR,IAAGH,oBAAoB,CAAC,CAACG,YAAYC,QAAQ,CAACJ,oBAAoB,CAAC,CAAC,UAASI,MACzEC,OAAO,cAAc,CAAC,UAASD,KAAK;YAAE,YAAY;YAAM,KAAKD,UAAU,CAACC,IAAI;QAAC;IAGzF;;;ICNAJ,oBAAoB,CAAC,GAAG,CAACM,KAAKC,OAAUF,OAAO,SAAS,CAAC,cAAc,CAAC,IAAI,CAACC,KAAKC;;;;;;;;ACMlF,MAAMC,OAAO,IAAIC,yBAAAA,UAAUA,CAAC;IAC1B,MAAM;QAAE,OAAO;QAAK,QAAQ;IAAI;IAChC,kBAAkB;AACpB;AACA,MAAMC,QAAQ,IAAIC,yBAAAA,eAAeA,CAACH;AAGlC,MAAMI,SAAS,IAAIC,2BAAAA,gBAAgBA,CAACH;AAGpCE,OAAO,GAAG,CAAC,GAAG,CACZE,wBAAK;IACH,QAAQ;IACR,aAAa;AACf;AAGFC,QAAQ,OAAO,GACZ,IAAI,CAAC,IAAMH,OAAO,MAAM,IACxB,IAAI,CAAC;IACJI,QAAQ,GAAG,CACT,CAAC,0DAA0D,EAAEJ,OAAO,IAAI,EAAE;AAE9E"}
@@ -43,10 +43,12 @@ function _define_property(obj, key, value) {
43
43
  return obj;
44
44
  }
45
45
  const sleep = (ms)=>new Promise((resolve)=>setTimeout(resolve, ms));
46
- const getBridgePageInCliSide = (timeout, closeConflictServer)=>{
47
- const server = new external_io_server_js_namespaceObject.BridgeServer(external_common_js_namespaceObject.DefaultBridgeServerPort, void 0, void 0, closeConflictServer);
46
+ const getBridgePageInCliSide = (options)=>{
47
+ const host = options?.host || external_common_js_namespaceObject.DefaultBridgeServerHost;
48
+ const port = options?.port || external_common_js_namespaceObject.DefaultBridgeServerPort;
49
+ const server = new external_io_server_js_namespaceObject.BridgeServer(host, port, void 0, void 0, options?.closeConflictServer);
48
50
  server.listen({
49
- timeout
51
+ timeout: options?.timeout
50
52
  });
51
53
  const bridgeCaller = (method)=>async (...args)=>{
52
54
  const response = await server.call(method, args);
@@ -119,9 +121,9 @@ class AgentOverChromeBridge extends agent_namespaceObject.Agent {
119
121
  await sleep(500);
120
122
  await this.setDestroyOptionsAfterConnect();
121
123
  }
122
- async aiAction(prompt, options) {
123
- if (options) console.warn('the `options` parameter of aiAction is not supported in cli side');
124
- return await super.aiAction(prompt);
124
+ async aiAct(prompt, options) {
125
+ if (options) console.warn('the `options` parameter of aiAct is not supported in cli side');
126
+ return await super.aiAct(prompt);
125
127
  }
126
128
  async destroy(closeNewTabsAfterDisconnect) {
127
129
  if ('boolean' == typeof closeNewTabsAfterDisconnect) await this.page.setDestroyOptions({
@@ -130,23 +132,32 @@ class AgentOverChromeBridge extends agent_namespaceObject.Agent {
130
132
  await super.destroy();
131
133
  }
132
134
  constructor(opts){
133
- const page = getBridgePageInCliSide(null == opts ? void 0 : opts.serverListeningTimeout);
134
- const originalOnTaskStartTip = null == opts ? void 0 : opts.onTaskStartTip;
135
+ const host = (0, external_common_js_namespaceObject.getBridgeServerHost)({
136
+ host: opts?.host,
137
+ allowRemoteAccess: opts?.allowRemoteAccess
138
+ });
139
+ const page = getBridgePageInCliSide({
140
+ host,
141
+ port: opts?.port,
142
+ timeout: opts?.serverListeningTimeout,
143
+ closeConflictServer: opts?.closeConflictServer
144
+ });
145
+ const originalOnTaskStartTip = opts?.onTaskStartTip;
135
146
  super(page, Object.assign(opts || {}, {
136
147
  onTaskStartTip: (tip)=>{
137
148
  this.page.showStatusMessage(tip);
138
- if (originalOnTaskStartTip) null == originalOnTaskStartTip || originalOnTaskStartTip.call(this, tip);
149
+ if (originalOnTaskStartTip) originalOnTaskStartTip?.call(this, tip);
139
150
  }
140
151
  })), _define_property(this, "destroyAfterDisconnectFlag", void 0);
141
- this.destroyAfterDisconnectFlag = null == opts ? void 0 : opts.closeNewTabsAfterDisconnect;
152
+ this.destroyAfterDisconnectFlag = opts?.closeNewTabsAfterDisconnect;
142
153
  }
143
154
  }
144
155
  exports.AgentOverChromeBridge = __webpack_exports__.AgentOverChromeBridge;
145
156
  exports.getBridgePageInCliSide = __webpack_exports__.getBridgePageInCliSide;
146
- for(var __webpack_i__ in __webpack_exports__)if (-1 === [
157
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
147
158
  "AgentOverChromeBridge",
148
159
  "getBridgePageInCliSide"
149
- ].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
160
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
150
161
  Object.defineProperty(exports, '__esModule', {
151
162
  value: true
152
163
  });
@@ -1 +1 @@
1
- {"version":3,"file":"bridge-mode/agent-cli-side.js","sources":["webpack://@midscene/web/webpack/runtime/define_property_getters","webpack://@midscene/web/webpack/runtime/has_own_property","webpack://@midscene/web/webpack/runtime/make_namespace_object","webpack://@midscene/web/./src/bridge-mode/agent-cli-side.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 { Agent, type AgentOpt } from '@midscene/core/agent';\nimport { assert } from '@midscene/shared/utils';\nimport { commonWebActionsForWebPage } from '../web-page';\nimport type { KeyboardAction, MouseAction } from '../web-page';\nimport {\n type BridgeConnectTabOptions,\n BridgeEvent,\n BridgePageType,\n DefaultBridgeServerPort,\n KeyboardEvent,\n MouseEvent,\n} from './common';\nimport { BridgeServer } from './io-server';\nimport type { ExtensionBridgePageBrowserSide } from './page-browser-side';\n\ninterface ChromeExtensionPageCliSide extends ExtensionBridgePageBrowserSide {\n showStatusMessage: (message: string) => Promise<void>;\n}\n\nconst sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\n// actually, this is a proxy to the page in browser side\nexport const getBridgePageInCliSide = (\n timeout?: number | false,\n closeConflictServer?: boolean,\n): ChromeExtensionPageCliSide => {\n const server = new BridgeServer(\n DefaultBridgeServerPort,\n undefined,\n undefined,\n closeConflictServer,\n );\n server.listen({\n timeout,\n });\n const bridgeCaller = (method: string) => {\n return async (...args: any[]) => {\n const response = await server.call(method, args);\n return response;\n };\n };\n const page = {\n showStatusMessage: async (message: string) => {\n await server.call(BridgeEvent.UpdateAgentStatus, [message]);\n },\n };\n\n const proxyPage = new Proxy(page, {\n get(target, prop, receiver) {\n assert(typeof prop === 'string', 'prop must be a string');\n\n if (prop === 'toJSON') {\n return () => {\n return {\n interfaceType: BridgePageType,\n };\n };\n }\n\n if (prop === 'getContext') {\n return undefined;\n }\n\n if (prop === 'interfaceType') {\n return BridgePageType;\n }\n\n if (prop === 'actionSpace') {\n return () => commonWebActionsForWebPage(proxyPage);\n }\n\n if (Object.keys(page).includes(prop)) {\n return page[prop as keyof typeof page];\n }\n\n if (prop === 'mouse') {\n const mouse: MouseAction = {\n click: bridgeCaller(MouseEvent.Click),\n wheel: bridgeCaller(MouseEvent.Wheel),\n move: bridgeCaller(MouseEvent.Move),\n drag: bridgeCaller(MouseEvent.Drag),\n };\n return mouse;\n }\n\n if (prop === 'keyboard') {\n const keyboard: KeyboardAction = {\n type: bridgeCaller(KeyboardEvent.Type),\n press: bridgeCaller(KeyboardEvent.Press),\n };\n return keyboard;\n }\n\n if (prop === 'destroy') {\n return async (...args: any[]) => {\n try {\n const caller = bridgeCaller('destroy');\n await caller(...args);\n } catch (e) {\n // console.error('error calling destroy', e);\n }\n return server.close();\n };\n }\n\n return bridgeCaller(prop);\n },\n }) as ChromeExtensionPageCliSide;\n\n return proxyPage;\n};\n\nexport class AgentOverChromeBridge extends Agent<ChromeExtensionPageCliSide> {\n private destroyAfterDisconnectFlag?: boolean;\n\n constructor(\n opts?: AgentOpt & {\n closeNewTabsAfterDisconnect?: boolean;\n serverListeningTimeout?: number | false;\n closeConflictServer?: boolean;\n },\n ) {\n const page = getBridgePageInCliSide(opts?.serverListeningTimeout);\n const originalOnTaskStartTip = opts?.onTaskStartTip;\n super(\n page,\n Object.assign(opts || {}, {\n onTaskStartTip: (tip: string) => {\n this.page.showStatusMessage(tip);\n if (originalOnTaskStartTip) {\n originalOnTaskStartTip?.call(this, tip);\n }\n },\n }),\n );\n this.destroyAfterDisconnectFlag = opts?.closeNewTabsAfterDisconnect;\n }\n\n async setDestroyOptionsAfterConnect() {\n if (this.destroyAfterDisconnectFlag) {\n this.page.setDestroyOptions({\n closeTab: true,\n });\n }\n }\n\n async connectNewTabWithUrl(url: string, options?: BridgeConnectTabOptions) {\n await this.page.connectNewTabWithUrl(url, options);\n await sleep(500);\n await this.setDestroyOptionsAfterConnect();\n }\n\n async getBrowserTabList() {\n return await this.page.getBrowserTabList();\n }\n\n async setActiveTabId(tabId: string) {\n return await this.page.setActiveTabId(Number.parseInt(tabId));\n }\n\n async connectCurrentTab(options?: BridgeConnectTabOptions) {\n await this.page.connectCurrentTab(options);\n await sleep(500);\n await this.setDestroyOptionsAfterConnect();\n }\n\n async aiAction(prompt: string, options?: any) {\n if (options) {\n console.warn(\n 'the `options` parameter of aiAction is not supported in cli side',\n );\n }\n return await super.aiAction(prompt);\n }\n\n async destroy(closeNewTabsAfterDisconnect?: boolean) {\n if (typeof closeNewTabsAfterDisconnect === 'boolean') {\n await this.page.setDestroyOptions({\n closeTab: closeNewTabsAfterDisconnect,\n });\n }\n await super.destroy();\n }\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","sleep","ms","Promise","resolve","setTimeout","getBridgePageInCliSide","timeout","closeConflictServer","server","BridgeServer","DefaultBridgeServerPort","undefined","bridgeCaller","method","args","response","page","message","BridgeEvent","proxyPage","Proxy","target","receiver","assert","BridgePageType","commonWebActionsForWebPage","mouse","MouseEvent","keyboard","KeyboardEvent","caller","e","AgentOverChromeBridge","Agent","url","options","tabId","Number","prompt","console","closeNewTabsAfterDisconnect","opts","originalOnTaskStartTip","tip"],"mappings":"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"}
1
+ {"version":3,"file":"bridge-mode/agent-cli-side.js","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../../src/bridge-mode/agent-cli-side.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 { Agent, type AgentOpt } from '@midscene/core/agent';\nimport { assert } from '@midscene/shared/utils';\nimport { commonWebActionsForWebPage } from '../web-page';\nimport type { KeyboardAction, MouseAction } from '../web-page';\nimport {\n type BridgeConnectTabOptions,\n BridgeEvent,\n BridgePageType,\n DefaultBridgeServerHost,\n DefaultBridgeServerPort,\n KeyboardEvent,\n MouseEvent,\n getBridgeServerHost,\n} from './common';\nimport { BridgeServer } from './io-server';\nimport type { ExtensionBridgePageBrowserSide } from './page-browser-side';\n\ninterface ChromeExtensionPageCliSide extends ExtensionBridgePageBrowserSide {\n showStatusMessage: (message: string) => Promise<void>;\n}\n\nconst sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\n// actually, this is a proxy to the page in browser side\nexport const getBridgePageInCliSide = (options?: {\n host?: string;\n port?: number;\n timeout?: number | false;\n closeConflictServer?: boolean;\n}): ChromeExtensionPageCliSide => {\n const host = options?.host || DefaultBridgeServerHost;\n const port = options?.port || DefaultBridgeServerPort;\n const server = new BridgeServer(\n host,\n port,\n undefined,\n undefined,\n options?.closeConflictServer,\n );\n server.listen({\n timeout: options?.timeout,\n });\n const bridgeCaller = (method: string) => {\n return async (...args: any[]) => {\n const response = await server.call(method, args);\n return response;\n };\n };\n const page = {\n showStatusMessage: async (message: string) => {\n await server.call(BridgeEvent.UpdateAgentStatus, [message]);\n },\n };\n\n const proxyPage = new Proxy(page, {\n get(target, prop, receiver) {\n assert(typeof prop === 'string', 'prop must be a string');\n\n if (prop === 'toJSON') {\n return () => {\n return {\n interfaceType: BridgePageType,\n };\n };\n }\n\n if (prop === 'getContext') {\n return undefined;\n }\n\n if (prop === 'interfaceType') {\n return BridgePageType;\n }\n\n if (prop === 'actionSpace') {\n return () => commonWebActionsForWebPage(proxyPage);\n }\n\n if (Object.keys(page).includes(prop)) {\n return page[prop as keyof typeof page];\n }\n\n if (prop === 'mouse') {\n const mouse: MouseAction = {\n click: bridgeCaller(MouseEvent.Click),\n wheel: bridgeCaller(MouseEvent.Wheel),\n move: bridgeCaller(MouseEvent.Move),\n drag: bridgeCaller(MouseEvent.Drag),\n };\n return mouse;\n }\n\n if (prop === 'keyboard') {\n const keyboard: KeyboardAction = {\n type: bridgeCaller(KeyboardEvent.Type),\n press: bridgeCaller(KeyboardEvent.Press),\n };\n return keyboard;\n }\n\n if (prop === 'destroy') {\n return async (...args: any[]) => {\n try {\n const caller = bridgeCaller('destroy');\n await caller(...args);\n } catch (e) {\n // console.error('error calling destroy', e);\n }\n return server.close();\n };\n }\n\n return bridgeCaller(prop);\n },\n }) as ChromeExtensionPageCliSide;\n\n return proxyPage;\n};\n\nexport class AgentOverChromeBridge extends Agent<ChromeExtensionPageCliSide> {\n private destroyAfterDisconnectFlag?: boolean;\n\n constructor(\n opts?: AgentOpt & {\n /**\n * Enable remote access to the bridge server.\n * - false (default): Only localhost can connect (most secure)\n * - true: Allow remote machines to connect (binds to 0.0.0.0)\n */\n allowRemoteAccess?: boolean;\n /**\n * Custom host to bind the bridge server to.\n * Overrides allowRemoteAccess if specified.\n */\n host?: string;\n /**\n * Custom port for the bridge server.\n * @default 3766\n */\n port?: number;\n closeNewTabsAfterDisconnect?: boolean;\n serverListeningTimeout?: number | false;\n closeConflictServer?: boolean;\n },\n ) {\n const host = getBridgeServerHost({\n host: opts?.host,\n allowRemoteAccess: opts?.allowRemoteAccess,\n });\n const page = getBridgePageInCliSide({\n host,\n port: opts?.port,\n timeout: opts?.serverListeningTimeout,\n closeConflictServer: opts?.closeConflictServer,\n });\n const originalOnTaskStartTip = opts?.onTaskStartTip;\n super(\n page,\n Object.assign(opts || {}, {\n onTaskStartTip: (tip: string) => {\n this.page.showStatusMessage(tip);\n if (originalOnTaskStartTip) {\n originalOnTaskStartTip?.call(this, tip);\n }\n },\n }),\n );\n this.destroyAfterDisconnectFlag = opts?.closeNewTabsAfterDisconnect;\n }\n\n async setDestroyOptionsAfterConnect() {\n if (this.destroyAfterDisconnectFlag) {\n this.page.setDestroyOptions({\n closeTab: true,\n });\n }\n }\n\n async connectNewTabWithUrl(url: string, options?: BridgeConnectTabOptions) {\n await this.page.connectNewTabWithUrl(url, options);\n await sleep(500);\n await this.setDestroyOptionsAfterConnect();\n }\n\n async getBrowserTabList() {\n return await this.page.getBrowserTabList();\n }\n\n async setActiveTabId(tabId: string) {\n return await this.page.setActiveTabId(Number.parseInt(tabId));\n }\n\n async connectCurrentTab(options?: BridgeConnectTabOptions) {\n await this.page.connectCurrentTab(options);\n await sleep(500);\n await this.setDestroyOptionsAfterConnect();\n }\n\n async aiAct(prompt: string, options?: any) {\n if (options) {\n console.warn(\n 'the `options` parameter of aiAct is not supported in cli side',\n );\n }\n return await super.aiAct(prompt);\n }\n\n async destroy(closeNewTabsAfterDisconnect?: boolean) {\n if (typeof closeNewTabsAfterDisconnect === 'boolean') {\n await this.page.setDestroyOptions({\n closeTab: closeNewTabsAfterDisconnect,\n });\n }\n await super.destroy();\n }\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","sleep","ms","Promise","resolve","setTimeout","getBridgePageInCliSide","options","host","DefaultBridgeServerHost","port","DefaultBridgeServerPort","server","BridgeServer","undefined","bridgeCaller","method","args","response","page","message","BridgeEvent","proxyPage","Proxy","target","receiver","assert","BridgePageType","commonWebActionsForWebPage","mouse","MouseEvent","keyboard","KeyboardEvent","caller","e","AgentOverChromeBridge","Agent","url","tabId","Number","prompt","console","closeNewTabsAfterDisconnect","opts","getBridgeServerHost","originalOnTaskStartTip","tip"],"mappings":"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"}
@@ -28,9 +28,9 @@ __webpack_require__.d(__webpack_exports__, {
28
28
  });
29
29
  const external_page_browser_side_js_namespaceObject = require("./page-browser-side.js");
30
30
  exports.ExtensionBridgePageBrowserSide = __webpack_exports__.ExtensionBridgePageBrowserSide;
31
- for(var __webpack_i__ in __webpack_exports__)if (-1 === [
31
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
32
32
  "ExtensionBridgePageBrowserSide"
33
- ].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
33
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
34
34
  Object.defineProperty(exports, '__esModule', {
35
35
  value: true
36
36
  });
@@ -1 +1 @@
1
- {"version":3,"file":"bridge-mode/browser.js","sources":["webpack://@midscene/web/webpack/runtime/define_property_getters","webpack://@midscene/web/webpack/runtime/has_own_property","webpack://@midscene/web/webpack/runtime/make_namespace_object"],"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};"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol"],"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"}
1
+ {"version":3,"file":"bridge-mode/browser.js","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object"],"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};"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol"],"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"}
@@ -29,14 +29,22 @@ __webpack_require__.d(__webpack_exports__, {
29
29
  BridgeEvent: ()=>BridgeEvent,
30
30
  BridgePageType: ()=>BridgePageType,
31
31
  BridgeSignalKill: ()=>BridgeSignalKill,
32
+ DefaultBridgeServerHost: ()=>DefaultBridgeServerHost,
32
33
  DefaultBridgeServerPort: ()=>DefaultBridgeServerPort,
33
34
  DefaultLocalEndpoint: ()=>DefaultLocalEndpoint,
34
35
  KeyboardEvent: ()=>KeyboardEvent,
35
- MouseEvent: ()=>MouseEvent
36
+ MouseEvent: ()=>MouseEvent,
37
+ getBridgeServerHost: ()=>getBridgeServerHost
36
38
  });
39
+ const DefaultBridgeServerHost = '127.0.0.1';
37
40
  const DefaultBridgeServerPort = 3766;
38
- const DefaultLocalEndpoint = `http://127.0.0.1:${DefaultBridgeServerPort}`;
41
+ const DefaultLocalEndpoint = `http://${DefaultBridgeServerHost}:${DefaultBridgeServerPort}`;
39
42
  const BridgeCallTimeout = 30000;
43
+ function getBridgeServerHost(options) {
44
+ if (options?.host) return options.host;
45
+ if (options?.allowRemoteAccess) return '0.0.0.0';
46
+ return DefaultBridgeServerHost;
47
+ }
40
48
  var BridgeEvent = /*#__PURE__*/ function(BridgeEvent) {
41
49
  BridgeEvent["Call"] = "bridge-call";
42
50
  BridgeEvent["CallResponse"] = "bridge-call-response";
@@ -73,21 +81,25 @@ exports.BridgeErrorCodeNoClientConnected = __webpack_exports__.BridgeErrorCodeNo
73
81
  exports.BridgeEvent = __webpack_exports__.BridgeEvent;
74
82
  exports.BridgePageType = __webpack_exports__.BridgePageType;
75
83
  exports.BridgeSignalKill = __webpack_exports__.BridgeSignalKill;
84
+ exports.DefaultBridgeServerHost = __webpack_exports__.DefaultBridgeServerHost;
76
85
  exports.DefaultBridgeServerPort = __webpack_exports__.DefaultBridgeServerPort;
77
86
  exports.DefaultLocalEndpoint = __webpack_exports__.DefaultLocalEndpoint;
78
87
  exports.KeyboardEvent = __webpack_exports__.KeyboardEvent;
79
88
  exports.MouseEvent = __webpack_exports__.MouseEvent;
80
- for(var __webpack_i__ in __webpack_exports__)if (-1 === [
89
+ exports.getBridgeServerHost = __webpack_exports__.getBridgeServerHost;
90
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
81
91
  "BridgeCallTimeout",
82
92
  "BridgeErrorCodeNoClientConnected",
83
93
  "BridgeEvent",
84
94
  "BridgePageType",
85
95
  "BridgeSignalKill",
96
+ "DefaultBridgeServerHost",
86
97
  "DefaultBridgeServerPort",
87
98
  "DefaultLocalEndpoint",
88
99
  "KeyboardEvent",
89
- "MouseEvent"
90
- ].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
100
+ "MouseEvent",
101
+ "getBridgeServerHost"
102
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
91
103
  Object.defineProperty(exports, '__esModule', {
92
104
  value: true
93
105
  });
@@ -1 +1 @@
1
- {"version":3,"file":"bridge-mode/common.js","sources":["webpack://@midscene/web/webpack/runtime/define_property_getters","webpack://@midscene/web/webpack/runtime/has_own_property","webpack://@midscene/web/webpack/runtime/make_namespace_object","webpack://@midscene/web/./src/bridge-mode/common.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};","export const DefaultBridgeServerPort = 3766;\nexport const DefaultLocalEndpoint = `http://127.0.0.1:${DefaultBridgeServerPort}`;\nexport const BridgeCallTimeout = 30000;\n\nexport enum BridgeEvent {\n Call = 'bridge-call',\n CallResponse = 'bridge-call-response',\n UpdateAgentStatus = 'bridge-update-agent-status',\n Message = 'bridge-message',\n Connected = 'bridge-connected',\n Refused = 'bridge-refused',\n ConnectNewTabWithUrl = 'connectNewTabWithUrl',\n ConnectCurrentTab = 'connectCurrentTab',\n GetBrowserTabList = 'getBrowserTabList',\n SetDestroyOptions = 'setDestroyOptions',\n SetActiveTabId = 'setActiveTabId',\n}\n\nexport const BridgeSignalKill = 'MIDSCENE_BRIDGE_SIGNAL_KILL';\n\nexport interface BridgeConnectTabOptions {\n /**\n * If true, the page will always track the active tab.\n * @default true\n */\n forceSameTabNavigation?: boolean;\n}\n\nexport enum MouseEvent {\n PREFIX = 'mouse.',\n Click = 'mouse.click',\n Wheel = 'mouse.wheel',\n Move = 'mouse.move',\n Drag = 'mouse.drag',\n}\n\nexport enum KeyboardEvent {\n PREFIX = 'keyboard.',\n Type = 'keyboard.type',\n Press = 'keyboard.press',\n}\n\nexport const BridgePageType = 'page-over-chrome-extension-bridge';\n\nexport const BridgeErrorCodeNoClientConnected = 'no-client-connected';\n\nexport interface BridgeCall {\n method: string;\n args: any[];\n response: any;\n callTime: number;\n responseTime: number;\n callback: (error: Error | undefined, response: any) => void;\n error?: Error;\n}\n\nexport interface BridgeCallRequest {\n id: string;\n method: string;\n args: any[];\n}\n\nexport interface BridgeCallResponse {\n id: string;\n response: any;\n error?: any;\n}\n\nexport interface BridgeConnectedEventPayload {\n version: string;\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","DefaultBridgeServerPort","DefaultLocalEndpoint","BridgeCallTimeout","BridgeEvent","BridgeSignalKill","MouseEvent","KeyboardEvent","BridgePageType","BridgeErrorCodeNoClientConnected"],"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;;;;;;;;;;;;;;;ACNO,MAAMI,0BAA0B;AAChC,MAAMC,uBAAuB,CAAC,iBAAiB,EAAED,yBAAyB;AAC1E,MAAME,oBAAoB;AAE1B,IAAKC,cAAAA,WAAAA,GAAAA,SAAAA,WAAW;;;;;;;;;;;;WAAXA;;AAcL,MAAMC,mBAAmB;AAUzB,IAAKC,aAAAA,WAAAA,GAAAA,SAAAA,UAAU;;;;;;WAAVA;;AAQL,IAAKC,gBAAAA,WAAAA,GAAAA,SAAAA,aAAa;;;;WAAbA;;AAML,MAAMC,iBAAiB;AAEvB,MAAMC,mCAAmC"}
1
+ {"version":3,"file":"bridge-mode/common.js","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../../src/bridge-mode/common.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};","export const DefaultBridgeServerHost = '127.0.0.1';\nexport const DefaultBridgeServerPort = 3766;\nexport const DefaultLocalEndpoint = `http://${DefaultBridgeServerHost}:${DefaultBridgeServerPort}`;\nexport const BridgeCallTimeout = 30000;\n\n/**\n * Get the server host based on configuration options.\n * Priority: explicit host > allowRemoteAccess > default (127.0.0.1)\n */\nexport function getBridgeServerHost(options?: {\n host?: string;\n allowRemoteAccess?: boolean;\n}): string {\n if (options?.host) {\n return options.host;\n }\n if (options?.allowRemoteAccess) {\n return '0.0.0.0';\n }\n return DefaultBridgeServerHost;\n}\n\nexport enum BridgeEvent {\n Call = 'bridge-call',\n CallResponse = 'bridge-call-response',\n UpdateAgentStatus = 'bridge-update-agent-status',\n Message = 'bridge-message',\n Connected = 'bridge-connected',\n Refused = 'bridge-refused',\n ConnectNewTabWithUrl = 'connectNewTabWithUrl',\n ConnectCurrentTab = 'connectCurrentTab',\n GetBrowserTabList = 'getBrowserTabList',\n SetDestroyOptions = 'setDestroyOptions',\n SetActiveTabId = 'setActiveTabId',\n}\n\nexport const BridgeSignalKill = 'MIDSCENE_BRIDGE_SIGNAL_KILL';\n\nexport interface BridgeConnectTabOptions {\n /**\n * If true, the page will always track the active tab.\n * @default true\n */\n forceSameTabNavigation?: boolean;\n}\n\nexport enum MouseEvent {\n PREFIX = 'mouse.',\n Click = 'mouse.click',\n Wheel = 'mouse.wheel',\n Move = 'mouse.move',\n Drag = 'mouse.drag',\n}\n\nexport enum KeyboardEvent {\n PREFIX = 'keyboard.',\n Type = 'keyboard.type',\n Press = 'keyboard.press',\n}\n\nexport const BridgePageType = 'page-over-chrome-extension-bridge';\n\nexport const BridgeErrorCodeNoClientConnected = 'no-client-connected';\n\nexport interface BridgeCall {\n method: string;\n args: any[];\n response: any;\n callTime: number;\n responseTime: number;\n callback: (error: Error | undefined, response: any) => void;\n error?: Error;\n}\n\nexport interface BridgeCallRequest {\n id: string;\n method: string;\n args: any[];\n}\n\nexport interface BridgeCallResponse {\n id: string;\n response: any;\n error?: any;\n}\n\nexport interface BridgeConnectedEventPayload {\n version: string;\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","DefaultBridgeServerHost","DefaultBridgeServerPort","DefaultLocalEndpoint","BridgeCallTimeout","getBridgeServerHost","options","BridgeEvent","BridgeSignalKill","MouseEvent","KeyboardEvent","BridgePageType","BridgeErrorCodeNoClientConnected"],"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;;;;;;;;;;;;;;;;;ACNO,MAAMI,0BAA0B;AAChC,MAAMC,0BAA0B;AAChC,MAAMC,uBAAuB,CAAC,OAAO,EAAEF,wBAAwB,CAAC,EAAEC,yBAAyB;AAC3F,MAAME,oBAAoB;AAM1B,SAASC,oBAAoBC,OAGnC;IACC,IAAIA,SAAS,MACX,OAAOA,QAAQ,IAAI;IAErB,IAAIA,SAAS,mBACX,OAAO;IAET,OAAOL;AACT;AAEO,IAAKM,cAAAA,WAAAA,GAAAA,SAAAA,WAAW;;;;;;;;;;;;WAAXA;;AAcL,MAAMC,mBAAmB;AAUzB,IAAKC,aAAAA,WAAAA,GAAAA,SAAAA,UAAU;;;;;;WAAVA;;AAQL,IAAKC,gBAAAA,WAAAA,GAAAA,SAAAA,aAAa;;;;WAAbA;;AAML,MAAMC,iBAAiB;AAEvB,MAAMC,mCAAmC"}