@agent-infra/browser 0.1.6 → 0.2.0-alpha.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 (186) hide show
  1. package/README.md +35 -52
  2. package/README.zh-CN.md +57 -0
  3. package/dist/actions/index.d.ts +3 -0
  4. package/dist/actions/index.d.ts.map +1 -0
  5. package/dist/actions/index.js +46 -0
  6. package/dist/actions/index.js.map +1 -0
  7. package/dist/actions/index.mjs +7 -0
  8. package/dist/actions/key-map.d.ts +28 -0
  9. package/dist/actions/key-map.d.ts.map +1 -0
  10. package/dist/actions/key-map.js +409 -0
  11. package/dist/actions/key-map.js.map +1 -0
  12. package/dist/actions/key-map.mjs +369 -0
  13. package/dist/actions/key-map.mjs.map +1 -0
  14. package/dist/actions/keyboard.d.ts +21 -0
  15. package/dist/actions/keyboard.d.ts.map +1 -0
  16. package/dist/actions/keyboard.js +196 -0
  17. package/dist/actions/keyboard.js.map +1 -0
  18. package/dist/actions/keyboard.mjs +152 -0
  19. package/dist/actions/keyboard.mjs.map +1 -0
  20. package/dist/actions/keyboard.test.d.ts +2 -0
  21. package/dist/actions/keyboard.test.d.ts.map +1 -0
  22. package/dist/actions/mouse.d.ts +19 -0
  23. package/dist/actions/mouse.d.ts.map +1 -0
  24. package/dist/actions/mouse.js +173 -0
  25. package/dist/actions/mouse.js.map +1 -0
  26. package/dist/actions/mouse.mjs +136 -0
  27. package/dist/actions/mouse.mjs.map +1 -0
  28. package/dist/browser/base.d.ts +47 -0
  29. package/dist/browser/base.d.ts.map +1 -0
  30. package/dist/browser/base.js +156 -0
  31. package/dist/browser/base.js.map +1 -0
  32. package/dist/browser/base.mjs +122 -0
  33. package/dist/browser/base.mjs.map +1 -0
  34. package/dist/browser/browser.d.ts +23 -0
  35. package/dist/browser/browser.d.ts.map +1 -0
  36. package/dist/browser/browser.js +183 -0
  37. package/dist/browser/browser.js.map +1 -0
  38. package/dist/browser/browser.mjs +149 -0
  39. package/dist/browser/browser.mjs.map +1 -0
  40. package/dist/env.d.ts +4 -0
  41. package/dist/env.d.ts.map +1 -0
  42. package/dist/env.js +96 -0
  43. package/dist/env.js.map +1 -0
  44. package/dist/env.mjs +62 -0
  45. package/dist/env.mjs.map +1 -0
  46. package/dist/index.node.d.ts +7 -0
  47. package/dist/index.node.d.ts.map +1 -0
  48. package/dist/index.node.js +106 -0
  49. package/dist/index.node.js.map +1 -0
  50. package/dist/index.node.mjs +10 -0
  51. package/dist/index.web.d.ts +7 -0
  52. package/dist/index.web.d.ts.map +1 -0
  53. package/dist/{index.js → index.web.js} +33 -20
  54. package/dist/index.web.js.map +1 -0
  55. package/dist/index.web.mjs +10 -0
  56. package/dist/injected-script/index.d.ts +3 -0
  57. package/dist/injected-script/index.d.ts.map +1 -0
  58. package/dist/injected-script/index.js +46 -0
  59. package/dist/injected-script/index.js.map +1 -0
  60. package/dist/injected-script/index.mjs +7 -0
  61. package/dist/injected-script/visibility.d.ts +2 -0
  62. package/dist/injected-script/visibility.d.ts.map +1 -0
  63. package/dist/injected-script/visibility.js +66 -0
  64. package/dist/injected-script/visibility.js.map +1 -0
  65. package/dist/injected-script/visibility.mjs +32 -0
  66. package/dist/injected-script/visibility.mjs.map +1 -0
  67. package/dist/injected-script/webdriver.d.ts +2 -0
  68. package/dist/injected-script/webdriver.d.ts.map +1 -0
  69. package/dist/injected-script/webdriver.js +71 -0
  70. package/dist/injected-script/webdriver.js.map +1 -0
  71. package/dist/injected-script/webdriver.mjs +37 -0
  72. package/dist/injected-script/webdriver.mjs.map +1 -0
  73. package/dist/polyfills/index.d.ts +2 -0
  74. package/dist/polyfills/index.d.ts.map +1 -0
  75. package/dist/polyfills/index.js +66 -0
  76. package/dist/polyfills/index.js.map +1 -0
  77. package/dist/polyfills/index.mjs +5 -0
  78. package/dist/polyfills/withResolvers.d.ts +2 -0
  79. package/dist/polyfills/withResolvers.d.ts.map +1 -0
  80. package/dist/polyfills/withResolvers.js +37 -0
  81. package/dist/polyfills/withResolvers.js.map +1 -0
  82. package/dist/polyfills/withResolvers.mjs +19 -0
  83. package/dist/polyfills/withResolvers.mjs.map +1 -0
  84. package/dist/tabs/dialog.d.ts +14 -0
  85. package/dist/tabs/dialog.d.ts.map +1 -0
  86. package/dist/tabs/dialog.js +175 -0
  87. package/dist/tabs/dialog.js.map +1 -0
  88. package/dist/tabs/dialog.mjs +141 -0
  89. package/dist/tabs/dialog.mjs.map +1 -0
  90. package/dist/tabs/index.d.ts +3 -0
  91. package/dist/tabs/index.d.ts.map +1 -0
  92. package/dist/tabs/index.js +46 -0
  93. package/dist/tabs/index.js.map +1 -0
  94. package/dist/tabs/index.mjs +7 -0
  95. package/dist/tabs/tab.d.ts +50 -0
  96. package/dist/tabs/tab.d.ts.map +1 -0
  97. package/dist/tabs/tab.js +579 -0
  98. package/dist/tabs/tab.js.map +1 -0
  99. package/dist/tabs/tab.mjs +545 -0
  100. package/dist/tabs/tab.mjs.map +1 -0
  101. package/dist/tabs/tabs.d.ts +21 -0
  102. package/dist/tabs/tabs.d.ts.map +1 -0
  103. package/dist/tabs/tabs.js +458 -0
  104. package/dist/tabs/tabs.js.map +1 -0
  105. package/dist/tabs/tabs.mjs +424 -0
  106. package/dist/tabs/tabs.mjs.map +1 -0
  107. package/dist/types/actions.d.ts +26 -0
  108. package/dist/types/actions.d.ts.map +1 -0
  109. package/dist/types/actions.js +24 -0
  110. package/dist/types/actions.js.map +1 -0
  111. package/dist/types/browser.d.ts +7 -0
  112. package/dist/types/browser.d.ts.map +1 -0
  113. package/dist/types/browser.js +24 -0
  114. package/dist/types/browser.js.map +1 -0
  115. package/dist/types/browser.mjs +4 -0
  116. package/dist/types/dialog.d.ts +7 -0
  117. package/dist/types/dialog.d.ts.map +1 -0
  118. package/dist/types/dialog.js +24 -0
  119. package/dist/types/dialog.js.map +1 -0
  120. package/dist/types/dialog.mjs +4 -0
  121. package/dist/types/env.d.ts +8 -0
  122. package/dist/types/env.d.ts.map +1 -0
  123. package/dist/{types.js → types/env.js} +1 -1
  124. package/dist/types/env.js.map +1 -0
  125. package/dist/types/env.mjs +4 -0
  126. package/dist/types/index.d.ts +6 -0
  127. package/dist/types/index.d.ts.map +1 -0
  128. package/dist/types/index.js +102 -0
  129. package/dist/types/index.js.map +1 -0
  130. package/dist/types/index.mjs +9 -0
  131. package/dist/types/tabs.d.ts +98 -0
  132. package/dist/types/tabs.d.ts.map +1 -0
  133. package/dist/types/tabs.js +48 -0
  134. package/dist/types/tabs.js.map +1 -0
  135. package/dist/types/tabs.mjs +14 -0
  136. package/dist/types/tabs.mjs.map +1 -0
  137. package/dist/utils/iife.d.ts +2 -0
  138. package/dist/utils/iife.d.ts.map +1 -0
  139. package/dist/utils/iife.js +48 -0
  140. package/dist/utils/iife.js.map +1 -0
  141. package/dist/utils/iife.mjs +14 -0
  142. package/dist/utils/iife.mjs.map +1 -0
  143. package/dist/utils/index.d.ts +4 -0
  144. package/dist/utils/index.d.ts.map +1 -0
  145. package/dist/utils/index.js +50 -0
  146. package/dist/utils/index.js.map +1 -0
  147. package/dist/utils/index.mjs +8 -0
  148. package/dist/utils/mutex.d.ts +21 -0
  149. package/dist/utils/mutex.d.ts.map +1 -0
  150. package/dist/utils/mutex.js +133 -0
  151. package/dist/utils/mutex.js.map +1 -0
  152. package/dist/utils/mutex.mjs +99 -0
  153. package/dist/utils/mutex.mjs.map +1 -0
  154. package/dist/utils/url.d.ts +7 -0
  155. package/dist/utils/url.d.ts.map +1 -0
  156. package/dist/utils/url.js +76 -0
  157. package/dist/utils/url.js.map +1 -0
  158. package/dist/utils/url.mjs +42 -0
  159. package/dist/utils/url.mjs.map +1 -0
  160. package/package.json +21 -13
  161. package/dist/base-browser.d.ts +0 -94
  162. package/dist/base-browser.d.ts.map +0 -1
  163. package/dist/base-browser.js +0 -189
  164. package/dist/base-browser.js.map +0 -1
  165. package/dist/base-browser.mjs +0 -155
  166. package/dist/base-browser.mjs.map +0 -1
  167. package/dist/index.d.ts +0 -15
  168. package/dist/index.d.ts.map +0 -1
  169. package/dist/index.js.map +0 -1
  170. package/dist/index.mjs +0 -8
  171. package/dist/local-browser.d.ts +0 -19
  172. package/dist/local-browser.d.ts.map +0 -1
  173. package/dist/local-browser.js +0 -134
  174. package/dist/local-browser.js.map +0 -1
  175. package/dist/local-browser.mjs +0 -100
  176. package/dist/local-browser.mjs.map +0 -1
  177. package/dist/remote-browser.d.ts +0 -49
  178. package/dist/remote-browser.d.ts.map +0 -1
  179. package/dist/remote-browser.js +0 -89
  180. package/dist/remote-browser.js.map +0 -1
  181. package/dist/remote-browser.mjs +0 -55
  182. package/dist/remote-browser.mjs.map +0 -1
  183. package/dist/types.d.ts +0 -158
  184. package/dist/types.d.ts.map +0 -1
  185. package/dist/types.js.map +0 -1
  186. /package/dist/{types.mjs → types/actions.mjs} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions/keyboard.js","sources":["webpack://@agent-infra/browser/webpack/runtime/compat_get_default_export","webpack://@agent-infra/browser/webpack/runtime/define_property_getters","webpack://@agent-infra/browser/webpack/runtime/has_own_property","webpack://@agent-infra/browser/webpack/runtime/make_namespace_object","webpack://@agent-infra/browser/./src/actions/keyboard.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};","/*\n * Copyright (c) 2025 Bytedance, Inc. and its affiliates.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport delay from 'delay';\n\nimport {\n MAC_SYSTEM_HOTKEY_MAP,\n KEY_ABBR_TO_STANDARD_MAP,\n KEY_LOW_TO_STANDARD_MAP,\n} from './key-map';\n\nimport type { KeyInput, Page } from 'puppeteer-core';\nimport type {\n EnvInfo,\n DialogMetaInfo,\n KeyboardOptions,\n KeyOrHotKeyInput,\n ActionResult,\n} from '../types';\nimport type { TabDialog } from '../tabs/dialog';\n\nexport class Keyboard {\n #page: Page;\n #env: EnvInfo;\n #dialog: TabDialog;\n\n constructor(page: Page, dialog: TabDialog, env: EnvInfo) {\n this.#page = page;\n this.#dialog = dialog;\n this.#env = env;\n }\n\n /**\n * Enhance puppeteer's [keyboard.press()](https://pptr.dev/api/puppeteer.keyboard.press) to support combination hotkeys.\n */\n async press(\n key: KeyOrHotKeyInput,\n options: KeyboardOptions = {},\n ): Promise<ActionResult> {\n if (this.#dialog.isOpen) {\n return this.#buildDialogResponse('press');\n }\n\n const formattedHotkey = this.#formatHotkey(key);\n\n if (this.#env.osName === 'macOS' && this.#env.browserName === 'Chrome') {\n const success = await this.#macOSCDPHotKey(formattedHotkey, options);\n if (success) {\n return { success: true };\n }\n }\n\n // default behavior: press keys one by one\n for (const key of formattedHotkey) {\n await this.#page.keyboard.down(key);\n }\n await delay(options.delay ?? 0);\n for (const key of formattedHotkey.reverse()) {\n await this.#page.keyboard.up(key);\n }\n\n return { success: true };\n }\n\n /**\n * Enhance puppeteer's [keyboard.down()](https://pptr.dev/api/puppeteer.keyboard.down) to support combination hotkeys.\n */\n async down(\n key: KeyOrHotKeyInput,\n options: KeyboardOptions = {},\n ): Promise<ActionResult> {\n if (this.#dialog.isOpen) {\n return this.#buildDialogResponse('down');\n }\n\n const formattedHotkey = this.#formatHotkey(key);\n\n if (this.#env.osName === 'macOS' && this.#env.browserName === 'Chrome') {\n const success = await this.#macOSCDPHotKey(formattedHotkey, options);\n if (success) {\n return { success: true };\n }\n }\n\n for (const key of formattedHotkey) {\n await this.#page.keyboard.down(key);\n }\n\n return { success: true };\n }\n\n /**\n * Enhance puppeteer's [keyboard.up()](https://pptr.dev/api/puppeteer.keyboard.up) to support combination hotkeys.\n */\n async up(key: KeyOrHotKeyInput): Promise<ActionResult> {\n if (this.#dialog.isOpen) {\n return this.#buildDialogResponse('up');\n }\n\n const formattedHotkey = this.#formatHotkey(key);\n\n for (const key of formattedHotkey.reverse()) {\n await this.#page.keyboard.up(key);\n }\n\n return { success: true };\n }\n\n async type(\n text: string,\n options: KeyboardOptions = {},\n ): Promise<ActionResult> {\n if (this.#dialog.isOpen) {\n return this.#buildDialogResponse('type');\n }\n\n if (text.length < 15 && options.delay) {\n await this.#page.keyboard.type(text, options);\n } else {\n await this.#page.keyboard.sendCharacter(text);\n }\n\n return { success: true };\n }\n\n /**\n * Format the hotkey string into an array of KeyInput.\n *\n * - example1: 'ctrl+c' -> ['Control', 'C']\n * - example2: 'control+c' -> ['Control', 'C']\n * - example3: 'Control+C' -> ['Control', 'C']\n */\n #formatHotkey(hotkey: string): KeyInput[] {\n const lowerCaseHotkey = hotkey.toLowerCase();\n const keys = lowerCaseHotkey.split(/[\\s+]+/);\n\n const formattedKeys = keys.map((key) => {\n if (KEY_ABBR_TO_STANDARD_MAP[key]) {\n return KEY_ABBR_TO_STANDARD_MAP[key];\n }\n // Lowercase key to standard key\n else if (KEY_LOW_TO_STANDARD_MAP[key]) {\n return KEY_LOW_TO_STANDARD_MAP[key];\n }\n // Unsupported key\n else {\n throw new Error('Unsupported key: ' + key);\n }\n });\n\n return formattedKeys;\n }\n\n /**\n * adapt for common macOS system and chrome hotkeys\n *\n * see issues: https://github.com/bytedance/UI-TARS-desktop/pull/560\n *\n * example: 'Ctrl+C' -> CDP: { key: 'KeyC', commands: 'Copy' }\n */\n async #macOSCDPHotKey(\n keys: KeyInput[],\n options: Readonly<KeyboardOptions>,\n ): Promise<boolean> {\n const hotkey = keys\n .map((key) => {\n if (key === 'Control' || key === 'Meta') {\n return 'CorM';\n }\n return key;\n })\n .join('+');\n\n const command = MAC_SYSTEM_HOTKEY_MAP.get(hotkey);\n\n if (command) {\n await this.#page.keyboard.down(command.key, {\n commands: [command.commands],\n });\n await delay(options.delay ?? 0);\n await this.#page.keyboard.up(command.key);\n\n return true;\n }\n\n return false;\n }\n\n #buildDialogResponse(type: string): ActionResult {\n return {\n success: false,\n message: `Cannot perform keyboard.${type}() operation because there is a dialog on the current page.`,\n detail: this.#dialog.meta as DialogMetaInfo,\n };\n }\n}\n"],"names":["__webpack_require__","module","getter","definition","key","Object","obj","prop","Symbol","_page","_env","_dialog","formatHotkey","_macOSCDPHotKey","buildDialogResponse","Keyboard","options","formattedHotkey","success","macOSCDPHotKey","delay","text","page","dialog","env","hotkey","lowerCaseHotkey","keys","formattedKeys","KEY_ABBR_TO_STANDARD_MAP","KEY_LOW_TO_STANDARD_MAP","Error","command","MAC_SYSTEM_HOTKEY_MAP","type"],"mappings":"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"}
