@agent-infra/browser 0.2.0-alpha.4 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/dist/actions/keyboard.d.ts.map +1 -1
  2. package/dist/actions/keyboard.js +4 -4
  3. package/dist/actions/keyboard.js.map +1 -1
  4. package/dist/actions/keyboard.mjs +4 -4
  5. package/dist/actions/keyboard.mjs.map +1 -1
  6. package/dist/browser/browser.d.ts +3 -1
  7. package/dist/browser/browser.d.ts.map +1 -1
  8. package/dist/browser/browser.js +4 -2
  9. package/dist/browser/browser.js.map +1 -1
  10. package/dist/browser/browser.mjs +4 -2
  11. package/dist/browser/browser.mjs.map +1 -1
  12. package/dist/injected-script/visibility.d.ts +1 -1
  13. package/dist/injected-script/visibility.d.ts.map +1 -1
  14. package/dist/injected-script/visibility.js +5 -0
  15. package/dist/injected-script/visibility.js.map +1 -1
  16. package/dist/injected-script/visibility.mjs +5 -0
  17. package/dist/injected-script/visibility.mjs.map +1 -1
  18. package/dist/injected-script/webdriver.d.ts +1 -1
  19. package/dist/injected-script/webdriver.d.ts.map +1 -1
  20. package/dist/injected-script/webdriver.js +5 -0
  21. package/dist/injected-script/webdriver.js.map +1 -1
  22. package/dist/injected-script/webdriver.mjs +5 -0
  23. package/dist/injected-script/webdriver.mjs.map +1 -1
  24. package/dist/tabs/tab.d.ts +1 -0
  25. package/dist/tabs/tab.d.ts.map +1 -1
  26. package/dist/tabs/tab.js +50 -36
  27. package/dist/tabs/tab.js.map +1 -1
  28. package/dist/tabs/tab.mjs +40 -36
  29. package/dist/tabs/tab.mjs.map +1 -1
  30. package/dist/tabs/tabs.d.ts +1 -1
  31. package/dist/tabs/tabs.d.ts.map +1 -1
  32. package/dist/tabs/tabs.js +7 -17
  33. package/dist/tabs/tabs.js.map +1 -1
  34. package/dist/tabs/tabs.mjs +7 -17
  35. package/dist/tabs/tabs.mjs.map +1 -1
  36. package/dist/types/tabs.d.ts +1 -4
  37. package/dist/types/tabs.d.ts.map +1 -1
  38. package/dist/types/tabs.js.map +1 -1
  39. package/dist/types/tabs.mjs.map +1 -1
  40. package/dist/utils/iife.d.ts.map +1 -1
  41. package/dist/utils/iife.js +2 -3
  42. package/dist/utils/iife.js.map +1 -1
  43. package/dist/utils/iife.mjs +2 -3
  44. package/dist/utils/iife.mjs.map +1 -1
  45. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"keyboard.d.ts","sourceRoot":"","sources":["../../src/actions/keyboard.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAY,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,KAAK,EACV,OAAO,EAEP,eAAe,EACf,gBAAgB,EAChB,YAAY,EACb,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,qBAAa,QAAQ;;gBAKP,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO;IAMvD;;OAEG;IACG,KAAK,CACT,GAAG,EAAE,gBAAgB,EACrB,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,YAAY,CAAC;IA0BxB;;OAEG;IACG,IAAI,CACR,GAAG,EAAE,gBAAgB,EACrB,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,YAAY,CAAC;IAqBxB;;OAEG;IACG,EAAE,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,YAAY,CAAC;IAchD,IAAI,CACR,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,YAAY,CAAC;CAoFzB"}
