@donggui/web 1.5.5-donggui.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. package/README.md +9 -0
  2. package/bin/midscene-playground +3 -0
  3. package/bin/midscene-web +2 -0
  4. package/dist/es/bin.mjs +23 -0
  5. package/dist/es/bin.mjs.map +1 -0
  6. package/dist/es/bridge-mode/agent-cli-side.mjs +137 -0
  7. package/dist/es/bridge-mode/agent-cli-side.mjs.map +1 -0
  8. package/dist/es/bridge-mode/browser.mjs +2 -0
  9. package/dist/es/bridge-mode/common.mjs +43 -0
  10. package/dist/es/bridge-mode/common.mjs.map +1 -0
  11. package/dist/es/bridge-mode/index.mjs +4 -0
  12. package/dist/es/bridge-mode/io-client.mjs +101 -0
  13. package/dist/es/bridge-mode/io-client.mjs.map +1 -0
  14. package/dist/es/bridge-mode/io-server.mjs +210 -0
  15. package/dist/es/bridge-mode/io-server.mjs.map +1 -0
  16. package/dist/es/bridge-mode/page-browser-side.mjs +118 -0
  17. package/dist/es/bridge-mode/page-browser-side.mjs.map +1 -0
  18. package/dist/es/chrome-extension/agent.mjs +9 -0
  19. package/dist/es/chrome-extension/agent.mjs.map +1 -0
  20. package/dist/es/chrome-extension/cdpInput.mjs +174 -0
  21. package/dist/es/chrome-extension/cdpInput.mjs.LICENSE.txt +5 -0
  22. package/dist/es/chrome-extension/cdpInput.mjs.map +1 -0
  23. package/dist/es/chrome-extension/dynamic-scripts.mjs +38 -0
  24. package/dist/es/chrome-extension/dynamic-scripts.mjs.map +1 -0
  25. package/dist/es/chrome-extension/index.mjs +5 -0
  26. package/dist/es/chrome-extension/page.mjs +651 -0
  27. package/dist/es/chrome-extension/page.mjs.map +1 -0
  28. package/dist/es/cli.mjs +16 -0
  29. package/dist/es/cli.mjs.map +1 -0
  30. package/dist/es/common/cache-helper.mjs +28 -0
  31. package/dist/es/common/cache-helper.mjs.map +1 -0
  32. package/dist/es/index.mjs +6 -0
  33. package/dist/es/mcp-server.mjs +35 -0
  34. package/dist/es/mcp-server.mjs.map +1 -0
  35. package/dist/es/mcp-tools-puppeteer.mjs +215 -0
  36. package/dist/es/mcp-tools-puppeteer.mjs.map +1 -0
  37. package/dist/es/mcp-tools.mjs +78 -0
  38. package/dist/es/mcp-tools.mjs.map +1 -0
  39. package/dist/es/playwright/ai-fixture.mjs +367 -0
  40. package/dist/es/playwright/ai-fixture.mjs.map +1 -0
  41. package/dist/es/playwright/index.mjs +40 -0
  42. package/dist/es/playwright/index.mjs.map +1 -0
  43. package/dist/es/playwright/page.mjs +44 -0
  44. package/dist/es/playwright/page.mjs.map +1 -0
  45. package/dist/es/playwright/reporter/index.mjs +216 -0
  46. package/dist/es/playwright/reporter/index.mjs.map +1 -0
  47. package/dist/es/puppeteer/agent-launcher.mjs +185 -0
  48. package/dist/es/puppeteer/agent-launcher.mjs.map +1 -0
  49. package/dist/es/puppeteer/base-page.mjs +564 -0
  50. package/dist/es/puppeteer/base-page.mjs.map +1 -0
  51. package/dist/es/puppeteer/index.mjs +34 -0
  52. package/dist/es/puppeteer/index.mjs.map +1 -0
  53. package/dist/es/puppeteer/page.mjs +9 -0
  54. package/dist/es/puppeteer/page.mjs.map +1 -0
  55. package/dist/es/static/index.mjs +3 -0
  56. package/dist/es/static/static-agent.mjs +12 -0
  57. package/dist/es/static/static-agent.mjs.map +1 -0
  58. package/dist/es/static/static-page.mjs +122 -0
  59. package/dist/es/static/static-page.mjs.map +1 -0
  60. package/dist/es/utils.mjs +8 -0
  61. package/dist/es/utils.mjs.map +1 -0
  62. package/dist/es/web-element.mjs +59 -0
  63. package/dist/es/web-element.mjs.map +1 -0
  64. package/dist/es/web-page.mjs +260 -0
  65. package/dist/es/web-page.mjs.map +1 -0
  66. package/dist/lib/bin.js +29 -0
  67. package/dist/lib/bin.js.map +1 -0
  68. package/dist/lib/bridge-mode/agent-cli-side.js +174 -0
  69. package/dist/lib/bridge-mode/agent-cli-side.js.map +1 -0
  70. package/dist/lib/bridge-mode/browser.js +38 -0
  71. package/dist/lib/bridge-mode/browser.js.map +1 -0
  72. package/dist/lib/bridge-mode/common.js +107 -0
  73. package/dist/lib/bridge-mode/common.js.map +1 -0
  74. package/dist/lib/bridge-mode/index.js +46 -0
  75. package/dist/lib/bridge-mode/index.js.map +1 -0
  76. package/dist/lib/bridge-mode/io-client.js +135 -0
  77. package/dist/lib/bridge-mode/io-client.js.map +1 -0
  78. package/dist/lib/bridge-mode/io-server.js +247 -0
  79. package/dist/lib/bridge-mode/io-server.js.map +1 -0
  80. package/dist/lib/bridge-mode/page-browser-side.js +162 -0
  81. package/dist/lib/bridge-mode/page-browser-side.js.map +1 -0
  82. package/dist/lib/chrome-extension/agent.js +43 -0
  83. package/dist/lib/chrome-extension/agent.js.map +1 -0
  84. package/dist/lib/chrome-extension/cdpInput.js +208 -0
  85. package/dist/lib/chrome-extension/cdpInput.js.LICENSE.txt +5 -0
  86. package/dist/lib/chrome-extension/cdpInput.js.map +1 -0
  87. package/dist/lib/chrome-extension/dynamic-scripts.js +88 -0
  88. package/dist/lib/chrome-extension/dynamic-scripts.js.map +1 -0
  89. package/dist/lib/chrome-extension/index.js +60 -0
  90. package/dist/lib/chrome-extension/index.js.map +1 -0
  91. package/dist/lib/chrome-extension/page.js +685 -0
  92. package/dist/lib/chrome-extension/page.js.map +1 -0
  93. package/dist/lib/cli.js +22 -0
  94. package/dist/lib/cli.js.map +1 -0
  95. package/dist/lib/common/cache-helper.js +68 -0
  96. package/dist/lib/common/cache-helper.js.map +1 -0
  97. package/dist/lib/index.js +60 -0
  98. package/dist/lib/index.js.map +1 -0
  99. package/dist/lib/mcp-server.js +75 -0
  100. package/dist/lib/mcp-server.js.map +1 -0
  101. package/dist/lib/mcp-tools-puppeteer.js +259 -0
  102. package/dist/lib/mcp-tools-puppeteer.js.map +1 -0
  103. package/dist/lib/mcp-tools.js +112 -0
  104. package/dist/lib/mcp-tools.js.map +1 -0
  105. package/dist/lib/playwright/ai-fixture.js +404 -0
  106. package/dist/lib/playwright/ai-fixture.js.map +1 -0
  107. package/dist/lib/playwright/index.js +93 -0
  108. package/dist/lib/playwright/index.js.map +1 -0
  109. package/dist/lib/playwright/page.js +78 -0
  110. package/dist/lib/playwright/page.js.map +1 -0
  111. package/dist/lib/playwright/reporter/index.js +250 -0
  112. package/dist/lib/playwright/reporter/index.js.map +1 -0
  113. package/dist/lib/puppeteer/agent-launcher.js +253 -0
  114. package/dist/lib/puppeteer/agent-launcher.js.map +1 -0
  115. package/dist/lib/puppeteer/base-page.js +607 -0
  116. package/dist/lib/puppeteer/base-page.js.map +1 -0
  117. package/dist/lib/puppeteer/index.js +84 -0
  118. package/dist/lib/puppeteer/index.js.map +1 -0
  119. package/dist/lib/puppeteer/page.js +43 -0
  120. package/dist/lib/puppeteer/page.js.map +1 -0
  121. package/dist/lib/static/index.js +52 -0
  122. package/dist/lib/static/index.js.map +1 -0
  123. package/dist/lib/static/static-agent.js +46 -0
  124. package/dist/lib/static/static-agent.js.map +1 -0
  125. package/dist/lib/static/static-page.js +156 -0
  126. package/dist/lib/static/static-page.js.map +1 -0
  127. package/dist/lib/utils.js +40 -0
  128. package/dist/lib/utils.js.map +1 -0
  129. package/dist/lib/web-element.js +96 -0
  130. package/dist/lib/web-element.js.map +1 -0
  131. package/dist/lib/web-page.js +310 -0
  132. package/dist/lib/web-page.js.map +1 -0
  133. package/dist/types/bin.d.ts +1 -0
  134. package/dist/types/bridge-mode/agent-cli-side.d.ts +49 -0
  135. package/dist/types/bridge-mode/browser.d.ts +2 -0
  136. package/dist/types/bridge-mode/common.d.ts +74 -0
  137. package/dist/types/bridge-mode/index.d.ts +4 -0
  138. package/dist/types/bridge-mode/io-client.d.ts +10 -0
  139. package/dist/types/bridge-mode/io-server.d.ts +27 -0
  140. package/dist/types/bridge-mode/page-browser-side.d.ts +21 -0
  141. package/dist/types/chrome-extension/agent.d.ts +5 -0
  142. package/dist/types/chrome-extension/cdpInput.d.ts +52 -0
  143. package/dist/types/chrome-extension/dynamic-scripts.d.ts +3 -0
  144. package/dist/types/chrome-extension/index.d.ts +5 -0
  145. package/dist/types/chrome-extension/page.d.ts +110 -0
  146. package/dist/types/cli.d.ts +1 -0
  147. package/dist/types/common/cache-helper.d.ts +20 -0
  148. package/dist/types/index.d.ts +7 -0
  149. package/dist/types/mcp-server.d.ts +26 -0
  150. package/dist/types/mcp-tools-puppeteer.d.ts +13 -0
  151. package/dist/types/mcp-tools.d.ts +12 -0
  152. package/dist/types/playwright/ai-fixture.d.ts +131 -0
  153. package/dist/types/playwright/index.d.ts +13 -0
  154. package/dist/types/playwright/page.d.ts +11 -0
  155. package/dist/types/playwright/reporter/index.d.ts +42 -0
  156. package/dist/types/puppeteer/agent-launcher.d.ts +61 -0
  157. package/dist/types/puppeteer/base-page.d.ts +106 -0
  158. package/dist/types/puppeteer/index.d.ts +10 -0
  159. package/dist/types/puppeteer/page.d.ts +6 -0
  160. package/dist/types/static/index.d.ts +2 -0
  161. package/dist/types/static/static-agent.d.ts +5 -0
  162. package/dist/types/static/static-page.d.ts +42 -0
  163. package/dist/types/utils.d.ts +6 -0
  164. package/dist/types/web-element.d.ts +48 -0
  165. package/dist/types/web-page.d.ts +62 -0
  166. package/package.json +166 -0
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, definition)=>{
5
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
6
+ enumerable: true,
7
+ get: definition[key]
8
+ });
9
+ };
10
+ })();
11
+ (()=>{
12
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
13
+ })();
14
+ (()=>{
15
+ __webpack_require__.r = (exports1)=>{
16
+ if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
17
+ value: 'Module'
18
+ });
19
+ Object.defineProperty(exports1, '__esModule', {
20
+ value: true
21
+ });
22
+ };
23
+ })();
24
+ var __webpack_exports__ = {};
25
+ __webpack_require__.r(__webpack_exports__);
26
+ __webpack_require__.d(__webpack_exports__, {
27
+ WebElementInfoImpl: ()=>WebElementInfoImpl,
28
+ limitOpenNewTabScript: ()=>limitOpenNewTabScript
29
+ });
30
+ function _define_property(obj, key, value) {
31
+ if (key in obj) Object.defineProperty(obj, key, {
32
+ value: value,
33
+ enumerable: true,
34
+ configurable: true,
35
+ writable: true
36
+ });
37
+ else obj[key] = value;
38
+ return obj;
39
+ }
40
+ class WebElementInfoImpl {
41
+ constructor({ content, rect, id, attributes, indexId, xpaths, isVisible }){
42
+ _define_property(this, "content", void 0);
43
+ _define_property(this, "rect", void 0);
44
+ _define_property(this, "center", void 0);
45
+ _define_property(this, "id", void 0);
46
+ _define_property(this, "indexId", void 0);
47
+ _define_property(this, "attributes", void 0);
48
+ _define_property(this, "xpaths", void 0);
49
+ _define_property(this, "isVisible", void 0);
50
+ this.content = content;
51
+ this.rect = rect;
52
+ this.center = [
53
+ Math.floor(rect.left + rect.width / 2),
54
+ Math.floor(rect.top + rect.height / 2)
55
+ ];
56
+ this.id = id;
57
+ this.attributes = attributes;
58
+ this.indexId = indexId;
59
+ this.xpaths = xpaths;
60
+ this.isVisible = isVisible;
61
+ }
62
+ }
63
+ const limitOpenNewTabScript = `
64
+ if (!window.__MIDSCENE_NEW_TAB_INTERCEPTOR_INITIALIZED__) {
65
+ window.__MIDSCENE_NEW_TAB_INTERCEPTOR_INITIALIZED__ = true;
66
+
67
+ // Intercept the window.open method (only once)
68
+ window.open = function(url) {
69
+ console.log('Blocked window.open:', url);
70
+ window.location.href = url;
71
+ return null;
72
+ };
73
+
74
+ // Block all a tag clicks with target="_blank" (only once)
75
+ document.addEventListener('click', function(e) {
76
+ const target = e.target.closest('a');
77
+ if (target && target.target === '_blank') {
78
+ e.preventDefault();
79
+ console.log('Blocked new tab:', target.href);
80
+ window.location.href = target.href;
81
+ target.removeAttribute('target');
82
+ }
83
+ }, true);
84
+ }
85
+ `;
86
+ exports.WebElementInfoImpl = __webpack_exports__.WebElementInfoImpl;
87
+ exports.limitOpenNewTabScript = __webpack_exports__.limitOpenNewTabScript;
88
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
89
+ "WebElementInfoImpl",
90
+ "limitOpenNewTabScript"
91
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
92
+ Object.defineProperty(exports, '__esModule', {
93
+ value: true
94
+ });
95
+
96
+ //# sourceMappingURL=web-element.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-element.js","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../src/web-element.ts"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import type {\n AgentOpt,\n DeviceAction,\n Rect,\n WebElementInfo,\n} from '@midscene/core';\nimport { _keyDefinitions } from '@midscene/shared/us-keyboard-layout';\n\nimport type { NodeType } from '@midscene/shared/constants';\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 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\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":["__webpack_require__","definition","key","Object","obj","prop","Symbol","WebElementInfoImpl","content","rect","id","attributes","indexId","xpaths","isVisible","Math","limitOpenNewTabScript"],"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;;;;;;;;;;;;;;;;;;ACyBO,MAAMI;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;AAEO,MAAME,wBAAwB,CAAC;;;;;;;;;;;;;;;;;;;;;;AAsBtC,CAAC"}
@@ -0,0 +1,310 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.n = (module)=>{
5
+ var getter = module && module.__esModule ? ()=>module['default'] : ()=>module;
6
+ __webpack_require__.d(getter, {
7
+ a: getter
8
+ });
9
+ return getter;
10
+ };
11
+ })();
12
+ (()=>{
13
+ __webpack_require__.d = (exports1, definition)=>{
14
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
15
+ enumerable: true,
16
+ get: definition[key]
17
+ });
18
+ };
19
+ })();
20
+ (()=>{
21
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
22
+ })();
23
+ (()=>{
24
+ __webpack_require__.r = (exports1)=>{
25
+ if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
26
+ value: 'Module'
27
+ });
28
+ Object.defineProperty(exports1, '__esModule', {
29
+ value: true
30
+ });
31
+ };
32
+ })();
33
+ var __webpack_exports__ = {};
34
+ __webpack_require__.r(__webpack_exports__);
35
+ __webpack_require__.d(__webpack_exports__, {
36
+ commonWebActionsForWebPage: ()=>commonWebActionsForWebPage,
37
+ getKeyCommands: ()=>getKeyCommands,
38
+ AbstractWebPage: ()=>AbstractWebPage
39
+ });
40
+ const external_node_assert_namespaceObject = require("node:assert");
41
+ var external_node_assert_default = /*#__PURE__*/ __webpack_require__.n(external_node_assert_namespaceObject);
42
+ const core_namespaceObject = require("@midscene/core");
43
+ const device_namespaceObject = require("@midscene/core/device");
44
+ const utils_namespaceObject = require("@midscene/core/utils");
45
+ const logger_namespaceObject = require("@midscene/shared/logger");
46
+ const us_keyboard_layout_namespaceObject = require("@midscene/shared/us-keyboard-layout");
47
+ const debug = (0, logger_namespaceObject.getDebug)('web:page');
48
+ const navigateParamSchema = core_namespaceObject.z.object({
49
+ url: core_namespaceObject.z.string().describe('The URL to navigate to. Must start with https://, file://, or a similar protocol.')
50
+ });
51
+ function normalizeKeyInputs(value) {
52
+ const inputs = Array.isArray(value) ? value : [
53
+ value
54
+ ];
55
+ const result = [];
56
+ for (const input of inputs){
57
+ if ('string' != typeof input) {
58
+ result.push(input);
59
+ continue;
60
+ }
61
+ const trimmed = input.trim();
62
+ if (!trimmed) {
63
+ result.push(input);
64
+ continue;
65
+ }
66
+ let normalized = trimmed;
67
+ if (normalized.length > 1 && normalized.includes('+')) normalized = normalized.replace(/\s*\+\s*/g, ' ');
68
+ if (/\s/.test(normalized)) normalized = normalized.replace(/\s+/g, ' ');
69
+ const transformed = (0, us_keyboard_layout_namespaceObject.transformHotkeyInput)(normalized);
70
+ if (1 === transformed.length && '' === transformed[0] && '' !== trimmed) {
71
+ result.push(input);
72
+ continue;
73
+ }
74
+ if (0 === transformed.length) {
75
+ result.push(input);
76
+ continue;
77
+ }
78
+ result.push(...transformed);
79
+ }
80
+ return result;
81
+ }
82
+ function getKeyCommands(value) {
83
+ const keys = normalizeKeyInputs(value);
84
+ return keys.reduce((acc, k)=>{
85
+ const includeMeta = keys.includes('Meta') || keys.includes('Control');
86
+ if (includeMeta && ('a' === k || 'A' === k)) return acc.concat([
87
+ {
88
+ key: k,
89
+ command: 'SelectAll'
90
+ }
91
+ ]);
92
+ if (includeMeta && ('c' === k || 'C' === k)) return acc.concat([
93
+ {
94
+ key: k,
95
+ command: 'Copy'
96
+ }
97
+ ]);
98
+ if (includeMeta && ('v' === k || 'V' === k)) return acc.concat([
99
+ {
100
+ key: k,
101
+ command: 'Paste'
102
+ }
103
+ ]);
104
+ return acc.concat([
105
+ {
106
+ key: k
107
+ }
108
+ ]);
109
+ }, []);
110
+ }
111
+ class AbstractWebPage extends device_namespaceObject.AbstractInterface {
112
+ get mouse() {
113
+ return {
114
+ click: async (x, y, options)=>{},
115
+ wheel: async (deltaX, deltaY)=>{},
116
+ move: async (x, y)=>{},
117
+ drag: async (from, to)=>{}
118
+ };
119
+ }
120
+ get keyboard() {
121
+ return {
122
+ type: async (text)=>{},
123
+ press: async (action)=>{}
124
+ };
125
+ }
126
+ async clearInput(element) {}
127
+ }
128
+ const commonWebActionsForWebPage = (page, includeTouchEvents = false)=>[
129
+ (0, device_namespaceObject.defineActionTap)(async (param)=>{
130
+ const element = param.locate;
131
+ external_node_assert_default()(element, 'Element not found, cannot tap');
132
+ await page.mouse.click(element.center[0], element.center[1], {
133
+ button: 'left'
134
+ });
135
+ }),
136
+ (0, device_namespaceObject.defineActionRightClick)(async (param)=>{
137
+ const element = param.locate;
138
+ external_node_assert_default()(element, 'Element not found, cannot right click');
139
+ await page.mouse.click(element.center[0], element.center[1], {
140
+ button: 'right'
141
+ });
142
+ }),
143
+ (0, device_namespaceObject.defineActionDoubleClick)(async (param)=>{
144
+ const element = param.locate;
145
+ external_node_assert_default()(element, 'Element not found, cannot double click');
146
+ await page.mouse.click(element.center[0], element.center[1], {
147
+ button: 'left',
148
+ count: 2
149
+ });
150
+ }),
151
+ (0, device_namespaceObject.defineActionHover)(async (param)=>{
152
+ const element = param.locate;
153
+ external_node_assert_default()(element, 'Element not found, cannot hover');
154
+ await page.mouse.move(element.center[0], element.center[1]);
155
+ }),
156
+ (0, device_namespaceObject.defineActionInput)(async (param)=>{
157
+ const element = param.locate;
158
+ if (element && 'typeOnly' !== param.mode) await page.clearInput(element);
159
+ else if (element && 'typeOnly' === param.mode) {
160
+ await page.mouse.click(element.center[0], element.center[1], {
161
+ button: 'left'
162
+ });
163
+ await page.keyboard.press([
164
+ {
165
+ key: 'End'
166
+ }
167
+ ]);
168
+ }
169
+ if ('clear' === param.mode) return;
170
+ if (!param || !param.value) return;
171
+ await page.keyboard.type(param.value);
172
+ }),
173
+ (0, device_namespaceObject.defineActionKeyboardPress)(async (param)=>{
174
+ const element = param.locate;
175
+ if (element) await page.mouse.click(element.center[0], element.center[1], {
176
+ button: 'left'
177
+ });
178
+ const keys = getKeyCommands(param.keyName);
179
+ await page.keyboard.press(keys);
180
+ }),
181
+ (0, device_namespaceObject.defineActionCursorMove)(async (param)=>{
182
+ const arrowKey = 'left' === param.direction ? 'ArrowLeft' : 'ArrowRight';
183
+ const times = param.times ?? 1;
184
+ for(let i = 0; i < times; i++){
185
+ await page.keyboard.press([
186
+ {
187
+ key: arrowKey
188
+ }
189
+ ]);
190
+ await (0, utils_namespaceObject.sleep)(100);
191
+ }
192
+ }),
193
+ (0, device_namespaceObject.defineActionScroll)(async (param)=>{
194
+ const element = param.locate;
195
+ const startingPoint = element ? {
196
+ left: element.center[0],
197
+ top: element.center[1]
198
+ } : void 0;
199
+ const scrollToEventName = param?.scrollType;
200
+ if ('scrollToTop' === scrollToEventName) await page.scrollUntilTop(startingPoint);
201
+ else if ('scrollToBottom' === scrollToEventName) await page.scrollUntilBottom(startingPoint);
202
+ else if ('scrollToRight' === scrollToEventName) await page.scrollUntilRight(startingPoint);
203
+ else if ('scrollToLeft' === scrollToEventName) await page.scrollUntilLeft(startingPoint);
204
+ else if ('singleAction' !== scrollToEventName && scrollToEventName) throw new Error(`Unknown scroll event type: ${scrollToEventName}, param: ${JSON.stringify(param)}`);
205
+ else {
206
+ if (param?.direction !== 'down' && param && param.direction) if ('up' === param.direction) await page.scrollUp(param.distance || void 0, startingPoint);
207
+ else if ('left' === param.direction) await page.scrollLeft(param.distance || void 0, startingPoint);
208
+ else if ('right' === param.direction) await page.scrollRight(param.distance || void 0, startingPoint);
209
+ else throw new Error(`Unknown scroll direction: ${param.direction}`);
210
+ else await page.scrollDown(param?.distance || void 0, startingPoint);
211
+ await (0, utils_namespaceObject.sleep)(500);
212
+ }
213
+ }),
214
+ (0, device_namespaceObject.defineActionDragAndDrop)(async (param)=>{
215
+ const from = param.from;
216
+ const to = param.to;
217
+ external_node_assert_default()(from, 'missing "from" param for drag and drop');
218
+ external_node_assert_default()(to, 'missing "to" param for drag and drop');
219
+ await page.mouse.drag({
220
+ x: from.center[0],
221
+ y: from.center[1]
222
+ }, {
223
+ x: to.center[0],
224
+ y: to.center[1]
225
+ });
226
+ }),
227
+ (0, device_namespaceObject.defineActionLongPress)(async (param)=>{
228
+ const element = param.locate;
229
+ external_node_assert_default()(element, 'Element not found, cannot long press');
230
+ const duration = param?.duration;
231
+ await page.longPress(element.center[0], element.center[1], duration);
232
+ }),
233
+ ...includeTouchEvents ? [
234
+ (0, device_namespaceObject.defineActionSwipe)(async (param)=>{
235
+ const { width, height } = await page.size();
236
+ const { start, end } = param;
237
+ const startPoint = start ? {
238
+ x: start.center[0],
239
+ y: start.center[1]
240
+ } : {
241
+ x: width / 2,
242
+ y: height / 2
243
+ };
244
+ let endPoint;
245
+ if (end) endPoint = {
246
+ x: end.center[0],
247
+ y: end.center[1]
248
+ };
249
+ else if (param.distance) {
250
+ const direction = param.direction;
251
+ if (!direction) throw new Error('direction is required for swipe gesture');
252
+ endPoint = {
253
+ x: startPoint.x + ('right' === direction ? param.distance : 'left' === direction ? -param.distance : 0),
254
+ y: startPoint.y + ('down' === direction ? param.distance : 'up' === direction ? -param.distance : 0)
255
+ };
256
+ } else throw new Error('Either end or distance must be specified for swipe gesture');
257
+ endPoint.x = Math.max(0, Math.min(endPoint.x, width));
258
+ endPoint.y = Math.max(0, Math.min(endPoint.y, height));
259
+ const duration = param.duration;
260
+ debug(`swipe from ${startPoint.x}, ${startPoint.y} to ${endPoint.x}, ${endPoint.y} with duration ${duration}ms, repeat is set to ${param.repeat}`);
261
+ let repeat = 'number' == typeof param.repeat ? param.repeat : 1;
262
+ if (0 === repeat) repeat = 10;
263
+ for(let i = 0; i < repeat; i++)await page.swipe(startPoint, endPoint, duration);
264
+ })
265
+ ] : [],
266
+ (0, device_namespaceObject.defineActionClearInput)(async (param)=>{
267
+ await page.clearInput(param.locate);
268
+ }),
269
+ (0, device_namespaceObject.defineAction)({
270
+ name: 'Navigate',
271
+ description: 'Navigate the browser to a specified URL. Opens the URL in the current tab.',
272
+ paramSchema: navigateParamSchema,
273
+ sample: {
274
+ url: 'https://www.example.com'
275
+ },
276
+ call: async (param)=>{
277
+ if (!page.navigate) throw new Error('Navigate operation is not supported on this page type');
278
+ await page.navigate(param.url);
279
+ }
280
+ }),
281
+ (0, device_namespaceObject.defineAction)({
282
+ name: 'Reload',
283
+ description: 'Reload the current page',
284
+ call: async ()=>{
285
+ if (!page.reload) throw new Error('Reload operation is not supported on this page type');
286
+ await page.reload();
287
+ }
288
+ }),
289
+ (0, device_namespaceObject.defineAction)({
290
+ name: 'GoBack',
291
+ description: 'Navigate back in browser history',
292
+ call: async ()=>{
293
+ if (!page.goBack) throw new Error('GoBack operation is not supported on this page type');
294
+ await page.goBack();
295
+ }
296
+ })
297
+ ];
298
+ exports.AbstractWebPage = __webpack_exports__.AbstractWebPage;
299
+ exports.commonWebActionsForWebPage = __webpack_exports__.commonWebActionsForWebPage;
300
+ exports.getKeyCommands = __webpack_exports__.getKeyCommands;
301
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
302
+ "AbstractWebPage",
303
+ "commonWebActionsForWebPage",
304
+ "getKeyCommands"
305
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
306
+ Object.defineProperty(exports, '__esModule', {
307
+ value: true
308
+ });
309
+
310
+ //# sourceMappingURL=web-page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-page.js","sources":["webpack/runtime/compat_get_default_export","webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../src/web-page.ts"],"sourcesContent":["// getDefaultExport function for compatibility with non-ESM modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};\n","__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import 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 defineActionCursorMove,\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\nconst navigateParamSchema = z.object({\n url: z\n .string()\n .describe(\n 'The URL to navigate to. Must start with https://, file://, or a similar protocol.',\n ),\n});\n\nfunction normalizeKeyInputs(value: string | string[]): string[] {\n const inputs = Array.isArray(value) ? value : [value];\n const result: string[] = [];\n\n for (const input of inputs) {\n if (typeof input !== 'string') {\n result.push(input as unknown as string);\n continue;\n }\n\n const trimmed = input.trim();\n if (!trimmed) {\n result.push(input);\n continue;\n }\n\n let normalized = trimmed;\n if (normalized.length > 1 && normalized.includes('+')) {\n normalized = normalized.replace(/\\s*\\+\\s*/g, ' ');\n }\n if (/\\s/.test(normalized)) {\n normalized = normalized.replace(/\\s+/g, ' ');\n }\n\n const transformed = transformHotkeyInput(normalized);\n if (transformed.length === 1 && transformed[0] === '' && trimmed !== '') {\n result.push(input);\n continue;\n }\n if (transformed.length === 0) {\n result.push(input);\n continue;\n }\n\n result.push(...transformed);\n }\n\n return result;\n}\n\nexport function getKeyCommands(\n value: string | string[],\n): Array<{ key: string; command?: string }> {\n const keys = normalizeKeyInputs(value);\n\n return keys.reduce((acc: Array<{ key: string; command?: string }>, k) => {\n const includeMeta = keys.includes('Meta') || keys.includes('Control');\n if (includeMeta && (k === 'a' || k === 'A')) {\n return acc.concat([{ key: k, command: 'SelectAll' }]);\n }\n if (includeMeta && (k === 'c' || k === 'C')) {\n return acc.concat([{ key: k, command: 'Copy' }]);\n }\n if (includeMeta && (k === 'v' || k === 'V')) {\n return acc.concat([{ key: k, command: 'Paste' }]);\n }\n return acc.concat([{ key: k }]);\n }, []);\n}\n\n// this is copied from puppeteer, but we don't want to import puppeteer here\nexport declare type KeyInput =\n | '0'\n | '1'\n | '2'\n | '3'\n | '4'\n | '5'\n | '6'\n | '7'\n | '8'\n | '9'\n | 'Power'\n | 'Eject'\n | 'Abort'\n | 'Help'\n | 'Backspace'\n | 'Tab'\n | 'Numpad5'\n | 'NumpadEnter'\n | 'Enter'\n | '\\r'\n | '\\n'\n | 'ShiftLeft'\n | 'ShiftRight'\n | 'ControlLeft'\n | 'ControlRight'\n | 'AltLeft'\n | 'AltRight'\n | 'Pause'\n | 'CapsLock'\n | 'Escape'\n | 'Convert'\n | 'NonConvert'\n | 'Space'\n | 'Numpad9'\n | 'PageUp'\n | 'Numpad3'\n | 'PageDown'\n | 'End'\n | 'Numpad1'\n | 'Home'\n | 'Numpad7'\n | 'ArrowLeft'\n | 'Numpad4'\n | 'Numpad8'\n | 'ArrowUp'\n | 'ArrowRight'\n | 'Numpad6'\n | 'Numpad2'\n | 'ArrowDown'\n | 'Select'\n | 'Open'\n | 'PrintScreen'\n | 'Insert'\n | 'Numpad0'\n | 'Delete'\n | 'NumpadDecimal'\n | 'Digit0'\n | 'Digit1'\n | 'Digit2'\n | 'Digit3'\n | 'Digit4'\n | 'Digit5'\n | 'Digit6'\n | 'Digit7'\n | 'Digit8'\n | 'Digit9'\n | 'KeyA'\n | 'KeyB'\n | 'KeyC'\n | 'KeyD'\n | 'KeyE'\n | 'KeyF'\n | 'KeyG'\n | 'KeyH'\n | 'KeyI'\n | 'KeyJ'\n | 'KeyK'\n | 'KeyL'\n | 'KeyM'\n | 'KeyN'\n | 'KeyO'\n | 'KeyP'\n | 'KeyQ'\n | 'KeyR'\n | 'KeyS'\n | 'KeyT'\n | 'KeyU'\n | 'KeyV'\n | 'KeyW'\n | 'KeyX'\n | 'KeyY'\n | 'KeyZ'\n | 'MetaLeft'\n | 'MetaRight'\n | 'ContextMenu'\n | 'NumpadMultiply'\n | 'NumpadAdd'\n | 'NumpadSubtract'\n | 'NumpadDivide'\n | 'F1'\n | 'F2'\n | 'F3'\n | 'F4'\n | 'F5'\n | 'F6'\n | 'F7'\n | 'F8'\n | 'F9'\n | 'F10'\n | 'F11'\n | 'F12'\n | 'F13'\n | 'F14'\n | 'F15'\n | 'F16'\n | 'F17'\n | 'F18'\n | 'F19'\n | 'F20'\n | 'F21'\n | 'F22'\n | 'F23'\n | 'F24'\n | 'NumLock'\n | 'ScrollLock'\n | 'AudioVolumeMute'\n | 'AudioVolumeDown'\n | 'AudioVolumeUp'\n | 'MediaTrackNext'\n | 'MediaTrackPrevious'\n | 'MediaStop'\n | 'MediaPlayPause'\n | 'Semicolon'\n | 'Equal'\n | 'NumpadEqual'\n | 'Comma'\n | 'Minus'\n | 'Period'\n | 'Slash'\n | 'Backquote'\n | 'BracketLeft'\n | 'Backslash'\n | 'BracketRight'\n | 'Quote'\n | 'AltGraph'\n | 'Props'\n | 'Cancel'\n | 'Clear'\n | 'Shift'\n | 'Control'\n | 'Alt'\n | 'Accept'\n | 'ModeChange'\n | ' '\n | 'Print'\n | 'Execute'\n | '\\u0000'\n | 'a'\n | 'b'\n | 'c'\n | 'd'\n | 'e'\n | 'f'\n | 'g'\n | 'h'\n | 'i'\n | 'j'\n | 'k'\n | 'l'\n | 'm'\n | 'n'\n | 'o'\n | 'p'\n | 'q'\n | 'r'\n | 's'\n | 't'\n | 'u'\n | 'v'\n | 'w'\n | 'x'\n | 'y'\n | 'z'\n | 'Meta'\n | '*'\n | '+'\n | '-'\n | '/'\n | ';'\n | '='\n | ','\n | '.'\n | '`'\n | '['\n | '\\\\'\n | ']'\n | \"'\"\n | 'Attn'\n | 'CrSel'\n | 'ExSel'\n | 'EraseEof'\n | 'Play'\n | 'ZoomOut'\n | ')'\n | '!'\n | '@'\n | '#'\n | '$'\n | '%'\n | '^'\n | '&'\n | '('\n | 'A'\n | 'B'\n | 'C'\n | 'D'\n | 'E'\n | 'F'\n | 'G'\n | 'H'\n | 'I'\n | 'J'\n | 'K'\n | 'L'\n | 'M'\n | 'N'\n | 'O'\n | 'P'\n | 'Q'\n | 'R'\n | 'S'\n | 'T'\n | 'U'\n | 'V'\n | 'W'\n | 'X'\n | 'Y'\n | 'Z'\n | ':'\n | '<'\n | '_'\n | '>'\n | '?'\n | '~'\n | '{'\n | '|'\n | '}'\n | '\"'\n | 'SoftLeft'\n | 'SoftRight'\n | 'Camera'\n | 'Call'\n | 'EndCall'\n | 'VolumeDown'\n | 'VolumeUp';\n\nexport type MouseButton = 'left' | 'right' | 'middle';\n\nexport interface MouseAction {\n click: (\n x: number,\n y: number,\n options: { button: MouseButton; count?: number },\n ) => Promise<void>;\n wheel: (deltaX: number, deltaY: number) => Promise<void>;\n move: (x: number, y: number) => Promise<void>;\n drag: (\n from: { x: number; y: number },\n to: { x: number; y: number },\n ) => Promise<void>;\n}\n\nexport interface KeyboardAction {\n type: (text: string) => 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\n // Pure tap action - file handling is done at Page layer via setFileChooserHandler\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 !== 'typeOnly') {\n await page.clearInput(element as unknown as ElementInfo);\n } else if (element && param.mode === 'typeOnly') {\n // typeOnly mode: click to focus and move cursor to end, but don't clear\n await page.mouse.click(element.center[0], element.center[1], {\n button: 'left',\n });\n await page.keyboard.press([{ key: 'End' }]);\n }\n\n if (param.mode === 'clear') {\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 defineActionCursorMove(async (param) => {\n const arrowKey = param.direction === 'left' ? 'ArrowLeft' : 'ArrowRight';\n const times = param.times ?? 1;\n for (let i = 0; i < times; i++) {\n await page.keyboard.press([{ key: arrowKey as any }]);\n await sleep(100);\n }\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 await page.clearInput(param.locate as ElementInfo | undefined);\n }),\n\n defineAction<typeof navigateParamSchema, { url: string }>({\n name: 'Navigate',\n description:\n 'Navigate the browser to a specified URL. Opens the URL in the current tab.',\n paramSchema: navigateParamSchema,\n sample: {\n url: 'https://www.example.com',\n },\n call: async (param) => {\n if (!page.navigate) {\n throw new Error(\n 'Navigate operation is not supported on this page type',\n );\n }\n await page.navigate(param.url);\n },\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":["__webpack_require__","module","getter","definition","key","Object","obj","prop","Symbol","debug","getDebug","navigateParamSchema","z","normalizeKeyInputs","value","inputs","Array","result","input","trimmed","normalized","transformed","transformHotkeyInput","getKeyCommands","keys","acc","k","includeMeta","AbstractWebPage","AbstractInterface","x","y","options","deltaX","deltaY","from","to","text","action","element","commonWebActionsForWebPage","page","includeTouchEvents","defineActionTap","param","assert","defineActionRightClick","defineActionDoubleClick","defineActionHover","defineActionInput","defineActionKeyboardPress","defineActionCursorMove","arrowKey","times","i","sleep","defineActionScroll","startingPoint","undefined","scrollToEventName","Error","JSON","defineActionDragAndDrop","defineActionLongPress","duration","defineActionSwipe","width","height","start","end","startPoint","endPoint","direction","Math","repeat","defineActionClearInput","defineAction"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ import 'dotenv/config';
@@ -0,0 +1,49 @@
1
+ import { Agent, type AgentOpt } from '@midscene/core/agent';
2
+ import { type BridgeConnectTabOptions } from './common';
3
+ import type { ExtensionBridgePageBrowserSide } from './page-browser-side';
4
+ interface ChromeExtensionPageCliSide extends ExtensionBridgePageBrowserSide {
5
+ showStatusMessage: (message: string) => Promise<void>;
6
+ }
7
+ export declare const getBridgePageInCliSide: (options?: {
8
+ host?: string;
9
+ port?: number;
10
+ timeout?: number | false;
11
+ closeConflictServer?: boolean;
12
+ }) => ChromeExtensionPageCliSide;
13
+ export declare class AgentOverChromeBridge extends Agent<ChromeExtensionPageCliSide> {
14
+ private destroyAfterDisconnectFlag?;
15
+ constructor(opts?: AgentOpt & {
16
+ /**
17
+ * Enable remote access to the bridge server.
18
+ * - false (default): Only localhost can connect (most secure)
19
+ * - true: Allow remote machines to connect (binds to 0.0.0.0)
20
+ */
21
+ allowRemoteAccess?: boolean;
22
+ /**
23
+ * Custom host to bind the bridge server to.
24
+ * Overrides allowRemoteAccess if specified.
25
+ */
26
+ host?: string;
27
+ /**
28
+ * Custom port for the bridge server.
29
+ * @default 3766
30
+ */
31
+ port?: number;
32
+ closeNewTabsAfterDisconnect?: boolean;
33
+ serverListeningTimeout?: number | false;
34
+ closeConflictServer?: boolean;
35
+ });
36
+ setDestroyOptionsAfterConnect(): Promise<void>;
37
+ connectNewTabWithUrl(url: string, options?: BridgeConnectTabOptions): Promise<void>;
38
+ getBrowserTabList(): Promise<{
39
+ id: string;
40
+ title: string;
41
+ url: string;
42
+ currentActiveTab: boolean;
43
+ }[]>;
44
+ setActiveTabId(tabId: string): Promise<void>;
45
+ connectCurrentTab(options?: BridgeConnectTabOptions): Promise<void>;
46
+ aiAct(prompt: string, options?: any): Promise<string | undefined>;
47
+ destroy(closeNewTabsAfterDisconnect?: boolean): Promise<void>;
48
+ }
49
+ export {};
@@ -0,0 +1,2 @@
1
+ import { ExtensionBridgePageBrowserSide } from '../bridge-mode/page-browser-side';
2
+ export { ExtensionBridgePageBrowserSide };
@@ -0,0 +1,74 @@
1
+ export declare const DefaultBridgeServerHost = "127.0.0.1";
2
+ export declare const DefaultBridgeServerPort = 3766;
3
+ export declare const DefaultLocalEndpoint = "http://127.0.0.1:3766";
4
+ export declare const BridgeCallTimeout = 30000;
5
+ /**
6
+ * Get the server host based on configuration options.
7
+ * Priority: explicit host > allowRemoteAccess > default (127.0.0.1)
8
+ */
9
+ export declare function getBridgeServerHost(options?: {
10
+ host?: string;
11
+ allowRemoteAccess?: boolean;
12
+ }): string;
13
+ export declare enum BridgeEvent {
14
+ Call = "bridge-call",
15
+ CallResponse = "bridge-call-response",
16
+ UpdateAgentStatus = "bridge-update-agent-status",
17
+ Message = "bridge-message",
18
+ Connected = "bridge-connected",
19
+ Refused = "bridge-refused",
20
+ ConnectNewTabWithUrl = "connectNewTabWithUrl",
21
+ ConnectCurrentTab = "connectCurrentTab",
22
+ GetBrowserTabList = "getBrowserTabList",
23
+ SetDestroyOptions = "setDestroyOptions",
24
+ SetActiveTabId = "setActiveTabId"
25
+ }
26
+ export declare const BridgeSignalKill = "MIDSCENE_BRIDGE_SIGNAL_KILL";
27
+ export interface BridgeConnectTabOptions {
28
+ /**
29
+ * If true, the page will always track the active tab.
30
+ * @default true
31
+ */
32
+ forceSameTabNavigation?: boolean;
33
+ /**
34
+ * Custom timeout for connecting to the tab in milliseconds.
35
+ * @default 30000 (30 seconds)
36
+ */
37
+ timeout?: number;
38
+ }
39
+ export declare enum MouseEvent {
40
+ PREFIX = "mouse.",
41
+ Click = "mouse.click",
42
+ Wheel = "mouse.wheel",
43
+ Move = "mouse.move",
44
+ Drag = "mouse.drag"
45
+ }
46
+ export declare enum KeyboardEvent {
47
+ PREFIX = "keyboard.",
48
+ Type = "keyboard.type",
49
+ Press = "keyboard.press"
50
+ }
51
+ export declare const BridgePageType = "page-over-chrome-extension-bridge";
52
+ export declare const BridgeErrorCodeNoClientConnected = "no-client-connected";
53
+ export interface BridgeCall {
54
+ method: string;
55
+ args: any[];
56
+ response: any;
57
+ callTime: number;
58
+ responseTime: number;
59
+ callback: (error: Error | undefined, response: any) => void;
60
+ error?: Error;
61
+ }
62
+ export interface BridgeCallRequest {
63
+ id: string;
64
+ method: string;
65
+ args: any[];
66
+ }
67
+ export interface BridgeCallResponse {
68
+ id: string;
69
+ response: any;
70
+ error?: any;
71
+ }
72
+ export interface BridgeConnectedEventPayload {
73
+ version: string;
74
+ }
@@ -0,0 +1,4 @@
1
+ import { AgentOverChromeBridge } from './agent-cli-side';
2
+ export { AgentOverChromeBridge };
3
+ export { overrideAIConfig } from '@midscene/shared/env';
4
+ export { killRunningServer } from './io-server';
@@ -0,0 +1,10 @@
1
+ export declare class BridgeClient {
2
+ endpoint: string;
3
+ onBridgeCall: (method: string, args: any[]) => Promise<any>;
4
+ onDisconnect?: (() => void) | undefined;
5
+ private socket;
6
+ serverVersion: string | null;
7
+ constructor(endpoint: string, onBridgeCall: (method: string, args: any[]) => Promise<any>, onDisconnect?: (() => void) | undefined);
8
+ connect(): Promise<unknown>;
9
+ disconnect(): void;
10
+ }