@@ -0,0 +1,152 @@
1
+ /**
2
+ * Copyright (c) 2025 Bytedance, Inc. and its affiliates.
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+ import delay from "delay";
6
+ import { KEY_ABBR_TO_STANDARD_MAP, KEY_LOW_TO_STANDARD_MAP, MAC_SYSTEM_HOTKEY_MAP } from "./key-map.mjs";
7
+ function _check_private_redeclaration(obj, privateCollection) {
8
+ if (privateCollection.has(obj)) throw new TypeError("Cannot initialize the same private elements twice on an object");
9
+ }
10
+ function _class_apply_descriptor_get(receiver, descriptor) {
11
+ if (descriptor.get) return descriptor.get.call(receiver);
12
+ return descriptor.value;
13
+ }
14
+ function _class_apply_descriptor_set(receiver, descriptor, value) {
15
+ if (descriptor.set) descriptor.set.call(receiver, value);
16
+ else {
17
+ if (!descriptor.writable) throw new TypeError("attempted to set read only private field");
18
+ descriptor.value = value;
19
+ }
20
+ }
21
+ function _class_extract_field_descriptor(receiver, privateMap, action) {
22
+ if (!privateMap.has(receiver)) throw new TypeError("attempted to " + action + " private field on non-instance");
23
+ return privateMap.get(receiver);
24
+ }
25
+ function _class_private_field_get(receiver, privateMap) {
26
+ var descriptor = _class_extract_field_descriptor(receiver, privateMap, "get");
27
+ return _class_apply_descriptor_get(receiver, descriptor);
28
+ }
29
+ function _class_private_field_init(obj, privateMap, value) {
30
+ _check_private_redeclaration(obj, privateMap);
31
+ privateMap.set(obj, value);
32
+ }
33
+ function _class_private_field_set(receiver, privateMap, value) {
34
+ var descriptor = _class_extract_field_descriptor(receiver, privateMap, "set");
35
+ _class_apply_descriptor_set(receiver, descriptor, value);
36
+ return value;
37
+ }
38
+ function _class_private_method_get(receiver, privateSet, fn) {
39
+ if (!privateSet.has(receiver)) throw new TypeError("attempted to get private field on non-instance");
40
+ return fn;
41
+ }
42
+ function _class_private_method_init(obj, privateSet) {
43
+ _check_private_redeclaration(obj, privateSet);
44
+ privateSet.add(obj);
45
+ }
46
+ var _page = /*#__PURE__*/ new WeakMap(), _env = /*#__PURE__*/ new WeakMap(), _dialog = /*#__PURE__*/ new WeakMap(), _formatHotkey = /*#__PURE__*/ new WeakSet(), _macOSCDPHotKey = /*#__PURE__*/ new WeakSet(), _buildDialogResponse = /*#__PURE__*/ new WeakSet();
47
+ class Keyboard {
48
+ async press(key, options = {}) {
49
+ if (_class_private_field_get(this, _dialog).isOpen) return _class_private_method_get(this, _buildDialogResponse, buildDialogResponse).call(this, 'press');
50
+ const formattedHotkey = _class_private_method_get(this, _formatHotkey, formatHotkey).call(this, key);
51
+ if ('macOS' === _class_private_field_get(this, _env).osName && 'Chrome' === _class_private_field_get(this, _env).browserName) {
52
+ const success = await _class_private_method_get(this, _macOSCDPHotKey, macOSCDPHotKey).call(this, formattedHotkey, options);
53
+ if (success) return {
54
+ success: true
55
+ };
56
+ }
57
+ for (const key of formattedHotkey)await _class_private_field_get(this, _page).keyboard.down(key);
58
+ await delay(options.delay ?? 0);
59
+ for (const key of formattedHotkey.reverse())await _class_private_field_get(this, _page).keyboard.up(key);
60
+ return {
61
+ success: true
62
+ };
63
+ }
64
+ async down(key, options = {}) {
65
+ if (_class_private_field_get(this, _dialog).isOpen) return _class_private_method_get(this, _buildDialogResponse, buildDialogResponse).call(this, 'down');
66
+ const formattedHotkey = _class_private_method_get(this, _formatHotkey, formatHotkey).call(this, key);
67
+ if ('macOS' === _class_private_field_get(this, _env).osName && 'Chrome' === _class_private_field_get(this, _env).browserName) {
68
+ const success = await _class_private_method_get(this, _macOSCDPHotKey, macOSCDPHotKey).call(this, formattedHotkey, options);
69
+ if (success) return {
70
+ success: true
71
+ };
72
+ }
73
+ for (const key of formattedHotkey)await _class_private_field_get(this, _page).keyboard.down(key);
74
+ return {
75
+ success: true
76
+ };
77
+ }
78
+ async up(key) {
79
+ if (_class_private_field_get(this, _dialog).isOpen) return _class_private_method_get(this, _buildDialogResponse, buildDialogResponse).call(this, 'up');
80
+ const formattedHotkey = _class_private_method_get(this, _formatHotkey, formatHotkey).call(this, key);
81
+ for (const key of formattedHotkey.reverse())await _class_private_field_get(this, _page).keyboard.up(key);
82
+ return {
83
+ success: true
84
+ };
85
+ }
86
+ async type(text, options = {}) {
87
+ if (_class_private_field_get(this, _dialog).isOpen) return _class_private_method_get(this, _buildDialogResponse, buildDialogResponse).call(this, 'type');
88
+ if (text.length < 15 && options.delay) await _class_private_field_get(this, _page).keyboard.type(text, options);
89
+ else await _class_private_field_get(this, _page).keyboard.sendCharacter(text);
90
+ return {
91
+ success: true
92
+ };
93
+ }
94
+ constructor(page, dialog, env){
95
+ _class_private_method_init(this, _formatHotkey);
96
+ _class_private_method_init(this, _macOSCDPHotKey);
97
+ _class_private_method_init(this, _buildDialogResponse);
98
+ _class_private_field_init(this, _page, {
99
+ writable: true,
100
+ value: void 0
101
+ });
102
+ _class_private_field_init(this, _env, {
103
+ writable: true,
104
+ value: void 0
105
+ });
106
+ _class_private_field_init(this, _dialog, {
107
+ writable: true,
108
+ value: void 0
109
+ });
110
+ _class_private_field_set(this, _page, page);
111
+ _class_private_field_set(this, _dialog, dialog);
112
+ _class_private_field_set(this, _env, env);
113
+ }
114
+ }
115
+ function formatHotkey(hotkey) {
116
+ const lowerCaseHotkey = hotkey.toLowerCase();
117
+ const keys = lowerCaseHotkey.split(/[\s+]+/);
118
+ const formattedKeys = keys.map((key)=>{
119
+ if (KEY_ABBR_TO_STANDARD_MAP[key]) return KEY_ABBR_TO_STANDARD_MAP[key];
120
+ if (KEY_LOW_TO_STANDARD_MAP[key]) return KEY_LOW_TO_STANDARD_MAP[key];
121
+ throw new Error('Unsupported key: ' + key);
122
+ });
123
+ return formattedKeys;
124
+ }
125
+ async function macOSCDPHotKey(keys, options) {
126
+ const hotkey = keys.map((key)=>{
127
+ if ('Control' === key || 'Meta' === key) return 'CorM';
128
+ return key;
129
+ }).join('+');
130
+ const command = MAC_SYSTEM_HOTKEY_MAP.get(hotkey);
131
+ if (command) {
132
+ await _class_private_field_get(this, _page).keyboard.down(command.key, {
133
+ commands: [
134
+ command.commands
135
+ ]
136
+ });
137
+ await delay(options.delay ?? 0);
138
+ await _class_private_field_get(this, _page).keyboard.up(command.key);
139
+ return true;
140
+ }
141
+ return false;
142
+ }
143
+ function buildDialogResponse(type) {
144
+ return {
145
+ success: false,
146
+ message: `Cannot perform keyboard.${type}() operation because there is a dialog on the current page.`,
147
+ detail: _class_private_field_get(this, _dialog).meta
148
+ };
149
+ }
150
+ export { Keyboard };
151
+
152
+ //# sourceMappingURL=keyboard.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions/keyboard.mjs","sources":["webpack://@agent-infra/browser/./src/actions/keyboard.ts"],"sourcesContent":["/*\n * Copyright (c) 2025 Bytedance, Inc. and its affiliates.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport delay from 'delay';\n\nimport {\n MAC_SYSTEM_HOTKEY_MAP,\n KEY_ABBR_TO_STANDARD_MAP,\n KEY_LOW_TO_STANDARD_MAP,\n} from './key-map';\n\nimport type { KeyInput, Page } from 'puppeteer-core';\nimport type {\n EnvInfo,\n DialogMetaInfo,\n KeyboardOptions,\n KeyOrHotKeyInput,\n ActionResult,\n} from '../types';\nimport type { TabDialog } from '../tabs/dialog';\n\nexport class Keyboard {\n #page: Page;\n #env: EnvInfo;\n #dialog: TabDialog;\n\n constructor(page: Page, dialog: TabDialog, env: EnvInfo) {\n this.#page = page;\n this.#dialog = dialog;\n this.#env = env;\n }\n\n /**\n * Enhance puppeteer's [keyboard.press()](https://pptr.dev/api/puppeteer.keyboard.press) to support combination hotkeys.\n */\n async press(\n key: KeyOrHotKeyInput,\n options: KeyboardOptions = {},\n ): Promise<ActionResult> {\n if (this.#dialog.isOpen) {\n return this.#buildDialogResponse('press');\n }\n\n const formattedHotkey = this.#formatHotkey(key);\n\n if (this.#env.osName === 'macOS' && this.#env.browserName === 'Chrome') {\n const success = await this.#macOSCDPHotKey(formattedHotkey, options);\n if (success) {\n return { success: true };\n }\n }\n\n // default behavior: press keys one by one\n for (const key of formattedHotkey) {\n await this.#page.keyboard.down(key);\n }\n await delay(options.delay ?? 0);\n for (const key of formattedHotkey.reverse()) {\n await this.#page.keyboard.up(key);\n }\n\n return { success: true };\n }\n\n /**\n * Enhance puppeteer's [keyboard.down()](https://pptr.dev/api/puppeteer.keyboard.down) to support combination hotkeys.\n */\n async down(\n key: KeyOrHotKeyInput,\n options: KeyboardOptions = {},\n ): Promise<ActionResult> {\n if (this.#dialog.isOpen) {\n return this.#buildDialogResponse('down');\n }\n\n const formattedHotkey = this.#formatHotkey(key);\n\n if (this.#env.osName === 'macOS' && this.#env.browserName === 'Chrome') {\n const success = await this.#macOSCDPHotKey(formattedHotkey, options);\n if (success) {\n return { success: true };\n }\n }\n\n for (const key of formattedHotkey) {\n await this.#page.keyboard.down(key);\n }\n\n return { success: true };\n }\n\n /**\n * Enhance puppeteer's [keyboard.up()](https://pptr.dev/api/puppeteer.keyboard.up) to support combination hotkeys.\n */\n async up(key: KeyOrHotKeyInput): Promise<ActionResult> {\n if (this.#dialog.isOpen) {\n return this.#buildDialogResponse('up');\n }\n\n const formattedHotkey = this.#formatHotkey(key);\n\n for (const key of formattedHotkey.reverse()) {\n await this.#page.keyboard.up(key);\n }\n\n return { success: true };\n }\n\n async type(\n text: string,\n options: KeyboardOptions = {},\n ): Promise<ActionResult> {\n if (this.#dialog.isOpen) {\n return this.#buildDialogResponse('type');\n }\n\n if (text.length < 15 && options.delay) {\n await this.#page.keyboard.type(text, options);\n } else {\n await this.#page.keyboard.sendCharacter(text);\n }\n\n return { success: true };\n }\n\n /**\n * Format the hotkey string into an array of KeyInput.\n *\n * - example1: 'ctrl+c' -> ['Control', 'C']\n * - example2: 'control+c' -> ['Control', 'C']\n * - example3: 'Control+C' -> ['Control', 'C']\n */\n #formatHotkey(hotkey: string): KeyInput[] {\n const lowerCaseHotkey = hotkey.toLowerCase();\n const keys = lowerCaseHotkey.split(/[\\s+]+/);\n\n const formattedKeys = keys.map((key) => {\n if (KEY_ABBR_TO_STANDARD_MAP[key]) {\n return KEY_ABBR_TO_STANDARD_MAP[key];\n }\n // Lowercase key to standard key\n else if (KEY_LOW_TO_STANDARD_MAP[key]) {\n return KEY_LOW_TO_STANDARD_MAP[key];\n }\n // Unsupported key\n else {\n throw new Error('Unsupported key: ' + key);\n }\n });\n\n return formattedKeys;\n }\n\n /**\n * adapt for common macOS system and chrome hotkeys\n *\n * see issues: https://github.com/bytedance/UI-TARS-desktop/pull/560\n *\n * example: 'Ctrl+C' -> CDP: { key: 'KeyC', commands: 'Copy' }\n */\n async #macOSCDPHotKey(\n keys: KeyInput[],\n options: Readonly<KeyboardOptions>,\n ): Promise<boolean> {\n const hotkey = keys\n .map((key) => {\n if (key === 'Control' || key === 'Meta') {\n return 'CorM';\n }\n return key;\n })\n .join('+');\n\n const command = MAC_SYSTEM_HOTKEY_MAP.get(hotkey);\n\n if (command) {\n await this.#page.keyboard.down(command.key, {\n commands: [command.commands],\n });\n await delay(options.delay ?? 0);\n await this.#page.keyboard.up(command.key);\n\n return true;\n }\n\n return false;\n }\n\n #buildDialogResponse(type: string): ActionResult {\n return {\n success: false,\n message: `Cannot perform keyboard.${type}() operation because there is a dialog on the current page.`,\n detail: this.#dialog.meta as DialogMetaInfo,\n };\n }\n}\n"],"names":["_page","_env","_dialog","formatHotkey","_macOSCDPHotKey","buildDialogResponse","Keyboard","key","options","formattedHotkey","success","macOSCDPHotKey","delay","text","page","dialog","env","hotkey","lowerCaseHotkey","keys","formattedKeys","KEY_ABBR_TO_STANDARD_MAP","KEY_LOW_TO_STANDARD_MAP","Error","command","MAC_SYSTEM_HOTKEY_MAP","type"],"mappings":";;;;;;AAGC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAqBCA,QAAAA,WAAAA,GAAAA,IAAAA,WACAC,OAAAA,WAAAA,GAAAA,IAAAA,WACAC,UAAAA,WAAAA,GAAAA,IAAAA,WA4GAC,gBAAAA,WAAAA,GAAAA,IAAAA,WA4BMC,kBAAAA,WAAAA,GAAAA,IAAAA,WA4BNC,uBAAAA,WAAAA,GAAAA,IAAAA;AAvKK,MAAMC;IAcX,MAAM,MACJC,GAAqB,EACrBC,UAA2B,CAAC,CAAC,EACN;QACvB,IAAI,6BAAI,EAACN,SAAQ,MAAM,EACrB,OAAO,8BAAI,EAACG,sBAAAA,qBAAAA,IAAAA,CAAL,IAAI,EAAsB;QAGnC,MAAMI,kBAAkB,8BAAI,EAACN,eAAAA,cAAAA,IAAAA,CAAL,IAAI,EAAeI;QAE3C,IAAI,AAAqB,YAArB,6BAAI,EAACN,MAAK,MAAM,IAAgB,AAA0B,aAA1B,6BAAI,EAACA,MAAK,WAAW,EAAe;YACtE,MAAMS,UAAU,MAAM,8BAAI,EAACC,iBAAAA,gBAAAA,IAAAA,CAAL,IAAI,EAAiBF,iBAAiBD;YAC5D,IAAIE,SACF,OAAO;gBAAE,SAAS;YAAK;QAE3B;QAGA,KAAK,MAAMH,OAAOE,gBAChB,MAAM,6BAAI,EAACT,OAAM,QAAQ,CAAC,IAAI,CAACO;QAEjC,MAAMK,MAAMJ,QAAQ,KAAK,IAAI;QAC7B,KAAK,MAAMD,OAAOE,gBAAgB,OAAO,GACvC,MAAM,6BAAI,EAACT,OAAM,QAAQ,CAAC,EAAE,CAACO;QAG/B,OAAO;YAAE,SAAS;QAAK;IACzB;IAKA,MAAM,KACJA,GAAqB,EACrBC,UAA2B,CAAC,CAAC,EACN;QACvB,IAAI,6BAAI,EAACN,SAAQ,MAAM,EACrB,OAAO,8BAAI,EAACG,sBAAAA,qBAAAA,IAAAA,CAAL,IAAI,EAAsB;QAGnC,MAAMI,kBAAkB,8BAAI,EAACN,eAAAA,cAAAA,IAAAA,CAAL,IAAI,EAAeI;QAE3C,IAAI,AAAqB,YAArB,6BAAI,EAACN,MAAK,MAAM,IAAgB,AAA0B,aAA1B,6BAAI,EAACA,MAAK,WAAW,EAAe;YACtE,MAAMS,UAAU,MAAM,8BAAI,EAACC,iBAAAA,gBAAAA,IAAAA,CAAL,IAAI,EAAiBF,iBAAiBD;YAC5D,IAAIE,SACF,OAAO;gBAAE,SAAS;YAAK;QAE3B;QAEA,KAAK,MAAMH,OAAOE,gBAChB,MAAM,6BAAI,EAACT,OAAM,QAAQ,CAAC,IAAI,CAACO;QAGjC,OAAO;YAAE,SAAS;QAAK;IACzB;IAKA,MAAM,GAAGA,GAAqB,EAAyB;QACrD,IAAI,6BAAI,EAACL,SAAQ,MAAM,EACrB,OAAO,8BAAI,EAACG,sBAAAA,qBAAAA,IAAAA,CAAL,IAAI,EAAsB;QAGnC,MAAMI,kBAAkB,8BAAI,EAACN,eAAAA,cAAAA,IAAAA,CAAL,IAAI,EAAeI;QAE3C,KAAK,MAAMA,OAAOE,gBAAgB,OAAO,GACvC,MAAM,6BAAI,EAACT,OAAM,QAAQ,CAAC,EAAE,CAACO;QAG/B,OAAO;YAAE,SAAS;QAAK;IACzB;IAEA,MAAM,KACJM,IAAY,EACZL,UAA2B,CAAC,CAAC,EACN;QACvB,IAAI,6BAAI,EAACN,SAAQ,MAAM,EACrB,OAAO,8BAAI,EAACG,sBAAAA,qBAAAA,IAAAA,CAAL,IAAI,EAAsB;QAGnC,IAAIQ,KAAK,MAAM,GAAG,MAAML,QAAQ,KAAK,EACnC,MAAM,6BAAI,EAACR,OAAM,QAAQ,CAAC,IAAI,CAACa,MAAML;aAErC,MAAM,6BAAI,EAACR,OAAM,QAAQ,CAAC,aAAa,CAACa;QAG1C,OAAO;YAAE,SAAS;QAAK;IACzB;IAjGA,YAAYC,IAAU,EAAEC,MAAiB,EAAEC,GAAY,CAAE;QA0GzDb,2BAAAA,IAAAA,EAAAA;QA4BAQ,2BAAAA,IAAAA,EAAMP;QA4BNC,2BAAAA,IAAAA,EAAAA;QAtKAL,0BAAAA,IAAAA,EAAAA,OAAAA;;mBAAAA,KAAAA;;QACAC,0BAAAA,IAAAA,EAAAA,MAAAA;;mBAAAA,KAAAA;;QACAC,0BAAAA,IAAAA,EAAAA,SAAAA;;mBAAAA,KAAAA;;uCAGOF,OAAQc;uCACRZ,SAAUa;uCACVd,MAAOe;IACd;AAqKF;AA/DEb,SAAAA,aAAcc,MAAc;IAC1B,MAAMC,kBAAkBD,OAAO,WAAW;IAC1C,MAAME,OAAOD,gBAAgB,KAAK,CAAC;IAEnC,MAAME,gBAAgBD,KAAK,GAAG,CAAC,CAACZ;QAC9B,IAAIc,wBAAwB,CAACd,IAAI,EAC/B,OAAOc,wBAAwB,CAACd,IAAI;QAGjC,IAAIe,uBAAuB,CAACf,IAAI,EACnC,OAAOe,uBAAuB,CAACf,IAAI;QAInC,MAAM,IAAIgB,MAAM,sBAAsBhB;IAE1C;IAEA,OAAOa;AACT;AASAT,eAAAA,eACEQ,IAAgB,EAChBX,OAAkC;IAElC,MAAMS,SAASE,KACZ,GAAG,CAAC,CAACZ;QACJ,IAAIA,AAAQ,cAARA,OAAqBA,AAAQ,WAARA,KACvB,OAAO;QAET,OAAOA;IACT,GACC,IAAI,CAAC;IAER,MAAMiB,UAAUC,sBAAsB,GAAG,CAACR;IAE1C,IAAIO,SAAS;QACX,MAAM,6BAAI,EAACxB,OAAM,QAAQ,CAAC,IAAI,CAACwB,QAAQ,GAAG,EAAE;YAC1C,UAAU;gBAACA,QAAQ,QAAQ;aAAC;QAC9B;QACA,MAAMZ,MAAMJ,QAAQ,KAAK,IAAI;QAC7B,MAAM,6BAAI,EAACR,OAAM,QAAQ,CAAC,EAAE,CAACwB,QAAQ,GAAG;QAExC,OAAO;IACT;IAEA,OAAO;AACT;AAEAnB,SAAAA,oBAAqBqB,IAAY;IAC/B,OAAO;QACL,SAAS;QACT,SAAS,CAAC,wBAAwB,EAAEA,KAAK,2DAA2D,CAAC;QACrG,QAAQ,6BAAI,EAACxB,SAAQ,IAAI;IAC3B;AACF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=keyboard.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyboard.test.d.ts","sourceRoot":"","sources":["../../src/actions/keyboard.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,19 @@
1
+ import type { Page, Point, MouseClickOptions, MouseMoveOptions } from 'puppeteer-core';
2
+ import { ScrollDirection, ActionResult } from '../types';
3
+ import type { TabDialog } from '../tabs/dialog';
4
+ export declare class Mouse {
5
+ #private;
6
+ constructor(page: Page, dialog: TabDialog);
7
+ get vision(): VisionMouse;
8
+ }
9
+ export declare class VisionMouse {
10
+ #private;
11
+ constructor(page: Page, dialog: TabDialog);
12
+ click(x: number, y: number, options?: Omit<MouseClickOptions, 'clickCount'>): Promise<ActionResult>;
13
+ move(x: number, y: number, options?: MouseMoveOptions): Promise<ActionResult>;
14
+ drag(start: Point, end: Point, options?: {
15
+ delay?: number;
16
+ }): Promise<ActionResult>;
17
+ scroll(direction: ScrollDirection, delta: number): Promise<ActionResult>;
18
+ }
19
+ //# sourceMappingURL=mouse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mouse.d.ts","sourceRoot":"","sources":["../../src/actions/mouse.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,IAAI,EACJ,KAAK,EACL,iBAAiB,EACjB,gBAAgB,EACjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAEzD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,qBAAa,KAAK;;gBAGJ,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS;IAIzC,IAAI,MAAM,gBAET;CAMF;AAED,qBAAa,WAAW;;gBAIV,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS;IAKnC,KAAK,CACT,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,OAAO,GAAE,IAAI,CAAC,iBAAiB,EAAE,YAAY,CAAM,GAClD,OAAO,CAAC,YAAY,CAAC;IAclB,IAAI,CACR,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,YAAY,CAAC;IAYlB,IAAI,CACR,KAAK,EAAE,KAAK,EACZ,GAAG,EAAE,KAAK,EACV,OAAO,GAAE;QACP,KAAK,CAAC,EAAE,MAAM,CAAC;KACX,GACL,OAAO,CAAC,YAAY,CAAC;IAYlB,MAAM,CACV,SAAS,EAAE,eAAe,EAC1B,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,YAAY,CAAC;CAkCzB"}
@@ -0,0 +1,173 @@
1
+ /**
2
+ * Copyright (c) 2025 Bytedance, Inc. and its affiliates.
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+ "use strict";
6
+ var __webpack_require__ = {};
7
+ (()=>{
8
+ __webpack_require__.d = (exports1, definition)=>{
9
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
10
+ enumerable: true,
11
+ get: definition[key]
12
+ });
13
+ };
14
+ })();
15
+ (()=>{
16
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
17
+ })();
18
+ (()=>{
19
+ __webpack_require__.r = (exports1)=>{
20
+ if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
21
+ value: 'Module'
22
+ });
23
+ Object.defineProperty(exports1, '__esModule', {
24
+ value: true
25
+ });
26
+ };
27
+ })();
28
+ var __webpack_exports__ = {};
29
+ __webpack_require__.r(__webpack_exports__);
30
+ __webpack_require__.d(__webpack_exports__, {
31
+ Mouse: ()=>Mouse,
32
+ VisionMouse: ()=>VisionMouse
33
+ });
34
+ function _check_private_redeclaration(obj, privateCollection) {
35
+ if (privateCollection.has(obj)) throw new TypeError("Cannot initialize the same private elements twice on an object");
36
+ }
37
+ function _class_apply_descriptor_get(receiver, descriptor) {
38
+ if (descriptor.get) return descriptor.get.call(receiver);
39
+ return descriptor.value;
40
+ }
41
+ function _class_apply_descriptor_set(receiver, descriptor, value) {
42
+ if (descriptor.set) descriptor.set.call(receiver, value);
43
+ else {
44
+ if (!descriptor.writable) throw new TypeError("attempted to set read only private field");
45
+ descriptor.value = value;
46
+ }
47
+ }
48
+ function _class_extract_field_descriptor(receiver, privateMap, action) {
49
+ if (!privateMap.has(receiver)) throw new TypeError("attempted to " + action + " private field on non-instance");
50
+ return privateMap.get(receiver);
51
+ }
52
+ function _class_private_field_get(receiver, privateMap) {
53
+ var descriptor = _class_extract_field_descriptor(receiver, privateMap, "get");
54
+ return _class_apply_descriptor_get(receiver, descriptor);
55
+ }
56
+ function _class_private_field_init(obj, privateMap, value) {
57
+ _check_private_redeclaration(obj, privateMap);
58
+ privateMap.set(obj, value);
59
+ }
60
+ function _class_private_field_set(receiver, privateMap, value) {
61
+ var descriptor = _class_extract_field_descriptor(receiver, privateMap, "set");
62
+ _class_apply_descriptor_set(receiver, descriptor, value);
63
+ return value;
64
+ }
65
+ function _class_private_method_get(receiver, privateSet, fn) {
66
+ if (!privateSet.has(receiver)) throw new TypeError("attempted to get private field on non-instance");
67
+ return fn;
68
+ }
69
+ function _class_private_method_init(obj, privateSet) {
70
+ _check_private_redeclaration(obj, privateSet);
71
+ privateSet.add(obj);
72
+ }
73
+ var _vision = /*#__PURE__*/ new WeakMap();
74
+ class Mouse {
75
+ get vision() {
76
+ return _class_private_field_get(this, _vision);
77
+ }
78
+ constructor(page, dialog){
79
+ _class_private_field_init(this, _vision, {
80
+ writable: true,
81
+ value: void 0
82
+ });
83
+ _class_private_field_set(this, _vision, new VisionMouse(page, dialog));
84
+ }
85
+ }
86
+ var _page = /*#__PURE__*/ new WeakMap(), _dialog = /*#__PURE__*/ new WeakMap(), _buildDialogResponse = /*#__PURE__*/ new WeakSet();
87
+ class VisionMouse {
88
+ async click(x, y, options = {}) {
89
+ if (_class_private_field_get(this, _dialog).isOpen) return _class_private_method_get(this, _buildDialogResponse, buildDialogResponse).call(this, 'click');
90
+ await _class_private_field_get(this, _page).mouse.click(x, y, {
91
+ count: options.count,
92
+ delay: options.delay,
93
+ button: options.button
94
+ });
95
+ return {
96
+ success: true
97
+ };
98
+ }
99
+ async move(x, y, options = {}) {
100
+ if (_class_private_field_get(this, _dialog).isOpen) return _class_private_method_get(this, _buildDialogResponse, buildDialogResponse).call(this, 'move');
101
+ await _class_private_field_get(this, _page).mouse.move(x, y, {
102
+ steps: options.steps
103
+ });
104
+ return {
105
+ success: true
106
+ };
107
+ }
108
+ async drag(start, end, options = {}) {
109
+ if (_class_private_field_get(this, _dialog).isOpen) return _class_private_method_get(this, _buildDialogResponse, buildDialogResponse).call(this, 'drag');
110
+ await _class_private_field_get(this, _page).mouse.dragAndDrop(start, end, {
111
+ delay: options.delay
112
+ });
113
+ return {
114
+ success: true
115
+ };
116
+ }
117
+ async scroll(direction, delta) {
118
+ if (_class_private_field_get(this, _dialog).isOpen) return _class_private_method_get(this, _buildDialogResponse, buildDialogResponse).call(this, 'scroll');
119
+ let deltaX = 0;
120
+ let deltaY = 0;
121
+ switch(direction){
122
+ case 'up':
123
+ break;
124
+ case 'down':
125
+ deltaY = delta;
126
+ break;
127
+ case 'left':
128
+ deltaX = -delta;
129
+ break;
130
+ case 'right':
131
+ deltaX = delta;
132
+ break;
133
+ }
134
+ await _class_private_field_get(this, _page).mouse.wheel({
135
+ deltaX,
136
+ deltaY
137
+ });
138
+ return {
139
+ success: true
140
+ };
141
+ }
142
+ constructor(page, dialog){
143
+ _class_private_method_init(this, _buildDialogResponse);
144
+ _class_private_field_init(this, _page, {
145
+ writable: true,
146
+ value: void 0
147
+ });
148
+ _class_private_field_init(this, _dialog, {
149
+ writable: true,
150
+ value: void 0
151
+ });
152
+ _class_private_field_set(this, _page, page);
153
+ _class_private_field_set(this, _dialog, dialog);
154
+ }
155
+ }
156
+ function buildDialogResponse(type) {
157
+ return {
158
+ success: false,
159
+ message: `Cannot perform mouse.${type}() operation because there is a dialog on the current page.`,
160
+ detail: _class_private_field_get(this, _dialog).meta
161
+ };
162
+ }
163
+ exports.Mouse = __webpack_exports__.Mouse;
164
+ exports.VisionMouse = __webpack_exports__.VisionMouse;
165
+ for(var __webpack_i__ in __webpack_exports__)if (-1 === [
166
+ "Mouse",
167
+ "VisionMouse"
168
+ ].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
169
+ Object.defineProperty(exports, '__esModule', {
170
+ value: true
171
+ });
172
+
173
+ //# sourceMappingURL=mouse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions/mouse.js","sources":["webpack://@agent-infra/browser/webpack/runtime/define_property_getters","webpack://@agent-infra/browser/webpack/runtime/has_own_property","webpack://@agent-infra/browser/webpack/runtime/make_namespace_object","webpack://@agent-infra/browser/./src/actions/mouse.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};","/*\n * Copyright (c) 2025 Bytedance, Inc. and its affiliates.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n Page,\n Point,\n MouseClickOptions,\n MouseMoveOptions,\n} from 'puppeteer-core';\nimport { ScrollDirection, ActionResult } from '../types';\nimport type { DialogMetaInfo } from '../types';\nimport type { TabDialog } from '../tabs/dialog';\n\nexport class Mouse {\n #vision: VisionMouse;\n\n constructor(page: Page, dialog: TabDialog) {\n this.#vision = new VisionMouse(page, dialog);\n }\n\n get vision() {\n return this.#vision;\n }\n\n // Future: can add DOM mouse support here\n // get dom() {\n // return this.#dom;\n // }\n}\n\nexport class VisionMouse {\n #page: Page;\n #dialog: TabDialog;\n\n constructor(page: Page, dialog: TabDialog) {\n this.#page = page;\n this.#dialog = dialog;\n }\n\n async click(\n x: number,\n y: number,\n options: Omit<MouseClickOptions, 'clickCount'> = {},\n ): Promise<ActionResult> {\n if (this.#dialog.isOpen) {\n return this.#buildDialogResponse('click');\n }\n\n await this.#page.mouse.click(x, y, {\n count: options.count,\n delay: options.delay,\n button: options.button,\n });\n\n return { success: true };\n }\n\n async move(\n x: number,\n y: number,\n options: MouseMoveOptions = {},\n ): Promise<ActionResult> {\n if (this.#dialog.isOpen) {\n return this.#buildDialogResponse('move');\n }\n\n await this.#page.mouse.move(x, y, {\n steps: options.steps,\n });\n\n return { success: true };\n }\n\n async drag(\n start: Point,\n end: Point,\n options: {\n delay?: number;\n } = {},\n ): Promise<ActionResult> {\n if (this.#dialog.isOpen) {\n return this.#buildDialogResponse('drag');\n }\n\n await this.#page.mouse.dragAndDrop(start, end, {\n delay: options.delay,\n });\n\n return { success: true };\n }\n\n async scroll(\n direction: ScrollDirection,\n delta: number,\n ): Promise<ActionResult> {\n if (this.#dialog.isOpen) {\n return this.#buildDialogResponse('scroll');\n }\n\n let deltaX = 0;\n let deltaY = 0;\n\n switch (direction) {\n case 'up':\n break;\n case 'down':\n deltaY = delta;\n break;\n case 'left':\n deltaX = -delta;\n break;\n case 'right':\n deltaX = delta;\n break;\n }\n\n await this.#page.mouse.wheel({ deltaX, deltaY });\n\n return { success: true };\n }\n\n #buildDialogResponse(type: string): ActionResult {\n return {\n success: false,\n message: `Cannot perform mouse.${type}() operation because there is a dialog on the current page.`,\n detail: this.#dialog.meta as DialogMetaInfo,\n };\n }\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","_vision","Mouse","page","dialog","VisionMouse","_page","_dialog","buildDialogResponse","x","y","options","start","end","direction","delta","deltaX","deltaY","type"],"mappings":"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"}
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Copyright (c) 2025 Bytedance, Inc. and its affiliates.
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+ function _check_private_redeclaration(obj, privateCollection) {
6
+ if (privateCollection.has(obj)) throw new TypeError("Cannot initialize the same private elements twice on an object");
7
+ }
8
+ function _class_apply_descriptor_get(receiver, descriptor) {
9
+ if (descriptor.get) return descriptor.get.call(receiver);
10
+ return descriptor.value;
11
+ }
12
+ function _class_apply_descriptor_set(receiver, descriptor, value) {
13
+ if (descriptor.set) descriptor.set.call(receiver, value);
14
+ else {
15
+ if (!descriptor.writable) throw new TypeError("attempted to set read only private field");
16
+ descriptor.value = value;
17
+ }
18
+ }
19
+ function _class_extract_field_descriptor(receiver, privateMap, action) {
20
+ if (!privateMap.has(receiver)) throw new TypeError("attempted to " + action + " private field on non-instance");
21
+ return privateMap.get(receiver);
22
+ }
23
+ function _class_private_field_get(receiver, privateMap) {
24
+ var descriptor = _class_extract_field_descriptor(receiver, privateMap, "get");
25
+ return _class_apply_descriptor_get(receiver, descriptor);
26
+ }
27
+ function _class_private_field_init(obj, privateMap, value) {
28
+ _check_private_redeclaration(obj, privateMap);
29
+ privateMap.set(obj, value);
30
+ }
31
+ function _class_private_field_set(receiver, privateMap, value) {
32
+ var descriptor = _class_extract_field_descriptor(receiver, privateMap, "set");
33
+ _class_apply_descriptor_set(receiver, descriptor, value);
34
+ return value;
35
+ }
36
+ function _class_private_method_get(receiver, privateSet, fn) {
37
+ if (!privateSet.has(receiver)) throw new TypeError("attempted to get private field on non-instance");
38
+ return fn;
39
+ }
40
+ function _class_private_method_init(obj, privateSet) {
41
+ _check_private_redeclaration(obj, privateSet);
42
+ privateSet.add(obj);
43
+ }
44
+ var _vision = /*#__PURE__*/ new WeakMap();
45
+ class Mouse {
46
+ get vision() {
47
+ return _class_private_field_get(this, _vision);
48
+ }
49
+ constructor(page, dialog){
50
+ _class_private_field_init(this, _vision, {
51
+ writable: true,
52
+ value: void 0
53
+ });
54
+ _class_private_field_set(this, _vision, new VisionMouse(page, dialog));
55
+ }
56
+ }
57
+ var _page = /*#__PURE__*/ new WeakMap(), _dialog = /*#__PURE__*/ new WeakMap(), _buildDialogResponse = /*#__PURE__*/ new WeakSet();
58
+ class VisionMouse {
59
+ async click(x, y, options = {}) {
60
+ if (_class_private_field_get(this, _dialog).isOpen) return _class_private_method_get(this, _buildDialogResponse, buildDialogResponse).call(this, 'click');
61
+ await _class_private_field_get(this, _page).mouse.click(x, y, {
62
+ count: options.count,
63
+ delay: options.delay,
64
+ button: options.button
65
+ });
66
+ return {
67
+ success: true
68
+ };
69
+ }
70
+ async move(x, y, options = {}) {
71
+ if (_class_private_field_get(this, _dialog).isOpen) return _class_private_method_get(this, _buildDialogResponse, buildDialogResponse).call(this, 'move');
72
+ await _class_private_field_get(this, _page).mouse.move(x, y, {
73
+ steps: options.steps
74
+ });
75
+ return {
76
+ success: true
77
+ };
78
+ }
79
+ async drag(start, end, options = {}) {
80
+ if (_class_private_field_get(this, _dialog).isOpen) return _class_private_method_get(this, _buildDialogResponse, buildDialogResponse).call(this, 'drag');
81
+ await _class_private_field_get(this, _page).mouse.dragAndDrop(start, end, {
82
+ delay: options.delay
83
+ });
84
+ return {
85
+ success: true
86
+ };
87
+ }
88
+ async scroll(direction, delta) {
89
+ if (_class_private_field_get(this, _dialog).isOpen) return _class_private_method_get(this, _buildDialogResponse, buildDialogResponse).call(this, 'scroll');
90
+ let deltaX = 0;
91
+ let deltaY = 0;
92
+ switch(direction){
93
+ case 'up':
94
+ break;
95
+ case 'down':
96
+ deltaY = delta;
97
+ break;
98
+ case 'left':
99
+ deltaX = -delta;
100
+ break;
101
+ case 'right':
102
+ deltaX = delta;
103
+ break;
104
+ }
105
+ await _class_private_field_get(this, _page).mouse.wheel({
106
+ deltaX,
107
+ deltaY
108
+ });
109
+ return {
110
+ success: true
111
+ };
112
+ }
113
+ constructor(page, dialog){
114
+ _class_private_method_init(this, _buildDialogResponse);
115
+ _class_private_field_init(this, _page, {
116
+ writable: true,
117
+ value: void 0
118
+ });
119
+ _class_private_field_init(this, _dialog, {
120
+ writable: true,
121
+ value: void 0
122
+ });
123
+ _class_private_field_set(this, _page, page);
124
+ _class_private_field_set(this, _dialog, dialog);
125
+ }
126
+ }
127
+ function buildDialogResponse(type) {
128
+ return {
129
+ success: false,
130
+ message: `Cannot perform mouse.${type}() operation because there is a dialog on the current page.`,
131
+ detail: _class_private_field_get(this, _dialog).meta
132
+ };
133
+ }
134
+ export { Mouse, VisionMouse };
135
+
136
+ //# sourceMappingURL=mouse.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions/mouse.mjs","sources":["webpack://@agent-infra/browser/./src/actions/mouse.ts"],"sourcesContent":["/*\n * Copyright (c) 2025 Bytedance, Inc. and its affiliates.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n Page,\n Point,\n MouseClickOptions,\n MouseMoveOptions,\n} from 'puppeteer-core';\nimport { ScrollDirection, ActionResult } from '../types';\nimport type { DialogMetaInfo } from '../types';\nimport type { TabDialog } from '../tabs/dialog';\n\nexport class Mouse {\n #vision: VisionMouse;\n\n constructor(page: Page, dialog: TabDialog) {\n this.#vision = new VisionMouse(page, dialog);\n }\n\n get vision() {\n return this.#vision;\n }\n\n // Future: can add DOM mouse support here\n // get dom() {\n // return this.#dom;\n // }\n}\n\nexport class VisionMouse {\n #page: Page;\n #dialog: TabDialog;\n\n constructor(page: Page, dialog: TabDialog) {\n this.#page = page;\n this.#dialog = dialog;\n }\n\n async click(\n x: number,\n y: number,\n options: Omit<MouseClickOptions, 'clickCount'> = {},\n ): Promise<ActionResult> {\n if (this.#dialog.isOpen) {\n return this.#buildDialogResponse('click');\n }\n\n await this.#page.mouse.click(x, y, {\n count: options.count,\n delay: options.delay,\n button: options.button,\n });\n\n return { success: true };\n }\n\n async move(\n x: number,\n y: number,\n options: MouseMoveOptions = {},\n ): Promise<ActionResult> {\n if (this.#dialog.isOpen) {\n return this.#buildDialogResponse('move');\n }\n\n await this.#page.mouse.move(x, y, {\n steps: options.steps,\n });\n\n return { success: true };\n }\n\n async drag(\n start: Point,\n end: Point,\n options: {\n delay?: number;\n } = {},\n ): Promise<ActionResult> {\n if (this.#dialog.isOpen) {\n return this.#buildDialogResponse('drag');\n }\n\n await this.#page.mouse.dragAndDrop(start, end, {\n delay: options.delay,\n });\n\n return { success: true };\n }\n\n async scroll(\n direction: ScrollDirection,\n delta: number,\n ): Promise<ActionResult> {\n if (this.#dialog.isOpen) {\n return this.#buildDialogResponse('scroll');\n }\n\n let deltaX = 0;\n let deltaY = 0;\n\n switch (direction) {\n case 'up':\n break;\n case 'down':\n deltaY = delta;\n break;\n case 'left':\n deltaX = -delta;\n break;\n case 'right':\n deltaX = delta;\n break;\n }\n\n await this.#page.mouse.wheel({ deltaX, deltaY });\n\n return { success: true };\n }\n\n #buildDialogResponse(type: string): ActionResult {\n return {\n success: false,\n message: `Cannot perform mouse.${type}() operation because there is a dialog on the current page.`,\n detail: this.#dialog.meta as DialogMetaInfo,\n };\n }\n}\n"],"names":["_vision","Mouse","page","dialog","VisionMouse","_page","_dialog","buildDialogResponse","x","y","options","start","end","direction","delta","deltaX","deltaY","type"],"mappings":";;;;AAGC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAaCA,UAAAA,WAAAA,GAAAA,IAAAA;AADK,MAAMC;IAOX,IAAI,SAAS;QACX,OAAO,6BAAI,EAACD;IACd;IANA,YAAYE,IAAU,EAAEC,MAAiB,CAAE;QAF3CH,0BAAAA,IAAAA,EAAAA,SAAAA;;mBAAAA,KAAAA;;uCAGOA,SAAU,IAAII,YAAYF,MAAMC;IACvC;AAUF;IAGEE,QAAAA,WAAAA,GAAAA,IAAAA,WACAC,UAAAA,WAAAA,GAAAA,IAAAA,WAyFAC,uBAAAA,WAAAA,GAAAA,IAAAA;AA3FK,MAAMH;IASX,MAAM,MACJI,CAAS,EACTC,CAAS,EACTC,UAAiD,CAAC,CAAC,EAC5B;QACvB,IAAI,6BAAI,EAACJ,SAAQ,MAAM,EACrB,OAAO,8BAAI,EAACC,sBAAAA,qBAAAA,IAAAA,CAAL,IAAI,EAAsB;QAGnC,MAAM,6BAAI,EAACF,OAAM,KAAK,CAAC,KAAK,CAACG,GAAGC,GAAG;YACjC,OAAOC,QAAQ,KAAK;YACpB,OAAOA,QAAQ,KAAK;YACpB,QAAQA,QAAQ,MAAM;QACxB;QAEA,OAAO;YAAE,SAAS;QAAK;IACzB;IAEA,MAAM,KACJF,CAAS,EACTC,CAAS,EACTC,UAA4B,CAAC,CAAC,EACP;QACvB,IAAI,6BAAI,EAACJ,SAAQ,MAAM,EACrB,OAAO,8BAAI,EAACC,sBAAAA,qBAAAA,IAAAA,CAAL,IAAI,EAAsB;QAGnC,MAAM,6BAAI,EAACF,OAAM,KAAK,CAAC,IAAI,CAACG,GAAGC,GAAG;YAChC,OAAOC,QAAQ,KAAK;QACtB;QAEA,OAAO;YAAE,SAAS;QAAK;IACzB;IAEA,MAAM,KACJC,KAAY,EACZC,GAAU,EACVF,UAEI,CAAC,CAAC,EACiB;QACvB,IAAI,6BAAI,EAACJ,SAAQ,MAAM,EACrB,OAAO,8BAAI,EAACC,sBAAAA,qBAAAA,IAAAA,CAAL,IAAI,EAAsB;QAGnC,MAAM,6BAAI,EAACF,OAAM,KAAK,CAAC,WAAW,CAACM,OAAOC,KAAK;YAC7C,OAAOF,QAAQ,KAAK;QACtB;QAEA,OAAO;YAAE,SAAS;QAAK;IACzB;IAEA,MAAM,OACJG,SAA0B,EAC1BC,KAAa,EACU;QACvB,IAAI,6BAAI,EAACR,SAAQ,MAAM,EACrB,OAAO,8BAAI,EAACC,sBAAAA,qBAAAA,IAAAA,CAAL,IAAI,EAAsB;QAGnC,IAAIQ,SAAS;QACb,IAAIC,SAAS;QAEb,OAAQH;YACN,KAAK;gBACH;YACF,KAAK;gBACHG,SAASF;gBACT;YACF,KAAK;gBACHC,SAAS,CAACD;gBACV;YACF,KAAK;gBACHC,SAASD;gBACT;QACJ;QAEA,MAAM,6BAAI,EAACT,OAAM,KAAK,CAAC,KAAK,CAAC;YAAEU;YAAQC;QAAO;QAE9C,OAAO;YAAE,SAAS;QAAK;IACzB;IArFA,YAAYd,IAAU,EAAEC,MAAiB,CAAE;QAuF3CI,2BAAAA,IAAAA,EAAAA;QA1FAF,0BAAAA,IAAAA,EAAAA,OAAAA;;mBAAAA,KAAAA;;QACAC,0BAAAA,IAAAA,EAAAA,SAAAA;;mBAAAA,KAAAA;;uCAGOD,OAAQH;uCACRI,SAAUH;IACjB;AA2FF;AAPEI,SAAAA,oBAAqBU,IAAY;IAC/B,OAAO;QACL,SAAS;QACT,SAAS,CAAC,qBAAqB,EAAEA,KAAK,2DAA2D,CAAC;QAClG,QAAQ,6BAAI,EAACX,SAAQ,IAAI;IAC3B;AACF"}
@@ -0,0 +1,47 @@
1
+ import type { Browser as pptrBrowser, Viewport } from 'puppeteer-core';
2
+ import type { Tabs } from '../tabs/tabs';
3
+ import type { EnvInfo, UserAgentInfo } from '../types';
4
+ /**
5
+ * Abstract base class for browser implementations
6
+ * Contains common functionality shared between Browser and UIBrowser
7
+ */
8
+ export declare abstract class BaseBrowser<TTabs extends Tabs> {
9
+ pptrBrowser?: pptrBrowser;
10
+ _tabs?: TTabs;
11
+ _envInfo?: EnvInfo;
12
+ wsEndpoint: string;
13
+ defaultViewport: Viewport;
14
+ isIntentionalDisconnect: boolean;
15
+ reconnectAttempts: number;
16
+ userAgentInfo?: UserAgentInfo;
17
+ constructor();
18
+ private get tabs();
19
+ getTabsSnapshot(): import("../types").TabsState;
20
+ subscribeTabChange(callback: () => void): () => void;
21
+ getActiveTab(): import("../tabs").Tab | null;
22
+ createTab(): Promise<string>;
23
+ activeTab(tabId: string): Promise<boolean>;
24
+ closeTab(tabId: string): Promise<boolean>;
25
+ destroyAllTabs(): Promise<void>;
26
+ /**
27
+ * Set the user agent for the browser and future tabs
28
+ */
29
+ setUserAgent(options: UserAgentInfo): void;
30
+ /**
31
+ * Get the current user agent
32
+ */
33
+ getUserAgent(): Promise<UserAgentInfo>;
34
+ get envInfo(): any;
35
+ getBrowserMetaInfo(): Promise<{
36
+ envInfo: EnvInfo;
37
+ userAgent: string;
38
+ viewport: Viewport;
39
+ wsEndpoint: string;
40
+ }>;
41
+ disconnect(): Promise<void>;
42
+ setDefaultViewport(viewport?: Viewport | null): Viewport;
43
+ setupAutoReconnect(): void;
44
+ protected abstract performReconnect(): Promise<void>;
45
+ protected attemptReconnect(): Promise<void>;
46
+ }
47
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/browser/base.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,IAAI,WAAW,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAEvE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAKvD;;;GAGG;AACH,8BAAsB,WAAW,CAAC,KAAK,SAAS,IAAI;IAC3C,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,SAAM;IAChB,eAAe,EAAE,QAAQ,CAO9B;IACK,uBAAuB,EAAE,OAAO,CAAS;IACzC,iBAAiB,EAAE,MAAM,CAAK;IAC9B,aAAa,CAAC,EAAE,aAAa,CAAC;;IAMrC,OAAO,KAAK,IAAI,GAKf;IAED,eAAe;IAIf,kBAAkB,CAAC,QAAQ,EAAE,MAAM,IAAI;IAIvC,YAAY;IAIN,SAAS;IAIT,SAAS,CAAC,KAAK,EAAE,MAAM;IAIvB,QAAQ,CAAC,KAAK,EAAE,MAAM;IAItB,cAAc;IAQpB;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAI1C;;OAEG;IACG,YAAY;IAalB,IAAI,OAAO,IAAI,GAAG,CAEjB;IAEK,kBAAkB;;;;;;IAelB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ1B,kBAAkB,CAAC,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,GAAG,QAAQ;IAmBxD,kBAAkB,IAAI,IAAI;IAWjC,SAAS,CAAC,QAAQ,CAAC,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;cAEpC,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;CA2BlD"}