1
+ {"version":3,"file":"keyboard.d.ts","sourceRoot":"","sources":["../../src/actions/keyboard.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAY,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,KAAK,EACV,OAAO,EAEP,eAAe,EACf,gBAAgB,EAChB,YAAY,EACb,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,qBAAa,QAAQ;;gBAKP,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO;IAMvD;;OAEG;IACG,KAAK,CACT,GAAG,EAAE,gBAAgB,EACrB,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,YAAY,CAAC;IA8BxB;;OAEG;IACG,IAAI,CACR,GAAG,EAAE,gBAAgB,EACrB,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,YAAY,CAAC;IAyBxB;;OAEG;IACG,EAAE,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,YAAY,CAAC;IAchD,IAAI,CACR,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,YAAY,CAAC;CAwFzB"}
@@ -87,7 +87,7 @@ class Keyboard {
87
87
  if (_class_private_field_get(this, _dialog).isOpen) return _class_private_method_get(this, _buildDialogResponse, buildDialogResponse).call(this, 'press');
88
88
  const formattedHotkey = _class_private_method_get(this, _formatHotkey, formatHotkey).call(this, key);
89
89
  if ('macOS' === _class_private_field_get(this, _env).osName && 'Chrome' === _class_private_field_get(this, _env).browserName) {
90
- const success = await _class_private_method_get(this, _macOSCDPHotKey, macOSCDPHotKey).call(this, formattedHotkey, options);
90
+ const success = await _class_private_method_get(this, _macOSCDPHotKey, macOSCDPHotKey).call(this, formattedHotkey, options, true);
91
91
  if (success) return {
92
92
  success: true
93
93
  };
@@ -103,7 +103,7 @@ class Keyboard {
103
103
  if (_class_private_field_get(this, _dialog).isOpen) return _class_private_method_get(this, _buildDialogResponse, buildDialogResponse).call(this, 'down');
104
104
  const formattedHotkey = _class_private_method_get(this, _formatHotkey, formatHotkey).call(this, key);
105
105
  if ('macOS' === _class_private_field_get(this, _env).osName && 'Chrome' === _class_private_field_get(this, _env).browserName) {
106
- const success = await _class_private_method_get(this, _macOSCDPHotKey, macOSCDPHotKey).call(this, formattedHotkey, options);
106
+ const success = await _class_private_method_get(this, _macOSCDPHotKey, macOSCDPHotKey).call(this, formattedHotkey, options, false);
107
107
  if (success) return {
108
108
  success: true
109
109
  };
@@ -160,7 +160,7 @@ function formatHotkey(hotkey) {
160
160
  });
161
161
  return formattedKeys;
162
162
  }
163
- async function macOSCDPHotKey(keys, options) {
163
+ async function macOSCDPHotKey(keys, options, isPress) {
164
164
  const hotkey = keys.map((key)=>{
165
165
  if ('Control' === key || 'Meta' === key) return 'CorM';
166
166
  return key;
@@ -173,7 +173,7 @@ async function macOSCDPHotKey(keys, options) {
173
173
  ]
174
174
  });
175
175
  await external_delay_default()(options.delay ?? 0);
176
- await _class_private_field_get(this, _page).keyboard.up(command.key);
176
+ if (isPress) await _class_private_field_get(this, _page).keyboard.up(command.key);
177
177
  return true;
178
178
  }
179
179
  return false;
@@ -1 +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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"}
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(\n formattedHotkey,\n options,\n true,\n );\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(\n formattedHotkey,\n options,\n false,\n );\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 isPress: boolean,\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\n if (isPress) {\n await this.#page.keyboard.up(command.key);\n }\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","isPress","command","MAC_SYSTEM_HOTKEY_MAP","type"],"mappings":"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"}
@@ -49,7 +49,7 @@ class Keyboard {
49
49
  if (_class_private_field_get(this, _dialog).isOpen) return _class_private_method_get(this, _buildDialogResponse, buildDialogResponse).call(this, 'press');
50
50
  const formattedHotkey = _class_private_method_get(this, _formatHotkey, formatHotkey).call(this, key);
51
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);
52
+ const success = await _class_private_method_get(this, _macOSCDPHotKey, macOSCDPHotKey).call(this, formattedHotkey, options, true);
53
53
  if (success) return {
54
54
  success: true
55
55
  };
@@ -65,7 +65,7 @@ class Keyboard {
65
65
  if (_class_private_field_get(this, _dialog).isOpen) return _class_private_method_get(this, _buildDialogResponse, buildDialogResponse).call(this, 'down');
66
66
  const formattedHotkey = _class_private_method_get(this, _formatHotkey, formatHotkey).call(this, key);
67
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);
68
+ const success = await _class_private_method_get(this, _macOSCDPHotKey, macOSCDPHotKey).call(this, formattedHotkey, options, false);
69
69
  if (success) return {
70
70
  success: true
71
71
  };
@@ -122,7 +122,7 @@ function formatHotkey(hotkey) {
122
122
  });
123
123
  return formattedKeys;
124
124
  }
125
- async function macOSCDPHotKey(keys, options) {
125
+ async function macOSCDPHotKey(keys, options, isPress) {
126
126
  const hotkey = keys.map((key)=>{
127
127
  if ('Control' === key || 'Meta' === key) return 'CorM';
128
128
  return key;
@@ -135,7 +135,7 @@ async function macOSCDPHotKey(keys, options) {
135
135
  ]
136
136
  });
137
137
  await delay(options.delay ?? 0);
138
- await _class_private_field_get(this, _page).keyboard.up(command.key);
138
+ if (isPress) await _class_private_field_get(this, _page).keyboard.up(command.key);
139
139
  return true;
140
140
  }
141
141
  return false;
@@ -1 +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":"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"}
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(\n formattedHotkey,\n options,\n true,\n );\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(\n formattedHotkey,\n options,\n false,\n );\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 isPress: boolean,\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\n if (isPress) {\n await this.#page.keyboard.up(command.key);\n }\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","isPress","command","MAC_SYSTEM_HOTKEY_MAP","type"],"mappings":"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"}
@@ -6,7 +6,9 @@ export declare class Browser extends BaseBrowser<Tabs> {
6
6
  /**
7
7
  * Create a browser instance (launch or connect based on options)
8
8
  */
9
- static create(options?: LaunchOptions): Promise<Browser>;
9
+ static create(options?: {
10
+ launchOrConnect: LaunchOptions;
11
+ }): Promise<Browser>;
10
12
  constructor();
11
13
  /**
12
14
  * cookies API
@@ -1 +1 @@
1
- {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/browser/browser.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEpC,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAErC,OAAO,KAAK,EACV,MAAM,EACN,UAAU,EACV,oBAAoB,EACpB,aAAa,EACd,MAAM,gBAAgB,CAAC;AAExB,qBAAa,OAAQ,SAAQ,WAAW,CAAC,IAAI,CAAC;;IAC5C;;OAEG;WACU,MAAM,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,OAAO,CAAC;;IAYlE;;;;OAIG;IAEH,OAAO;IAIP,SAAS,CAAC,GAAG,OAAO,EAAE,UAAU,EAAE;IAIlC,YAAY,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE;IAIjC,qBAAqB,CAAC,GAAG,OAAO,EAAE,oBAAoB,EAAE;IAQlD,KAAK;IA0JI,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;CAoBjD"}
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/browser/browser.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEpC,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAErC,OAAO,KAAK,EACV,MAAM,EACN,UAAU,EACV,oBAAoB,EACpB,aAAa,EACd,MAAM,gBAAgB,CAAC;AAExB,qBAAa,OAAQ,SAAQ,WAAW,CAAC,IAAI,CAAC;;IAC5C;;OAEG;WACU,MAAM,CACjB,OAAO,GAAE;QAAE,eAAe,EAAE,aAAa,CAAA;KAA4B,GACpE,OAAO,CAAC,OAAO,CAAC;;IAYnB;;;;OAIG;IAEH,OAAO;IAIP,SAAS,CAAC,GAAG,OAAO,EAAE,UAAU,EAAE;IAIlC,YAAY,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE;IAIjC,qBAAqB,CAAC,GAAG,OAAO,EAAE,oBAAoB,EAAE;IAQlD,KAAK;IA0JI,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;CAoBjD"}
@@ -48,9 +48,11 @@ function _class_private_method_init(obj, privateSet) {
48
48
  }
49
49
  var _init = /*#__PURE__*/ new WeakSet(), _processOptions = /*#__PURE__*/ new WeakSet(), _isConnectMode = /*#__PURE__*/ new WeakSet(), _launch = /*#__PURE__*/ new WeakSet(), _connect = /*#__PURE__*/ new WeakSet();
50
50
  class Browser extends external_base_js_namespaceObject.BaseBrowser {
51
- static async create(options = {}) {
51
+ static async create(options = {
52
+ launchOrConnect: {}
53
+ }) {
52
54
  const browser = new Browser();
53
- await _class_private_method_get(browser, _init, init).call(browser, options);
55
+ await _class_private_method_get(browser, _init, init).call(browser, options.launchOrConnect);
54
56
  return browser;
55
57
  }
56
58
  cookies() {
@@ -1 +1 @@
1
- {"version":3,"file":"browser/browser.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/browser/browser.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 { launch, connect } from 'puppeteer-core';\nimport { BrowserFinder } from '@agent-infra/browser-finder';\nimport { Tabs } from '../tabs/tabs';\nimport { getEnvInfo } from '../env';\nimport { BaseBrowser } from './base';\n\nimport type {\n Cookie,\n CookieData,\n DeleteCookiesRequest,\n LaunchOptions,\n} from 'puppeteer-core';\n\nexport class Browser extends BaseBrowser<Tabs> {\n /**\n * Create a browser instance (launch or connect based on options)\n */\n static async create(options: LaunchOptions = {}): Promise<Browser> {\n const browser = new Browser();\n await browser.#init(options);\n return browser;\n }\n\n constructor() {\n super();\n }\n\n // #region cookies\n\n /**\n * cookies API\n *\n * @doc: https://pptr.dev/guides/cookies#setting-cookies\n */\n\n cookies() {\n return this.pptrBrowser!.cookies();\n }\n\n setCookie(...cookies: CookieData[]) {\n return this.pptrBrowser!.setCookie(...cookies);\n }\n\n deleteCookie(...cookies: Cookie[]) {\n return this.pptrBrowser!.deleteCookie(...cookies);\n }\n\n deleteMatchingCookies(...filters: DeleteCookiesRequest[]) {\n return this.pptrBrowser!.deleteMatchingCookies(...filters);\n }\n\n // #endregion\n\n // #region lifecycle\n\n async close() {\n this.isIntentionalDisconnect = true;\n\n await this.destroyAllTabs();\n await this.pptrBrowser?.close();\n }\n\n // #endregion\n\n // #region launch & connect\n\n async #init(options: LaunchOptions): Promise<void> {\n const processedOptions = this.#processOptions(options);\n\n if (this.#isConnectMode(processedOptions)) {\n await this.#connect(processedOptions);\n } else {\n await this.#launch(processedOptions);\n }\n }\n\n #processOptions(options: LaunchOptions): LaunchOptions {\n const processedOptions = { ...options };\n\n const findBrowserPath = () => {\n const finder = new BrowserFinder();\n const browsers = ['chrome', 'edge'] as const;\n\n const foundBrowser = browsers.find((browser) => {\n try {\n finder.findBrowser(browser);\n return true;\n } catch {\n return false;\n }\n });\n\n if (!foundBrowser) {\n throw new Error(\n 'No Chrome or Edge browser found. Please install Chrome or Edge browser first.',\n );\n }\n\n return finder.findBrowser(foundBrowser).path;\n };\n\n const setArgs = () => {\n const args = processedOptions.args || [];\n // https://github.com/GoogleChrome/chrome-launcher/blob/main/docs/chrome-flags-for-tools.md\n const defaultArgs = [\n '--mute-audio', // Mute any audio\n '--no-default-browser-check', // Disable the default browser check, do not prompt to set it as such\n '--ash-no-nudges', // Avoids blue bubble \"user education\" nudges\n ];\n // window-size includes some Chrome UI components (such as tabs, URL input box, etc.),\n // so an additional 90 pixels should be added to the viewport height.\n const windowSizeArg = `--window-size=${this.defaultViewport.width},${this.defaultViewport.height + 90}`;\n\n // args\n for (const arg of defaultArgs) {\n if (!args.includes(arg)) {\n args.push(arg);\n }\n }\n if (!args.find((arg) => arg.startsWith('--window-size'))) {\n args.push(windowSizeArg);\n }\n\n processedOptions.args = args;\n\n // ignoreArgs\n const enableAutomationArg = '--enable-automation';\n if (processedOptions.ignoreDefaultArgs) {\n if (Array.isArray(processedOptions.ignoreDefaultArgs)) {\n const ignoreArgs = processedOptions.ignoreDefaultArgs;\n if (!ignoreArgs.includes(enableAutomationArg)) {\n ignoreArgs.push(enableAutomationArg);\n }\n }\n } else {\n processedOptions.ignoreDefaultArgs = [enableAutomationArg];\n }\n };\n\n // 1.Set default viewport\n processedOptions.defaultViewport = this.setDefaultViewport(\n options.defaultViewport,\n );\n\n // 2.Validate browser type\n if (\n processedOptions.browser === 'firefox' ||\n processedOptions.executablePath?.toLowerCase().includes('firefox') ||\n processedOptions.protocol === 'webDriverBiDi'\n ) {\n throw new Error(\n 'Firefox is not supported. This package is based on CDP (Chrome DevTools Protocol).',\n );\n }\n\n if (\n !this.#isConnectMode(processedOptions) &&\n !processedOptions.executablePath\n ) {\n // 3.Set executable path if needed\n processedOptions.executablePath = findBrowserPath();\n\n // 4.Optimize args and ignoreDefaultArgs for launch mode\n setArgs();\n }\n\n return processedOptions;\n }\n\n #isConnectMode(options: LaunchOptions): boolean {\n return !!(options.browserWSEndpoint || options.browserURL);\n }\n\n async #launch(options: LaunchOptions): Promise<void> {\n this.pptrBrowser = await launch(options);\n\n if (!this.pptrBrowser) {\n throw new Error('Puppeteer browser not launch');\n }\n\n this.wsEndpoint = this.pptrBrowser.wsEndpoint();\n\n this._envInfo = await getEnvInfo(this.pptrBrowser);\n this._tabs = await Tabs.create(this.pptrBrowser, {\n viewport: this.defaultViewport,\n envInfo: this._envInfo,\n userAgentInfo: this.userAgentInfo,\n });\n this.setupAutoReconnect();\n }\n\n async #connect(options: LaunchOptions): Promise<void> {\n this.pptrBrowser = await connect(options);\n\n if (!this.pptrBrowser) {\n throw new Error('Puppeteer browser not connect');\n }\n\n this.wsEndpoint = this.pptrBrowser.wsEndpoint();\n\n this._envInfo = await getEnvInfo(this.pptrBrowser);\n this._tabs = await Tabs.create(this.pptrBrowser, {\n viewport: this.defaultViewport,\n envInfo: this._envInfo,\n userAgentInfo: this.userAgentInfo,\n });\n this.setupAutoReconnect();\n }\n\n override async performReconnect(): Promise<void> {\n const connectOptions = {\n browserWSEndpoint: this.wsEndpoint,\n defaultViewport: this.defaultViewport,\n };\n this.pptrBrowser = await connect(connectOptions);\n\n this.wsEndpoint = this.pptrBrowser.wsEndpoint();\n this._tabs = await Tabs.create(this.pptrBrowser, {\n viewport: this.defaultViewport,\n envInfo: this._envInfo!,\n });\n\n const activeTab = this.getActiveTab();\n if (activeTab) {\n await activeTab._active();\n }\n }\n\n // #endregion\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","_init","processOptions","isConnectMode","_launch","_connect","Browser","BaseBrowser","options","browser","init","cookies","filters","_this_pptrBrowser","connectOptions","connect","Tabs","activeTab","launch1","connect1","processedOptions","_processedOptions_executablePath","findBrowserPath","finder","BrowserFinder","browsers","foundBrowser","Error","setArgs","args","defaultArgs","windowSizeArg","arg","enableAutomationArg","Array","ignoreArgs","launch","getEnvInfo"],"mappings":"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"}
1
+ {"version":3,"file":"browser/browser.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/browser/browser.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 { launch, connect } from 'puppeteer-core';\nimport { BrowserFinder } from '@agent-infra/browser-finder';\nimport { Tabs } from '../tabs/tabs';\nimport { getEnvInfo } from '../env';\nimport { BaseBrowser } from './base';\n\nimport type {\n Cookie,\n CookieData,\n DeleteCookiesRequest,\n LaunchOptions,\n} from 'puppeteer-core';\n\nexport class Browser extends BaseBrowser<Tabs> {\n /**\n * Create a browser instance (launch or connect based on options)\n */\n static async create(\n options: { launchOrConnect: LaunchOptions } = { launchOrConnect: {} },\n ): Promise<Browser> {\n const browser = new Browser();\n await browser.#init(options.launchOrConnect);\n return browser;\n }\n\n constructor() {\n super();\n }\n\n // #region cookies\n\n /**\n * cookies API\n *\n * @doc: https://pptr.dev/guides/cookies#setting-cookies\n */\n\n cookies() {\n return this.pptrBrowser!.cookies();\n }\n\n setCookie(...cookies: CookieData[]) {\n return this.pptrBrowser!.setCookie(...cookies);\n }\n\n deleteCookie(...cookies: Cookie[]) {\n return this.pptrBrowser!.deleteCookie(...cookies);\n }\n\n deleteMatchingCookies(...filters: DeleteCookiesRequest[]) {\n return this.pptrBrowser!.deleteMatchingCookies(...filters);\n }\n\n // #endregion\n\n // #region lifecycle\n\n async close() {\n this.isIntentionalDisconnect = true;\n\n await this.destroyAllTabs();\n await this.pptrBrowser?.close();\n }\n\n // #endregion\n\n // #region launch & connect\n\n async #init(options: LaunchOptions): Promise<void> {\n const processedOptions = this.#processOptions(options);\n\n if (this.#isConnectMode(processedOptions)) {\n await this.#connect(processedOptions);\n } else {\n await this.#launch(processedOptions);\n }\n }\n\n #processOptions(options: LaunchOptions): LaunchOptions {\n const processedOptions = { ...options };\n\n const findBrowserPath = () => {\n const finder = new BrowserFinder();\n const browsers = ['chrome', 'edge'] as const;\n\n const foundBrowser = browsers.find((browser) => {\n try {\n finder.findBrowser(browser);\n return true;\n } catch {\n return false;\n }\n });\n\n if (!foundBrowser) {\n throw new Error(\n 'No Chrome or Edge browser found. Please install Chrome or Edge browser first.',\n );\n }\n\n return finder.findBrowser(foundBrowser).path;\n };\n\n const setArgs = () => {\n const args = processedOptions.args || [];\n // https://github.com/GoogleChrome/chrome-launcher/blob/main/docs/chrome-flags-for-tools.md\n const defaultArgs = [\n '--mute-audio', // Mute any audio\n '--no-default-browser-check', // Disable the default browser check, do not prompt to set it as such\n '--ash-no-nudges', // Avoids blue bubble \"user education\" nudges\n ];\n // window-size includes some Chrome UI components (such as tabs, URL input box, etc.),\n // so an additional 90 pixels should be added to the viewport height.\n const windowSizeArg = `--window-size=${this.defaultViewport.width},${this.defaultViewport.height + 90}`;\n\n // args\n for (const arg of defaultArgs) {\n if (!args.includes(arg)) {\n args.push(arg);\n }\n }\n if (!args.find((arg) => arg.startsWith('--window-size'))) {\n args.push(windowSizeArg);\n }\n\n processedOptions.args = args;\n\n // ignoreArgs\n const enableAutomationArg = '--enable-automation';\n if (processedOptions.ignoreDefaultArgs) {\n if (Array.isArray(processedOptions.ignoreDefaultArgs)) {\n const ignoreArgs = processedOptions.ignoreDefaultArgs;\n if (!ignoreArgs.includes(enableAutomationArg)) {\n ignoreArgs.push(enableAutomationArg);\n }\n }\n } else {\n processedOptions.ignoreDefaultArgs = [enableAutomationArg];\n }\n };\n\n // 1.Set default viewport\n processedOptions.defaultViewport = this.setDefaultViewport(\n options.defaultViewport,\n );\n\n // 2.Validate browser type\n if (\n processedOptions.browser === 'firefox' ||\n processedOptions.executablePath?.toLowerCase().includes('firefox') ||\n processedOptions.protocol === 'webDriverBiDi'\n ) {\n throw new Error(\n 'Firefox is not supported. This package is based on CDP (Chrome DevTools Protocol).',\n );\n }\n\n if (\n !this.#isConnectMode(processedOptions) &&\n !processedOptions.executablePath\n ) {\n // 3.Set executable path if needed\n processedOptions.executablePath = findBrowserPath();\n\n // 4.Optimize args and ignoreDefaultArgs for launch mode\n setArgs();\n }\n\n return processedOptions;\n }\n\n #isConnectMode(options: LaunchOptions): boolean {\n return !!(options.browserWSEndpoint || options.browserURL);\n }\n\n async #launch(options: LaunchOptions): Promise<void> {\n this.pptrBrowser = await launch(options);\n\n if (!this.pptrBrowser) {\n throw new Error('Puppeteer browser not launch');\n }\n\n this.wsEndpoint = this.pptrBrowser.wsEndpoint();\n\n this._envInfo = await getEnvInfo(this.pptrBrowser);\n this._tabs = await Tabs.create(this.pptrBrowser, {\n viewport: this.defaultViewport,\n envInfo: this._envInfo,\n userAgentInfo: this.userAgentInfo,\n });\n this.setupAutoReconnect();\n }\n\n async #connect(options: LaunchOptions): Promise<void> {\n this.pptrBrowser = await connect(options);\n\n if (!this.pptrBrowser) {\n throw new Error('Puppeteer browser not connect');\n }\n\n this.wsEndpoint = this.pptrBrowser.wsEndpoint();\n\n this._envInfo = await getEnvInfo(this.pptrBrowser);\n this._tabs = await Tabs.create(this.pptrBrowser, {\n viewport: this.defaultViewport,\n envInfo: this._envInfo,\n userAgentInfo: this.userAgentInfo,\n });\n this.setupAutoReconnect();\n }\n\n override async performReconnect(): Promise<void> {\n const connectOptions = {\n browserWSEndpoint: this.wsEndpoint,\n defaultViewport: this.defaultViewport,\n };\n this.pptrBrowser = await connect(connectOptions);\n\n this.wsEndpoint = this.pptrBrowser.wsEndpoint();\n this._tabs = await Tabs.create(this.pptrBrowser, {\n viewport: this.defaultViewport,\n envInfo: this._envInfo!,\n });\n\n const activeTab = this.getActiveTab();\n if (activeTab) {\n await activeTab._active();\n }\n }\n\n // #endregion\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","_init","processOptions","isConnectMode","_launch","_connect","Browser","BaseBrowser","options","browser","init","cookies","filters","_this_pptrBrowser","connectOptions","connect","Tabs","activeTab","launch1","connect1","processedOptions","_processedOptions_executablePath","findBrowserPath","finder","BrowserFinder","browsers","foundBrowser","Error","setArgs","args","defaultArgs","windowSizeArg","arg","enableAutomationArg","Array","ignoreArgs","launch","getEnvInfo"],"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;;;;;;;;;;;;ACHC;;;;;;;;;;;IAsEOI,QAAAA,WAAAA,GAAAA,IAAAA,WAUNC,kBAAAA,WAAAA,GAAAA,IAAAA,WA6FAC,iBAAAA,WAAAA,GAAAA,IAAAA,WAIMC,UAAAA,WAAAA,GAAAA,IAAAA,WAkBAC,WAAAA,WAAAA,GAAAA,IAAAA;AApLD,MAAMC,gBAAgBC,iCAAAA,WAAWA;IAItC,aAAa,OACXC,UAA8C;QAAE,iBAAiB,CAAC;IAAE,CAAC,EACnD;QAClB,MAAMC,UAAU,IAAIH;QACpB,MAAMG,0BAAAA,SAAQC,OAAAA,MAAAA,IAAAA,CAARD,SAAcD,QAAQ,eAAe;QAC3C,OAAOC;IACT;IAcA,UAAU;QACR,OAAO,IAAI,CAAC,WAAW,CAAE,OAAO;IAClC;IAEA,UAAU,GAAGE,OAAqB,EAAE;QAClC,OAAO,IAAI,CAAC,WAAW,CAAE,SAAS,IAAIA;IACxC;IAEA,aAAa,GAAGA,OAAiB,EAAE;QACjC,OAAO,IAAI,CAAC,WAAW,CAAE,YAAY,IAAIA;IAC3C;IAEA,sBAAsB,GAAGC,OAA+B,EAAE;QACxD,OAAO,IAAI,CAAC,WAAW,CAAE,qBAAqB,IAAIA;IACpD;IAMA,MAAM,QAAQ;YAINC;QAHN,IAAI,CAAC,uBAAuB,GAAG;QAE/B,MAAM,IAAI,CAAC,cAAc;QACzB,eAAMA,CAAAA,oBAAAA,IAAI,CAAC,WAAW,AAAD,IAAfA,KAAAA,IAAAA,kBAAkB,KAAK,EAAC;IAChC;IAqJA,MAAe,mBAAkC;QAC/C,MAAMC,iBAAiB;YACrB,mBAAmB,IAAI,CAAC,UAAU;YAClC,iBAAiB,IAAI,CAAC,eAAe;QACvC;QACA,IAAI,CAAC,WAAW,GAAG,MAAMC,AAAAA,IAAAA,wCAAAA,OAAAA,AAAAA,EAAQD;QAEjC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU;QAC7C,IAAI,CAAC,KAAK,GAAG,MAAME,wBAAAA,IAAAA,CAAAA,MAAW,CAAC,IAAI,CAAC,WAAW,EAAE;YAC/C,UAAU,IAAI,CAAC,eAAe;YAC9B,SAAS,IAAI,CAAC,QAAQ;QACxB;QAEA,MAAMC,YAAY,IAAI,CAAC,YAAY;QACnC,IAAIA,WACF,MAAMA,UAAU,OAAO;IAE3B;IA3MA,aAAc;QACZ,KAAK,IA0CPP,2BAAAA,IAAAA,EAAMT,QAUNC,2BAAAA,IAAAA,EAAAA,kBA6FAC,2BAAAA,IAAAA,EAAAA,iBAIAe,2BAAAA,IAAAA,EAAMd,UAkBNe,2BAAAA,IAAAA,EAAMd;IAtKN;AA4MF;AAnKEK,eAAAA,KAAYF,OAAsB;IAChC,MAAMY,mBAAmB,8BAAI,EAAClB,iBAAAA,gBAAAA,IAAAA,CAAL,IAAI,EAAiBM;IAE9C,IAAI,8BAAI,EAACL,gBAAAA,eAAAA,IAAAA,CAAL,IAAI,EAAgBiB,mBACtB,MAAM,8BAAI,EAACD,UAAAA,UAAAA,IAAAA,CAAL,IAAI,EAAUC;SAEpB,MAAM,8BAAI,EAACF,SAAAA,SAAAA,IAAAA,CAAL,IAAI,EAASE;AAEvB;AAEAlB,SAAAA,eAAgBM,OAAsB;QAuElCa;IAtEF,MAAMD,mBAAmB;QAAE,GAAGZ,OAAO;IAAC;IAEtC,MAAMc,kBAAkB;QACtB,MAAMC,SAAS,IAAIC,+BAAAA,aAAaA;QAChC,MAAMC,WAAW;YAAC;YAAU;SAAO;QAEnC,MAAMC,eAAeD,SAAS,IAAI,CAAC,CAAChB;YAClC,IAAI;gBACFc,OAAO,WAAW,CAACd;gBACnB,OAAO;YACT,EAAE,OAAM;gBACN,OAAO;YACT;QACF;QAEA,IAAI,CAACiB,cACH,MAAM,IAAIC,MACR;QAIJ,OAAOJ,OAAO,WAAW,CAACG,cAAc,IAAI;IAC9C;IAEA,MAAME,UAAU;QACd,MAAMC,OAAOT,iBAAiB,IAAI,IAAI,EAAE;QAExC,MAAMU,cAAc;YAClB;YACA;YACA;SACD;QAGD,MAAMC,gBAAgB,CAAC,cAAc,EAAE,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,IAAI;QAGvG,KAAK,MAAMC,OAAOF,YAChB,IAAI,CAACD,KAAK,QAAQ,CAACG,MACjBH,KAAK,IAAI,CAACG;QAGd,IAAI,CAACH,KAAK,IAAI,CAAC,CAACG,MAAQA,IAAI,UAAU,CAAC,mBACrCH,KAAK,IAAI,CAACE;QAGZX,iBAAiB,IAAI,GAAGS;QAGxB,MAAMI,sBAAsB;QAC5B,IAAIb,iBAAiB,iBAAiB,EACpC;YAAA,IAAIc,MAAM,OAAO,CAACd,iBAAiB,iBAAiB,GAAG;gBACrD,MAAMe,aAAaf,iBAAiB,iBAAiB;gBACrD,IAAI,CAACe,WAAW,QAAQ,CAACF,sBACvBE,WAAW,IAAI,CAACF;YAEpB;QAAA,OAEAb,iBAAiB,iBAAiB,GAAG;YAACa;SAAoB;IAE9D;IAGAb,iBAAiB,eAAe,GAAG,IAAI,CAAC,kBAAkB,CACxDZ,QAAQ,eAAe;IAIzB,IACEY,AAA6B,cAA7BA,iBAAiB,OAAO,IAAK,SAC7BC,CAAAA,mCAAAA,iBAAiB,cAAc,AAAD,IAA9BA,KAAAA,IAAAA,iCAAiC,WAAW,GAAG,QAAQ,CAAC,UAAS,KACjED,AAA8B,oBAA9BA,iBAAiB,QAAQ,EAEzB,MAAM,IAAIO,MACR;IAIJ,IACE,CAAC,8BAAI,EAACxB,gBAAAA,eAAAA,IAAAA,CAAL,IAAI,EAAgBiB,qBACrB,CAACA,iBAAiB,cAAc,EAChC;QAEAA,iBAAiB,cAAc,GAAGE;QAGlCM;IACF;IAEA,OAAOR;AACT;AAEAjB,SAAAA,cAAeK,OAAsB;IACnC,OAAO,CAAC,CAAEA,CAAAA,QAAQ,iBAAiB,IAAIA,QAAQ,UAAS;AAC1D;AAEAU,eAAAA,QAAcV,OAAsB;IAClC,IAAI,CAAC,WAAW,GAAG,MAAM4B,AAAAA,IAAAA,wCAAAA,MAAAA,AAAAA,EAAO5B;IAEhC,IAAI,CAAC,IAAI,CAAC,WAAW,EACnB,MAAM,IAAImB,MAAM;IAGlB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU;IAE7C,IAAI,CAAC,QAAQ,GAAG,MAAMU,AAAAA,IAAAA,gCAAAA,UAAAA,AAAAA,EAAW,IAAI,CAAC,WAAW;IACjD,IAAI,CAAC,KAAK,GAAG,MAAMrB,wBAAAA,IAAAA,CAAAA,MAAW,CAAC,IAAI,CAAC,WAAW,EAAE;QAC/C,UAAU,IAAI,CAAC,eAAe;QAC9B,SAAS,IAAI,CAAC,QAAQ;QACtB,eAAe,IAAI,CAAC,aAAa;IACnC;IACA,IAAI,CAAC,kBAAkB;AACzB;AAEAG,eAAAA,SAAeX,OAAsB;IACnC,IAAI,CAAC,WAAW,GAAG,MAAMO,AAAAA,IAAAA,wCAAAA,OAAAA,AAAAA,EAAQP;IAEjC,IAAI,CAAC,IAAI,CAAC,WAAW,EACnB,MAAM,IAAImB,MAAM;IAGlB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU;IAE7C,IAAI,CAAC,QAAQ,GAAG,MAAMU,AAAAA,IAAAA,gCAAAA,UAAAA,AAAAA,EAAW,IAAI,CAAC,WAAW;IACjD,IAAI,CAAC,KAAK,GAAG,MAAMrB,wBAAAA,IAAAA,CAAAA,MAAW,CAAC,IAAI,CAAC,WAAW,EAAE;QAC/C,UAAU,IAAI,CAAC,eAAe;QAC9B,SAAS,IAAI,CAAC,QAAQ;QACtB,eAAe,IAAI,CAAC,aAAa;IACnC;IACA,IAAI,CAAC,kBAAkB;AACzB"}
@@ -20,9 +20,11 @@ function _class_private_method_init(obj, privateSet) {
20
20
  }
21
21
  var _init = /*#__PURE__*/ new WeakSet(), _processOptions = /*#__PURE__*/ new WeakSet(), _isConnectMode = /*#__PURE__*/ new WeakSet(), _launch = /*#__PURE__*/ new WeakSet(), _connect = /*#__PURE__*/ new WeakSet();
22
22
  class Browser extends BaseBrowser {
23
- static async create(options = {}) {
23
+ static async create(options = {
24
+ launchOrConnect: {}
25
+ }) {
24
26
  const browser = new Browser();
25
- await _class_private_method_get(browser, _init, init).call(browser, options);
27
+ await _class_private_method_get(browser, _init, init).call(browser, options.launchOrConnect);
26
28
  return browser;
27
29
  }
28
30
  cookies() {
@@ -1 +1 @@
1
- {"version":3,"file":"browser/browser.mjs","sources":["webpack://@agent-infra/browser/./src/browser/browser.ts"],"sourcesContent":["/*\n * Copyright (c) 2025 Bytedance, Inc. and its affiliates.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { launch, connect } from 'puppeteer-core';\nimport { BrowserFinder } from '@agent-infra/browser-finder';\nimport { Tabs } from '../tabs/tabs';\nimport { getEnvInfo } from '../env';\nimport { BaseBrowser } from './base';\n\nimport type {\n Cookie,\n CookieData,\n DeleteCookiesRequest,\n LaunchOptions,\n} from 'puppeteer-core';\n\nexport class Browser extends BaseBrowser<Tabs> {\n /**\n * Create a browser instance (launch or connect based on options)\n */\n static async create(options: LaunchOptions = {}): Promise<Browser> {\n const browser = new Browser();\n await browser.#init(options);\n return browser;\n }\n\n constructor() {\n super();\n }\n\n // #region cookies\n\n /**\n * cookies API\n *\n * @doc: https://pptr.dev/guides/cookies#setting-cookies\n */\n\n cookies() {\n return this.pptrBrowser!.cookies();\n }\n\n setCookie(...cookies: CookieData[]) {\n return this.pptrBrowser!.setCookie(...cookies);\n }\n\n deleteCookie(...cookies: Cookie[]) {\n return this.pptrBrowser!.deleteCookie(...cookies);\n }\n\n deleteMatchingCookies(...filters: DeleteCookiesRequest[]) {\n return this.pptrBrowser!.deleteMatchingCookies(...filters);\n }\n\n // #endregion\n\n // #region lifecycle\n\n async close() {\n this.isIntentionalDisconnect = true;\n\n await this.destroyAllTabs();\n await this.pptrBrowser?.close();\n }\n\n // #endregion\n\n // #region launch & connect\n\n async #init(options: LaunchOptions): Promise<void> {\n const processedOptions = this.#processOptions(options);\n\n if (this.#isConnectMode(processedOptions)) {\n await this.#connect(processedOptions);\n } else {\n await this.#launch(processedOptions);\n }\n }\n\n #processOptions(options: LaunchOptions): LaunchOptions {\n const processedOptions = { ...options };\n\n const findBrowserPath = () => {\n const finder = new BrowserFinder();\n const browsers = ['chrome', 'edge'] as const;\n\n const foundBrowser = browsers.find((browser) => {\n try {\n finder.findBrowser(browser);\n return true;\n } catch {\n return false;\n }\n });\n\n if (!foundBrowser) {\n throw new Error(\n 'No Chrome or Edge browser found. Please install Chrome or Edge browser first.',\n );\n }\n\n return finder.findBrowser(foundBrowser).path;\n };\n\n const setArgs = () => {\n const args = processedOptions.args || [];\n // https://github.com/GoogleChrome/chrome-launcher/blob/main/docs/chrome-flags-for-tools.md\n const defaultArgs = [\n '--mute-audio', // Mute any audio\n '--no-default-browser-check', // Disable the default browser check, do not prompt to set it as such\n '--ash-no-nudges', // Avoids blue bubble \"user education\" nudges\n ];\n // window-size includes some Chrome UI components (such as tabs, URL input box, etc.),\n // so an additional 90 pixels should be added to the viewport height.\n const windowSizeArg = `--window-size=${this.defaultViewport.width},${this.defaultViewport.height + 90}`;\n\n // args\n for (const arg of defaultArgs) {\n if (!args.includes(arg)) {\n args.push(arg);\n }\n }\n if (!args.find((arg) => arg.startsWith('--window-size'))) {\n args.push(windowSizeArg);\n }\n\n processedOptions.args = args;\n\n // ignoreArgs\n const enableAutomationArg = '--enable-automation';\n if (processedOptions.ignoreDefaultArgs) {\n if (Array.isArray(processedOptions.ignoreDefaultArgs)) {\n const ignoreArgs = processedOptions.ignoreDefaultArgs;\n if (!ignoreArgs.includes(enableAutomationArg)) {\n ignoreArgs.push(enableAutomationArg);\n }\n }\n } else {\n processedOptions.ignoreDefaultArgs = [enableAutomationArg];\n }\n };\n\n // 1.Set default viewport\n processedOptions.defaultViewport = this.setDefaultViewport(\n options.defaultViewport,\n );\n\n // 2.Validate browser type\n if (\n processedOptions.browser === 'firefox' ||\n processedOptions.executablePath?.toLowerCase().includes('firefox') ||\n processedOptions.protocol === 'webDriverBiDi'\n ) {\n throw new Error(\n 'Firefox is not supported. This package is based on CDP (Chrome DevTools Protocol).',\n );\n }\n\n if (\n !this.#isConnectMode(processedOptions) &&\n !processedOptions.executablePath\n ) {\n // 3.Set executable path if needed\n processedOptions.executablePath = findBrowserPath();\n\n // 4.Optimize args and ignoreDefaultArgs for launch mode\n setArgs();\n }\n\n return processedOptions;\n }\n\n #isConnectMode(options: LaunchOptions): boolean {\n return !!(options.browserWSEndpoint || options.browserURL);\n }\n\n async #launch(options: LaunchOptions): Promise<void> {\n this.pptrBrowser = await launch(options);\n\n if (!this.pptrBrowser) {\n throw new Error('Puppeteer browser not launch');\n }\n\n this.wsEndpoint = this.pptrBrowser.wsEndpoint();\n\n this._envInfo = await getEnvInfo(this.pptrBrowser);\n this._tabs = await Tabs.create(this.pptrBrowser, {\n viewport: this.defaultViewport,\n envInfo: this._envInfo,\n userAgentInfo: this.userAgentInfo,\n });\n this.setupAutoReconnect();\n }\n\n async #connect(options: LaunchOptions): Promise<void> {\n this.pptrBrowser = await connect(options);\n\n if (!this.pptrBrowser) {\n throw new Error('Puppeteer browser not connect');\n }\n\n this.wsEndpoint = this.pptrBrowser.wsEndpoint();\n\n this._envInfo = await getEnvInfo(this.pptrBrowser);\n this._tabs = await Tabs.create(this.pptrBrowser, {\n viewport: this.defaultViewport,\n envInfo: this._envInfo,\n userAgentInfo: this.userAgentInfo,\n });\n this.setupAutoReconnect();\n }\n\n override async performReconnect(): Promise<void> {\n const connectOptions = {\n browserWSEndpoint: this.wsEndpoint,\n defaultViewport: this.defaultViewport,\n };\n this.pptrBrowser = await connect(connectOptions);\n\n this.wsEndpoint = this.pptrBrowser.wsEndpoint();\n this._tabs = await Tabs.create(this.pptrBrowser, {\n viewport: this.defaultViewport,\n envInfo: this._envInfo!,\n });\n\n const activeTab = this.getActiveTab();\n if (activeTab) {\n await activeTab._active();\n }\n }\n\n // #endregion\n}\n"],"names":["_init","processOptions","isConnectMode","_launch","_connect","Browser","BaseBrowser","options","browser","init","cookies","filters","_this_pptrBrowser","connectOptions","connect","Tabs","activeTab","launch1","connect1","processedOptions","_processedOptions_executablePath","findBrowserPath","finder","BrowserFinder","browsers","foundBrowser","Error","setArgs","args","defaultArgs","windowSizeArg","arg","enableAutomationArg","Array","ignoreArgs","launch","getEnvInfo"],"mappings":"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"}
1
+ {"version":3,"file":"browser/browser.mjs","sources":["webpack://@agent-infra/browser/./src/browser/browser.ts"],"sourcesContent":["/*\n * Copyright (c) 2025 Bytedance, Inc. and its affiliates.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { launch, connect } from 'puppeteer-core';\nimport { BrowserFinder } from '@agent-infra/browser-finder';\nimport { Tabs } from '../tabs/tabs';\nimport { getEnvInfo } from '../env';\nimport { BaseBrowser } from './base';\n\nimport type {\n Cookie,\n CookieData,\n DeleteCookiesRequest,\n LaunchOptions,\n} from 'puppeteer-core';\n\nexport class Browser extends BaseBrowser<Tabs> {\n /**\n * Create a browser instance (launch or connect based on options)\n */\n static async create(\n options: { launchOrConnect: LaunchOptions } = { launchOrConnect: {} },\n ): Promise<Browser> {\n const browser = new Browser();\n await browser.#init(options.launchOrConnect);\n return browser;\n }\n\n constructor() {\n super();\n }\n\n // #region cookies\n\n /**\n * cookies API\n *\n * @doc: https://pptr.dev/guides/cookies#setting-cookies\n */\n\n cookies() {\n return this.pptrBrowser!.cookies();\n }\n\n setCookie(...cookies: CookieData[]) {\n return this.pptrBrowser!.setCookie(...cookies);\n }\n\n deleteCookie(...cookies: Cookie[]) {\n return this.pptrBrowser!.deleteCookie(...cookies);\n }\n\n deleteMatchingCookies(...filters: DeleteCookiesRequest[]) {\n return this.pptrBrowser!.deleteMatchingCookies(...filters);\n }\n\n // #endregion\n\n // #region lifecycle\n\n async close() {\n this.isIntentionalDisconnect = true;\n\n await this.destroyAllTabs();\n await this.pptrBrowser?.close();\n }\n\n // #endregion\n\n // #region launch & connect\n\n async #init(options: LaunchOptions): Promise<void> {\n const processedOptions = this.#processOptions(options);\n\n if (this.#isConnectMode(processedOptions)) {\n await this.#connect(processedOptions);\n } else {\n await this.#launch(processedOptions);\n }\n }\n\n #processOptions(options: LaunchOptions): LaunchOptions {\n const processedOptions = { ...options };\n\n const findBrowserPath = () => {\n const finder = new BrowserFinder();\n const browsers = ['chrome', 'edge'] as const;\n\n const foundBrowser = browsers.find((browser) => {\n try {\n finder.findBrowser(browser);\n return true;\n } catch {\n return false;\n }\n });\n\n if (!foundBrowser) {\n throw new Error(\n 'No Chrome or Edge browser found. Please install Chrome or Edge browser first.',\n );\n }\n\n return finder.findBrowser(foundBrowser).path;\n };\n\n const setArgs = () => {\n const args = processedOptions.args || [];\n // https://github.com/GoogleChrome/chrome-launcher/blob/main/docs/chrome-flags-for-tools.md\n const defaultArgs = [\n '--mute-audio', // Mute any audio\n '--no-default-browser-check', // Disable the default browser check, do not prompt to set it as such\n '--ash-no-nudges', // Avoids blue bubble \"user education\" nudges\n ];\n // window-size includes some Chrome UI components (such as tabs, URL input box, etc.),\n // so an additional 90 pixels should be added to the viewport height.\n const windowSizeArg = `--window-size=${this.defaultViewport.width},${this.defaultViewport.height + 90}`;\n\n // args\n for (const arg of defaultArgs) {\n if (!args.includes(arg)) {\n args.push(arg);\n }\n }\n if (!args.find((arg) => arg.startsWith('--window-size'))) {\n args.push(windowSizeArg);\n }\n\n processedOptions.args = args;\n\n // ignoreArgs\n const enableAutomationArg = '--enable-automation';\n if (processedOptions.ignoreDefaultArgs) {\n if (Array.isArray(processedOptions.ignoreDefaultArgs)) {\n const ignoreArgs = processedOptions.ignoreDefaultArgs;\n if (!ignoreArgs.includes(enableAutomationArg)) {\n ignoreArgs.push(enableAutomationArg);\n }\n }\n } else {\n processedOptions.ignoreDefaultArgs = [enableAutomationArg];\n }\n };\n\n // 1.Set default viewport\n processedOptions.defaultViewport = this.setDefaultViewport(\n options.defaultViewport,\n );\n\n // 2.Validate browser type\n if (\n processedOptions.browser === 'firefox' ||\n processedOptions.executablePath?.toLowerCase().includes('firefox') ||\n processedOptions.protocol === 'webDriverBiDi'\n ) {\n throw new Error(\n 'Firefox is not supported. This package is based on CDP (Chrome DevTools Protocol).',\n );\n }\n\n if (\n !this.#isConnectMode(processedOptions) &&\n !processedOptions.executablePath\n ) {\n // 3.Set executable path if needed\n processedOptions.executablePath = findBrowserPath();\n\n // 4.Optimize args and ignoreDefaultArgs for launch mode\n setArgs();\n }\n\n return processedOptions;\n }\n\n #isConnectMode(options: LaunchOptions): boolean {\n return !!(options.browserWSEndpoint || options.browserURL);\n }\n\n async #launch(options: LaunchOptions): Promise<void> {\n this.pptrBrowser = await launch(options);\n\n if (!this.pptrBrowser) {\n throw new Error('Puppeteer browser not launch');\n }\n\n this.wsEndpoint = this.pptrBrowser.wsEndpoint();\n\n this._envInfo = await getEnvInfo(this.pptrBrowser);\n this._tabs = await Tabs.create(this.pptrBrowser, {\n viewport: this.defaultViewport,\n envInfo: this._envInfo,\n userAgentInfo: this.userAgentInfo,\n });\n this.setupAutoReconnect();\n }\n\n async #connect(options: LaunchOptions): Promise<void> {\n this.pptrBrowser = await connect(options);\n\n if (!this.pptrBrowser) {\n throw new Error('Puppeteer browser not connect');\n }\n\n this.wsEndpoint = this.pptrBrowser.wsEndpoint();\n\n this._envInfo = await getEnvInfo(this.pptrBrowser);\n this._tabs = await Tabs.create(this.pptrBrowser, {\n viewport: this.defaultViewport,\n envInfo: this._envInfo,\n userAgentInfo: this.userAgentInfo,\n });\n this.setupAutoReconnect();\n }\n\n override async performReconnect(): Promise<void> {\n const connectOptions = {\n browserWSEndpoint: this.wsEndpoint,\n defaultViewport: this.defaultViewport,\n };\n this.pptrBrowser = await connect(connectOptions);\n\n this.wsEndpoint = this.pptrBrowser.wsEndpoint();\n this._tabs = await Tabs.create(this.pptrBrowser, {\n viewport: this.defaultViewport,\n envInfo: this._envInfo!,\n });\n\n const activeTab = this.getActiveTab();\n if (activeTab) {\n await activeTab._active();\n }\n }\n\n // #endregion\n}\n"],"names":["_init","processOptions","isConnectMode","_launch","_connect","Browser","BaseBrowser","options","browser","init","cookies","filters","_this_pptrBrowser","connectOptions","connect","Tabs","activeTab","launch1","connect1","processedOptions","_processedOptions_executablePath","findBrowserPath","finder","BrowserFinder","browsers","foundBrowser","Error","setArgs","args","defaultArgs","windowSizeArg","arg","enableAutomationArg","Array","ignoreArgs","launch","getEnvInfo"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- export declare const visibilityScript = "\nfunction agentInfraVisibilityScript() {\n if (window.top !== window) {\n return;\n }\n\n console.log('[agent-infra] visibility script injected');\n\n const handleVisibilityChange = () => {\n const isVisible = document.visibilityState === 'visible';\n if (typeof window.__agent_infra_visibility_change === 'function') {\n window.__agent_infra_visibility_change(isVisible);\n }\n }\n\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', handleVisibilityChange);\n } else {\n handleVisibilityChange();\n }\n\n window.addEventListener('visibilitychange', handleVisibilityChange, { capture: true });\n}\nagentInfraVisibilityScript();\n";
1
+ export declare const visibilityScript = "\nfunction agentInfraVisibilityScript() {\n if (window.__agent_infra_browser.visibility) {\n return;\n }\n window.__agent_infra_browser.visibility = true;\n\n if (window.top !== window) {\n return;\n }\n\n console.log('[agent-infra] visibility script injected');\n\n const handleVisibilityChange = () => {\n const isVisible = document.visibilityState === 'visible';\n if (typeof window.__agent_infra_visibility_change === 'function') {\n window.__agent_infra_visibility_change(isVisible);\n }\n }\n\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', handleVisibilityChange);\n } else {\n handleVisibilityChange();\n }\n\n window.addEventListener('visibilitychange', handleVisibilityChange, { capture: true });\n}\nagentInfraVisibilityScript();\n";
2
2
  //# sourceMappingURL=visibility.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"visibility.d.ts","sourceRoot":"","sources":["../../src/injected-script/visibility.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,gBAAgB,msBAwB5B,CAAC"}
1
+ {"version":3,"file":"visibility.d.ts","sourceRoot":"","sources":["../../src/injected-script/visibility.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,gBAAgB,4zBA6B5B,CAAC"}
@@ -32,6 +32,11 @@ __webpack_require__.d(__webpack_exports__, {
32
32
  });
33
33
  const visibilityScript = `
34
34
  function agentInfraVisibilityScript() {
35
+ if (window.__agent_infra_browser.visibility) {
36
+ return;
37
+ }
38
+ window.__agent_infra_browser.visibility = true;
39
+
35
40
  if (window.top !== window) {
36
41
  return;
37
42
  }
@@ -1 +1 @@
1
- {"version":3,"file":"injected-script/visibility.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/injected-script/visibility.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\n// install \"es6-string-html\" vscode Extensions to highlight string code\n\n// https://developer.chrome.com/docs/web-platform/page-lifecycle-api\n\nexport const visibilityScript = /* javascript */ `\nfunction agentInfraVisibilityScript() {\n if (window.top !== window) {\n return;\n }\n\n console.log('[agent-infra] visibility script injected');\n\n const handleVisibilityChange = () => {\n const isVisible = document.visibilityState === 'visible';\n if (typeof window.__agent_infra_visibility_change === 'function') {\n window.__agent_infra_visibility_change(isVisible);\n }\n }\n\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', handleVisibilityChange);\n } else {\n handleVisibilityChange();\n }\n\n window.addEventListener('visibilitychange', handleVisibilityChange, { capture: true });\n}\nagentInfraVisibilityScript();\n`;\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","visibilityScript"],"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;;;;;;;ACGO,MAAMI,mBAAoC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;AAwBlD,CAAC"}
1
+ {"version":3,"file":"injected-script/visibility.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/injected-script/visibility.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\n// install \"es6-string-html\" vscode Extensions to highlight string code\n\n// https://developer.chrome.com/docs/web-platform/page-lifecycle-api\n\nexport const visibilityScript = /* javascript */ `\nfunction agentInfraVisibilityScript() {\n if (window.__agent_infra_browser.visibility) {\n return;\n }\n window.__agent_infra_browser.visibility = true;\n\n if (window.top !== window) {\n return;\n }\n\n console.log('[agent-infra] visibility script injected');\n\n const handleVisibilityChange = () => {\n const isVisible = document.visibilityState === 'visible';\n if (typeof window.__agent_infra_visibility_change === 'function') {\n window.__agent_infra_visibility_change(isVisible);\n }\n }\n\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', handleVisibilityChange);\n } else {\n handleVisibilityChange();\n }\n\n window.addEventListener('visibilitychange', handleVisibilityChange, { capture: true });\n}\nagentInfraVisibilityScript();\n`;\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","visibilityScript"],"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;;;;;;;ACGO,MAAMI,mBAAoC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BlD,CAAC"}
@@ -4,6 +4,11 @@
4
4
  */
5
5
  const visibilityScript = `
6
6
  function agentInfraVisibilityScript() {
7
+ if (window.__agent_infra_browser.visibility) {
8
+ return;
9
+ }
10
+ window.__agent_infra_browser.visibility = true;
11
+
7
12
  if (window.top !== window) {
8
13
  return;
9
14
  }
@@ -1 +1 @@
1
- {"version":3,"file":"injected-script/visibility.mjs","sources":["webpack://@agent-infra/browser/./src/injected-script/visibility.ts"],"sourcesContent":["/*\n * Copyright (c) 2025 Bytedance, Inc. and its affiliates.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// install \"es6-string-html\" vscode Extensions to highlight string code\n\n// https://developer.chrome.com/docs/web-platform/page-lifecycle-api\n\nexport const visibilityScript = /* javascript */ `\nfunction agentInfraVisibilityScript() {\n if (window.top !== window) {\n return;\n }\n\n console.log('[agent-infra] visibility script injected');\n\n const handleVisibilityChange = () => {\n const isVisible = document.visibilityState === 'visible';\n if (typeof window.__agent_infra_visibility_change === 'function') {\n window.__agent_infra_visibility_change(isVisible);\n }\n }\n\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', handleVisibilityChange);\n } else {\n handleVisibilityChange();\n }\n\n window.addEventListener('visibilitychange', handleVisibilityChange, { capture: true });\n}\nagentInfraVisibilityScript();\n`;\n"],"names":["visibilityScript"],"mappings":";;;;AASO,MAAMA,mBAAoC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;AAwBlD,CAAC"}
1
+ {"version":3,"file":"injected-script/visibility.mjs","sources":["webpack://@agent-infra/browser/./src/injected-script/visibility.ts"],"sourcesContent":["/*\n * Copyright (c) 2025 Bytedance, Inc. and its affiliates.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// install \"es6-string-html\" vscode Extensions to highlight string code\n\n// https://developer.chrome.com/docs/web-platform/page-lifecycle-api\n\nexport const visibilityScript = /* javascript */ `\nfunction agentInfraVisibilityScript() {\n if (window.__agent_infra_browser.visibility) {\n return;\n }\n window.__agent_infra_browser.visibility = true;\n\n if (window.top !== window) {\n return;\n }\n\n console.log('[agent-infra] visibility script injected');\n\n const handleVisibilityChange = () => {\n const isVisible = document.visibilityState === 'visible';\n if (typeof window.__agent_infra_visibility_change === 'function') {\n window.__agent_infra_visibility_change(isVisible);\n }\n }\n\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', handleVisibilityChange);\n } else {\n handleVisibilityChange();\n }\n\n window.addEventListener('visibilitychange', handleVisibilityChange, { capture: true });\n}\nagentInfraVisibilityScript();\n`;\n"],"names":["visibilityScript"],"mappings":";;;;AASO,MAAMA,mBAAoC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BlD,CAAC"}
@@ -1,2 +1,2 @@
1
- export declare const disableWebdriver = "\nfunction agentInfraDriver() {\n delete navigator.webdriver;\n\n const originalNavigator = navigator;\n const navigatorHandler = {\n get(target, prop) {\n if (prop === 'webdriver') {\n return false;\n }\n return Reflect.get(target, prop);\n }\n };\n\n try {\n Object.defineProperty(window, 'navigator', {\n value: new Proxy(originalNavigator, navigatorHandler),\n writable: false,\n configurable: false\n });\n } catch (e) {\n Object.defineProperty(originalNavigator, 'webdriver', {\n get: () => false,\n enumerable: false,\n configurable: true\n });\n }\n}\nagentInfraDriver();\n";
1
+ export declare const disableWebdriver = "\nfunction agentInfraDriver() {\n if (window.__agent_infra_browser.webdriver) {\n return;\n }\n window.__agent_infra_browser.webdriver = true;\n\n delete navigator.webdriver;\n\n const originalNavigator = navigator;\n const navigatorHandler = {\n get(target, prop) {\n if (prop === 'webdriver') {\n return false;\n }\n return Reflect.get(target, prop);\n }\n };\n\n try {\n Object.defineProperty(window, 'navigator', {\n value: new Proxy(originalNavigator, navigatorHandler),\n writable: false,\n configurable: false\n });\n } catch (e) {\n Object.defineProperty(originalNavigator, 'webdriver', {\n get: () => false,\n enumerable: false,\n configurable: true\n });\n }\n}\nagentInfraDriver();\n";
2
2
  //# sourceMappingURL=webdriver.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"webdriver.d.ts","sourceRoot":"","sources":["../../src/injected-script/webdriver.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,gBAAgB,upBA6B5B,CAAC"}
1
+ {"version":3,"file":"webdriver.d.ts","sourceRoot":"","sources":["../../src/injected-script/webdriver.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,gBAAgB,8wBAkC5B,CAAC"}
@@ -32,6 +32,11 @@ __webpack_require__.d(__webpack_exports__, {
32
32
  });
33
33
  const disableWebdriver = `
34
34
  function agentInfraDriver() {
35
+ if (window.__agent_infra_browser.webdriver) {
36
+ return;
37
+ }
38
+ window.__agent_infra_browser.webdriver = true;
39
+
35
40
  delete navigator.webdriver;
36
41
 
37
42
  const originalNavigator = navigator;
@@ -1 +1 @@
1
- {"version":3,"file":"injected-script/webdriver.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/injected-script/webdriver.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\n// install \"es6-string-html\" vscode Extensions to highlight string code\n\nexport const disableWebdriver = /* javascript */ `\nfunction agentInfraDriver() {\n delete navigator.webdriver;\n\n const originalNavigator = navigator;\n const navigatorHandler = {\n get(target, prop) {\n if (prop === 'webdriver') {\n return false;\n }\n return Reflect.get(target, prop);\n }\n };\n\n try {\n Object.defineProperty(window, 'navigator', {\n value: new Proxy(originalNavigator, navigatorHandler),\n writable: false,\n configurable: false\n });\n } catch (e) {\n Object.defineProperty(originalNavigator, 'webdriver', {\n get: () => false,\n enumerable: false,\n configurable: true\n });\n }\n}\nagentInfraDriver();\n`;\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","disableWebdriver"],"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;;;;;;;ACCO,MAAMI,mBAAoC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BlD,CAAC"}
1
+ {"version":3,"file":"injected-script/webdriver.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/injected-script/webdriver.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\n// install \"es6-string-html\" vscode Extensions to highlight string code\n\nexport const disableWebdriver = /* javascript */ `\nfunction agentInfraDriver() {\n if (window.__agent_infra_browser.webdriver) {\n return;\n }\n window.__agent_infra_browser.webdriver = true;\n\n delete navigator.webdriver;\n\n const originalNavigator = navigator;\n const navigatorHandler = {\n get(target, prop) {\n if (prop === 'webdriver') {\n return false;\n }\n return Reflect.get(target, prop);\n }\n };\n\n try {\n Object.defineProperty(window, 'navigator', {\n value: new Proxy(originalNavigator, navigatorHandler),\n writable: false,\n configurable: false\n });\n } catch (e) {\n Object.defineProperty(originalNavigator, 'webdriver', {\n get: () => false,\n enumerable: false,\n configurable: true\n });\n }\n}\nagentInfraDriver();\n`;\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","disableWebdriver"],"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;;;;;;;ACCO,MAAMI,mBAAoC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkClD,CAAC"}
@@ -4,6 +4,11 @@
4
4
  */
5
5
  const disableWebdriver = `
6
6
  function agentInfraDriver() {
7
+ if (window.__agent_infra_browser.webdriver) {
8
+ return;
9
+ }
10
+ window.__agent_infra_browser.webdriver = true;
11
+
7
12
  delete navigator.webdriver;
8
13
 
9
14
  const originalNavigator = navigator;
@@ -1 +1 @@
1
- {"version":3,"file":"injected-script/webdriver.mjs","sources":["webpack://@agent-infra/browser/./src/injected-script/webdriver.ts"],"sourcesContent":["/*\n * Copyright (c) 2025 Bytedance, Inc. and its affiliates.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// install \"es6-string-html\" vscode Extensions to highlight string code\n\nexport const disableWebdriver = /* javascript */ `\nfunction agentInfraDriver() {\n delete navigator.webdriver;\n\n const originalNavigator = navigator;\n const navigatorHandler = {\n get(target, prop) {\n if (prop === 'webdriver') {\n return false;\n }\n return Reflect.get(target, prop);\n }\n };\n\n try {\n Object.defineProperty(window, 'navigator', {\n value: new Proxy(originalNavigator, navigatorHandler),\n writable: false,\n configurable: false\n });\n } catch (e) {\n Object.defineProperty(originalNavigator, 'webdriver', {\n get: () => false,\n enumerable: false,\n configurable: true\n });\n }\n}\nagentInfraDriver();\n`;\n"],"names":["disableWebdriver"],"mappings":";;;;AAOO,MAAMA,mBAAoC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BlD,CAAC"}
1
+ {"version":3,"file":"injected-script/webdriver.mjs","sources":["webpack://@agent-infra/browser/./src/injected-script/webdriver.ts"],"sourcesContent":["/*\n * Copyright (c) 2025 Bytedance, Inc. and its affiliates.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// install \"es6-string-html\" vscode Extensions to highlight string code\n\nexport const disableWebdriver = /* javascript */ `\nfunction agentInfraDriver() {\n if (window.__agent_infra_browser.webdriver) {\n return;\n }\n window.__agent_infra_browser.webdriver = true;\n\n delete navigator.webdriver;\n\n const originalNavigator = navigator;\n const navigatorHandler = {\n get(target, prop) {\n if (prop === 'webdriver') {\n return false;\n }\n return Reflect.get(target, prop);\n }\n };\n\n try {\n Object.defineProperty(window, 'navigator', {\n value: new Proxy(originalNavigator, navigatorHandler),\n writable: false,\n configurable: false\n });\n } catch (e) {\n Object.defineProperty(originalNavigator, 'webdriver', {\n get: () => false,\n enumerable: false,\n configurable: true\n });\n }\n}\nagentInfraDriver();\n`;\n"],"names":["disableWebdriver"],"mappings":";;;;AAOO,MAAMA,mBAAoC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkClD,CAAC"}
@@ -6,6 +6,7 @@ import { type NavigationOptions, type NavigationResult, type TabEventsMap, type
6
6
  export declare class Tab extends EventEmitter<TabEventsMap> {
7
7
  #private;
8
8
  constructor(page: Page, options: TabOptions);
9
+ init(): Promise<void>;
9
10
  get tabId(): string;
10
11
  get page(): Page;
11
12
  get url(): string;
@@ -1 +1 @@
1
- {"version":3,"file":"tab.d.ts","sourceRoot":"","sources":["../../src/tabs/tab.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAI7C,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE7C,OAAO,KAAK,EAAE,IAAI,EAAqB,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACzB,MAAM,UAAU,CAAC;AAElB,qBAAa,GAAI,SAAQ,YAAY,CAAC,YAAY,CAAC;;gBAsBrC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU;IA+B3C,IAAI,KAAK,WAER;IAED,IAAI,IAAI,SAEP;IAED,IAAI,GAAG,WAEN;IAEK,QAAQ;IAQR,UAAU;IAiChB;;OAEG;IACG,OAAO;IAKb;;OAEG;IACG,SAAS;IAIf;;OAEG;IACG,6BAA6B;IAkBnC,IAAI,MAAM,cAET;IAED,IAAI,QAAQ,aAEX;IAED,IAAI,KAAK,UAER;IAMK,UAAU,CAAC,CAAC,SAAS,oBAAoB,EAC7C,OAAO,GAAE,CAAW,GACnB,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;IAsC5B,UAAU;;;;;;;;;IAsBV,IAAI,CACR,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,gBAAgB,CAAC;IA+CtB,MAAM,CAAC,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAiClE,SAAS,CAAC,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAiCrE,MAAM,CAAC,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAmCxE;;OAEG;IACG,MAAM;IAiEZ,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE;IAQ9C,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE;CAwF7C"}
1
+ {"version":3,"file":"tab.d.ts","sourceRoot":"","sources":["../../src/tabs/tab.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAI7C,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE7C,OAAO,KAAK,EAAE,IAAI,EAAqB,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACzB,MAAM,UAAU,CAAC;AAElB,qBAAa,GAAI,SAAQ,YAAY,CAAC,YAAY,CAAC;;gBAsBrC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU;IAqBrC,IAAI;IAgBV,IAAI,KAAK,WAER;IAED,IAAI,IAAI,SAEP;IAED,IAAI,GAAG,WAEN;IAEK,QAAQ;IAMR,UAAU;IA+BhB;;OAEG;IACG,OAAO;IAKb;;OAEG;IACG,SAAS;IAIf;;OAEG;IACG,6BAA6B;IAkBnC,IAAI,MAAM,cAET;IAED,IAAI,QAAQ,aAEX;IAED,IAAI,KAAK,UAER;IAMK,UAAU,CAAC,CAAC,SAAS,oBAAoB,EAC7C,OAAO,GAAE,CAAW,GACnB,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;IAsC5B,UAAU;;;;;;;;;IAsBV,IAAI,CACR,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,gBAAgB,CAAC;IAwCtB,MAAM,CAAC,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAiClE,SAAS,CAAC,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAiCrE,MAAM,CAAC,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAmCxE;;OAEG;IACG,MAAM;IAiDZ,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE;IAQ9C,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE;CAmH7C"}