@agent-infra/browser 0.0.2 → 0.1.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.
- package/dist/base-browser.d.ts +5 -0
- package/dist/base-browser.d.ts.map +1 -1
- package/dist/base-browser.js +12 -0
- package/dist/base-browser.js.map +1 -1
- package/dist/base-browser.mjs +12 -0
- package/dist/base-browser.mjs.map +1 -1
- package/dist/browser-finder/chrome-paths.d.ts +10 -0
- package/dist/browser-finder/chrome-paths.d.ts.map +1 -0
- package/dist/browser-finder/chrome-paths.js +160 -0
- package/dist/browser-finder/chrome-paths.js.map +1 -0
- package/dist/browser-finder/chrome-paths.mjs +118 -0
- package/dist/browser-finder/chrome-paths.mjs.map +1 -0
- package/dist/browser-finder/firefox-paths.d.ts +2 -0
- package/dist/browser-finder/firefox-paths.d.ts.map +1 -0
- package/dist/browser-finder/firefox-paths.js +132 -0
- package/dist/browser-finder/firefox-paths.js.map +1 -0
- package/dist/browser-finder/firefox-paths.mjs +90 -0
- package/dist/browser-finder/firefox-paths.mjs.map +1 -0
- package/dist/browser-finder/index.d.ts +15 -0
- package/dist/browser-finder/index.d.ts.map +1 -0
- package/dist/browser-finder/index.js +151 -0
- package/dist/browser-finder/index.js.map +1 -0
- package/dist/browser-finder/index.mjs +119 -0
- package/dist/browser-finder/index.mjs.map +1 -0
- package/dist/browser-finder/index.test.d.ts +2 -0
- package/dist/browser-finder/index.test.d.ts.map +1 -0
- package/dist/index.js +1 -1
- package/dist/index.mjs +1 -1
- package/dist/local-browser.d.ts +2 -6
- package/dist/local-browser.d.ts.map +1 -1
- package/dist/local-browser.js +42 -19
- package/dist/local-browser.js.map +1 -1
- package/dist/local-browser.mjs +42 -19
- package/dist/local-browser.mjs.map +1 -1
- package/dist/remote-browser.d.ts +3 -4
- package/dist/remote-browser.d.ts.map +1 -1
- package/dist/remote-browser.js +3 -4
- package/dist/remote-browser.js.map +1 -1
- package/dist/remote-browser.mjs +3 -4
- package/dist/remote-browser.mjs.map +1 -1
- package/dist/types.d.ts +28 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +0 -15
- package/dist/types.mjs +0 -3
- package/package.json +5 -2
- package/dist/browser-finder.d.ts +0 -59
- package/dist/browser-finder.d.ts.map +0 -1
- package/dist/browser-finder.js +0 -148
- package/dist/browser-finder.js.map +0 -1
- package/dist/browser-finder.mjs +0 -116
- package/dist/browser-finder.mjs.map +0 -1
- package/dist/browser-finder.test.d.ts +0 -2
- package/dist/browser-finder.test.d.ts.map +0 -1
package/dist/local-browser.mjs
CHANGED
|
@@ -3,32 +3,27 @@
|
|
|
3
3
|
* SPDX-License-Identifier: Apache-2.0
|
|
4
4
|
*/
|
|
5
5
|
import * as __WEBPACK_EXTERNAL_MODULE_puppeteer_core_17481843__ from "puppeteer-core";
|
|
6
|
-
import * as
|
|
6
|
+
import * as __WEBPACK_EXTERNAL_MODULE__browser_finder_index_mjs_208fd54f__ from "./browser-finder/index.mjs";
|
|
7
7
|
import * as __WEBPACK_EXTERNAL_MODULE__base_browser_mjs_64d751a3__ from "./base-browser.mjs";
|
|
8
|
-
function _define_property(obj, key, value) {
|
|
9
|
-
if (key in obj) Object.defineProperty(obj, key, {
|
|
10
|
-
value: value,
|
|
11
|
-
enumerable: true,
|
|
12
|
-
configurable: true,
|
|
13
|
-
writable: true
|
|
14
|
-
});
|
|
15
|
-
else obj[key] = value;
|
|
16
|
-
return obj;
|
|
17
|
-
}
|
|
18
8
|
class LocalBrowser extends __WEBPACK_EXTERNAL_MODULE__base_browser_mjs_64d751a3__.BaseBrowser {
|
|
19
9
|
async launch(options = {}) {
|
|
20
10
|
var _options_defaultViewport, _options_defaultViewport1;
|
|
21
11
|
this.logger.info('Launching browser with options:', options);
|
|
22
|
-
const
|
|
23
|
-
this.logger.info('Using executable path:', executablePath);
|
|
12
|
+
const { path, type } = this.getBrowserInfo(options);
|
|
24
13
|
const viewportWidth = (null == options ? void 0 : null === (_options_defaultViewport = options.defaultViewport) || void 0 === _options_defaultViewport ? void 0 : _options_defaultViewport.width) ?? 1280;
|
|
25
14
|
const viewportHeight = (null == options ? void 0 : null === (_options_defaultViewport1 = options.defaultViewport) || void 0 === _options_defaultViewport1 ? void 0 : _options_defaultViewport1.height) ?? 800;
|
|
26
15
|
const puppeteerLaunchOptions = {
|
|
27
|
-
|
|
16
|
+
browser: type,
|
|
17
|
+
executablePath: path,
|
|
18
|
+
dumpio: (null == options ? void 0 : options.dumpio) ?? false,
|
|
28
19
|
headless: (null == options ? void 0 : options.headless) ?? false,
|
|
29
20
|
defaultViewport: {
|
|
30
21
|
width: viewportWidth,
|
|
31
|
-
height: viewportHeight
|
|
22
|
+
height: viewportHeight,
|
|
23
|
+
deviceScaleFactor: 0
|
|
24
|
+
},
|
|
25
|
+
...options.userDataDir && {
|
|
26
|
+
userDataDir: options.userDataDir
|
|
32
27
|
},
|
|
33
28
|
args: [
|
|
34
29
|
'--no-sandbox',
|
|
@@ -49,8 +44,15 @@ class LocalBrowser extends __WEBPACK_EXTERNAL_MODULE__base_browser_mjs_64d751a3_
|
|
|
49
44
|
'--disable-site-isolation-trials',
|
|
50
45
|
`--window-size=${viewportWidth},${viewportHeight + 90}`,
|
|
51
46
|
(null == options ? void 0 : options.proxy) ? `--proxy-server=${options.proxy}` : '',
|
|
52
|
-
(null == options ? void 0 : options.
|
|
53
|
-
|
|
47
|
+
(null == options ? void 0 : options.proxyBypassList) ? `--proxy-bypass-list=${options.proxyBypassList}` : '',
|
|
48
|
+
(null == options ? void 0 : options.profilePath) ? `--profile-directory=${options.profilePath}` : '',
|
|
49
|
+
...options.args ?? []
|
|
50
|
+
].filter((item)=>{
|
|
51
|
+
if ('firefox' === type) {
|
|
52
|
+
if ('--disable-features=IsolateOrigins,site-per-process' === item || item === `--window-size=${viewportWidth},${viewportHeight + 90}`) return false;
|
|
53
|
+
}
|
|
54
|
+
return !!item;
|
|
55
|
+
}),
|
|
54
56
|
ignoreDefaultArgs: [
|
|
55
57
|
'--enable-automation'
|
|
56
58
|
],
|
|
@@ -69,8 +71,29 @@ class LocalBrowser extends __WEBPACK_EXTERNAL_MODULE__base_browser_mjs_64d751a3_
|
|
|
69
71
|
throw error;
|
|
70
72
|
}
|
|
71
73
|
}
|
|
72
|
-
|
|
73
|
-
|
|
74
|
+
getBrowserInfo(options = {}) {
|
|
75
|
+
const map = {
|
|
76
|
+
chrome: 'chrome',
|
|
77
|
+
edge: 'chrome',
|
|
78
|
+
firefox: 'firefox'
|
|
79
|
+
};
|
|
80
|
+
let browserPath = options.executablePath;
|
|
81
|
+
let browserType = options.browserType && map[options.browserType];
|
|
82
|
+
if (browserPath) {
|
|
83
|
+
if (!browserType) {
|
|
84
|
+
const lowercasePath = browserPath.toLowerCase();
|
|
85
|
+
browserType = lowercasePath.includes('chrome') ? 'chrome' : lowercasePath.includes('edge') ? 'chrome' : lowercasePath.includes('firefox') ? 'firefox' : 'chrome';
|
|
86
|
+
}
|
|
87
|
+
} else {
|
|
88
|
+
const browserInfo = new __WEBPACK_EXTERNAL_MODULE__browser_finder_index_mjs_208fd54f__.BrowserFinder(this.logger).findBrowser();
|
|
89
|
+
browserPath = browserInfo.path;
|
|
90
|
+
browserType = map[browserInfo.type];
|
|
91
|
+
}
|
|
92
|
+
this.logger.info('Using executable path:', browserPath);
|
|
93
|
+
return {
|
|
94
|
+
path: browserPath,
|
|
95
|
+
type: browserType
|
|
96
|
+
};
|
|
74
97
|
}
|
|
75
98
|
}
|
|
76
99
|
export { LocalBrowser };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-browser.mjs","sources":["webpack://@agent-infra/browser/./src/local-browser.ts"],"sourcesContent":["/*\n * Copyright (c) 2025 Bytedance, Inc. and its affiliates.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport * as puppeteer from 'puppeteer-core';\nimport {
|
|
1
|
+
{"version":3,"file":"local-browser.mjs","sources":["webpack://@agent-infra/browser/./src/local-browser.ts"],"sourcesContent":["/*\n * Copyright (c) 2025 Bytedance, Inc. and its affiliates.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport * as puppeteer from 'puppeteer-core';\nimport { BrowserFinder } from './browser-finder';\nimport { BaseBrowser } from './base-browser';\n\nimport type { BrowserType, LaunchOptions } from './types';\n\n/**\n * LocalBrowser class for controlling locally installed browsers\n * Extends the BaseBrowser with functionality specific to managing local browser instances\n * @extends BaseBrowser\n */\nexport class LocalBrowser extends BaseBrowser {\n /**\n * Launches a local browser instance with specified options\n * Automatically detects installed browsers if no executable path is provided\n * @param {LaunchOptions} options - Configuration options for launching the browser\n * @returns {Promise<void>} Promise that resolves when the browser is successfully launched\n * @throws {Error} If the browser cannot be launched\n */\n async launch(options: LaunchOptions = {}): Promise<void> {\n this.logger.info('Launching browser with options:', options);\n\n const { path, type } = this.getBrowserInfo(options);\n const viewportWidth = options?.defaultViewport?.width ?? 1280;\n const viewportHeight = options?.defaultViewport?.height ?? 800;\n\n const puppeteerLaunchOptions: puppeteer.LaunchOptions = {\n browser: type,\n executablePath: path,\n dumpio: options?.dumpio ?? false,\n headless: options?.headless ?? false,\n defaultViewport: {\n width: viewportWidth,\n height: viewportHeight,\n // Setting this value to 0 will reset this value to the system default.\n // This parameter combined with `captureBeyondViewport: false`, will resolve the screenshot blinking issue.\n deviceScaleFactor: 0,\n },\n ...(options.userDataDir && {\n userDataDir: options.userDataDir,\n }),\n args: [\n '--no-sandbox',\n '--mute-audio',\n '--disable-gpu',\n '--disable-http2',\n '--disable-blink-features=AutomationControlled',\n '--disable-infobars',\n '--disable-background-timer-throttling',\n '--disable-popup-blocking',\n '--disable-backgrounding-occluded-windows',\n '--disable-renderer-backgrounding',\n '--disable-window-activation',\n '--disable-focus-on-load',\n '--no-default-browser-check', // disable default browser check\n '--disable-web-security', // disable CORS\n '--disable-features=IsolateOrigins,site-per-process',\n '--disable-site-isolation-trials',\n `--window-size=${viewportWidth},${viewportHeight + 90}`,\n options?.proxy ? `--proxy-server=${options.proxy}` : '',\n options?.proxyBypassList\n ? `--proxy-bypass-list=${options.proxyBypassList}`\n : '',\n options?.profilePath\n ? `--profile-directory=${options.profilePath}`\n : '',\n ...(options.args ?? []),\n ].filter((item) => {\n if (type === 'firefox') {\n // firefox not support rules\n if (\n item === '--disable-features=IsolateOrigins,site-per-process' ||\n item === `--window-size=${viewportWidth},${viewportHeight + 90}`\n ) {\n return false;\n }\n\n return !!item;\n }\n\n // chrome/edge\n return !!item;\n }),\n ignoreDefaultArgs: ['--enable-automation'],\n timeout: options.timeout ?? 0,\n downloadBehavior: {\n policy: 'deny',\n },\n };\n\n this.logger.info('Launch options:', puppeteerLaunchOptions);\n\n try {\n this.browser = await puppeteer.launch(puppeteerLaunchOptions);\n await this.setupPageListener();\n this.logger.success('Browser launched successfully');\n } catch (error) {\n this.logger.error('Failed to launch browser:', error);\n throw error;\n }\n }\n\n private getBrowserInfo(options: LaunchOptions = {}) {\n // pptr only support 'chrome' and 'firefox'\n const map: Record<BrowserType, Exclude<BrowserType, 'edge'>> = {\n chrome: 'chrome',\n edge: 'chrome',\n firefox: 'firefox',\n };\n\n let browserPath = options.executablePath;\n let browserType = options.browserType && map[options.browserType];\n\n if (!browserPath) {\n const browserInfo = new BrowserFinder(this.logger).findBrowser();\n browserPath = browserInfo.path;\n browserType = map[browserInfo.type];\n } else {\n if (!browserType) {\n const lowercasePath = browserPath.toLowerCase();\n\n if (lowercasePath.includes('chrome')) {\n browserType = 'chrome';\n } else if (lowercasePath.includes('edge')) {\n browserType = 'chrome'; // pptr only support 'chrome' and 'firefox'\n } else if (lowercasePath.includes('firefox')) {\n browserType = 'firefox';\n } else {\n browserType = 'chrome';\n }\n }\n }\n\n this.logger.info('Using executable path:', browserPath);\n\n return {\n path: browserPath,\n type: browserType,\n };\n }\n}\n"],"names":["LocalBrowser","BaseBrowser","options","_options_defaultViewport","_options_defaultViewport1","path","type","viewportWidth","viewportHeight","puppeteerLaunchOptions","item","puppeteer","error","map","browserPath","browserType","lowercasePath","browserInfo","BrowserFinder"],"mappings":"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"}
|
package/dist/remote-browser.d.ts
CHANGED
|
@@ -5,13 +5,12 @@ import { LaunchOptions } from './types';
|
|
|
5
5
|
* @extends BaseBrowserOptions
|
|
6
6
|
* @interface RemoteBrowserOptions
|
|
7
7
|
* @property {string} [wsEndpoint] - WebSocket endpoint URL for direct connection
|
|
8
|
-
* @property {string} [
|
|
9
|
-
* @property {number} [port] - Remote debugging port (default: 9222)
|
|
8
|
+
* @property {string} [cdpEndpoint] - Remote Chrome DevTools Protocol endpoint
|
|
10
9
|
*/
|
|
11
10
|
export interface RemoteBrowserOptions extends BaseBrowserOptions {
|
|
12
11
|
wsEndpoint?: string;
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
/** @default http://localhost:9222/json/version */
|
|
13
|
+
cdpEndpoint?: string;
|
|
15
14
|
}
|
|
16
15
|
/**
|
|
17
16
|
* RemoteBrowser class for connecting to remote browser instances
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remote-browser.d.ts","sourceRoot":"","sources":["../src/remote-browser.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAExC
|
|
1
|
+
{"version":3,"file":"remote-browser.d.ts","sourceRoot":"","sources":["../src/remote-browser.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAExC;;;;;;GAMG;AACH,MAAM,WAAW,oBAAqB,SAAQ,kBAAkB;IAC9D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kDAAkD;IAClD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,aAAc,SAAQ,WAAW;IAKhC,OAAO,CAAC,OAAO,CAAC;IAJ5B;;;OAGG;gBACiB,OAAO,CAAC,EAAE,oBAAoB,YAAA;IAIlD;;;;;;OAMG;IACG,MAAM,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;CA6BrD"}
|
package/dist/remote-browser.js
CHANGED
|
@@ -48,10 +48,9 @@ class RemoteBrowser extends external_base_browser_js_namespaceObject.BaseBrowser
|
|
|
48
48
|
this.logger.info('Browser Launch options:', options);
|
|
49
49
|
let browserWSEndpoint = null === (_this_options = this.options) || void 0 === _this_options ? void 0 : _this_options.wsEndpoint;
|
|
50
50
|
if (!browserWSEndpoint) {
|
|
51
|
-
var _this_options1
|
|
52
|
-
const
|
|
53
|
-
const
|
|
54
|
-
const response = await fetch(`http://${host}:${port}/json/version`);
|
|
51
|
+
var _this_options1;
|
|
52
|
+
const cdpEndpoint = (null === (_this_options1 = this.options) || void 0 === _this_options1 ? void 0 : _this_options1.cdpEndpoint) || "http://127.0.0.1:9222/json/version";
|
|
53
|
+
const response = await fetch(cdpEndpoint);
|
|
55
54
|
const { webSocketDebuggerUrl } = await response.json();
|
|
56
55
|
browserWSEndpoint = webSocketDebuggerUrl;
|
|
57
56
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remote-browser.js","sources":["webpack://@agent-infra/browser/./src/remote-browser.ts"],"sourcesContent":["/*\n * Copyright (c) 2025 Bytedance, Inc. and its affiliates.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport * as puppeteer from 'puppeteer-core';\nimport { BaseBrowser, BaseBrowserOptions } from './base-browser';\nimport { LaunchOptions } from './types';\n\n/**\n * Configuration options for RemoteBrowser\n * @extends BaseBrowserOptions\n * @interface RemoteBrowserOptions\n * @property {string} [wsEndpoint] - WebSocket endpoint URL for direct connection\n * @property {string} [
|
|
1
|
+
{"version":3,"file":"remote-browser.js","sources":["webpack://@agent-infra/browser/./src/remote-browser.ts"],"sourcesContent":["/*\n * Copyright (c) 2025 Bytedance, Inc. and its affiliates.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport * as puppeteer from 'puppeteer-core';\nimport { BaseBrowser, BaseBrowserOptions } from './base-browser';\nimport { LaunchOptions } from './types';\n\n/**\n * Configuration options for RemoteBrowser\n * @extends BaseBrowserOptions\n * @interface RemoteBrowserOptions\n * @property {string} [wsEndpoint] - WebSocket endpoint URL for direct connection\n * @property {string} [cdpEndpoint] - Remote Chrome DevTools Protocol endpoint\n */\nexport interface RemoteBrowserOptions extends BaseBrowserOptions {\n wsEndpoint?: string;\n /** @default http://localhost:9222/json/version */\n cdpEndpoint?: string;\n}\n\n/**\n * RemoteBrowser class for connecting to remote browser instances\n *\n * Currently, this RemoteBrowser is not production ready,\n * mainly because it still relies on `puppeteer-core`,\n * which can only run on Node.js.\n *\n * At the same time, Chrome instances built with\n * `--remote-debugging-address` on Linux have security risks\n *\n * @see https://issues.chromium.org/issues/41487252\n * @see https://issues.chromium.org/issues/40261787\n * @see https://github.com/pyppeteer/pyppeteer/pull/379\n * @see https://stackoverflow.com/questions/72760355/chrome-remote-debugging-not-working-computer-to-computer\n *\n * @extends BaseBrowser\n */\nexport class RemoteBrowser extends BaseBrowser {\n /**\n * Creates a new RemoteBrowser instance\n * @param {RemoteBrowserOptions} [options] - Configuration options for remote browser connection\n */\n constructor(private options?: RemoteBrowserOptions) {\n super(options);\n }\n\n /**\n * Connects to a remote browser instance using WebSocket\n * If no WebSocket endpoint is provided, attempts to discover it using the DevTools Protocol\n * @param {LaunchOptions} [options] - Launch configuration options\n * @returns {Promise<void>} Promise that resolves when connected to the remote browser\n * @throws {Error} If connection to the remote browser fails\n */\n async launch(options?: LaunchOptions): Promise<void> {\n this.logger.info('Browser Launch options:', options);\n\n let browserWSEndpoint = this.options?.wsEndpoint;\n\n if (!browserWSEndpoint) {\n const cdpEndpoint =\n this.options?.cdpEndpoint || `http://127.0.0.1:9222/json/version`;\n const response = await fetch(cdpEndpoint);\n const { webSocketDebuggerUrl } = await response.json();\n browserWSEndpoint = webSocketDebuggerUrl;\n }\n\n this.logger.info('Using WebSocket endpoint:', browserWSEndpoint);\n\n const puppeteerConnectOptions: puppeteer.ConnectOptions = {\n browserWSEndpoint,\n defaultViewport: options?.defaultViewport ?? { width: 1280, height: 800 },\n };\n\n try {\n this.browser = await puppeteer.connect(puppeteerConnectOptions);\n await this.setupPageListener();\n this.logger.success('Connected to remote browser successfully');\n } catch (error) {\n this.logger.error('Failed to connect to remote browser:', error);\n throw error;\n }\n }\n}\n"],"names":["RemoteBrowser","BaseBrowser","options","_this_options","browserWSEndpoint","_this_options1","cdpEndpoint","response","fetch","webSocketDebuggerUrl","puppeteerConnectOptions","puppeteer","error"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGC;;;;;;;;;;AAmCM,MAAMA,sBAAsBC,yCAAAA,WAAWA;IAgB5C,MAAM,OAAOC,OAAuB,EAAiB;YAG3BC;QAFxB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,2BAA2BD;QAE5C,IAAIE,oBAAoB,AAAY,SAAZD,CAAAA,gBAAAA,IAAI,CAAC,OAAO,AAAD,KAAXA,AAAAA,KAAAA,MAAAA,gBAAAA,KAAAA,IAAAA,cAAc,UAAU;QAEhD,IAAI,CAACC,mBAAmB;gBAEpBC;YADF,MAAMC,cACJD,AAAAA,CAAY,SAAZA,CAAAA,iBAAAA,IAAI,CAAC,OAAO,AAAD,KAAXA,AAAAA,KAAAA,MAAAA,iBAAAA,KAAAA,IAAAA,eAAc,WAAW,AAAD,KAAK;YAC/B,MAAME,WAAW,MAAMC,MAAMF;YAC7B,MAAM,EAAEG,oBAAoB,EAAE,GAAG,MAAMF,SAAS,IAAI;YACpDH,oBAAoBK;QACtB;QAEA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,6BAA6BL;QAE9C,MAAMM,0BAAoD;YACxDN;YACA,iBAAiBF,AAAAA,CAAAA,QAAAA,UAAAA,KAAAA,IAAAA,QAAS,eAAe,AAAD,KAAK;gBAAE,OAAO;gBAAM,QAAQ;YAAI;QAC1E;QAEA,IAAI;YACF,IAAI,CAAC,OAAO,GAAG,MAAMS,wCAAAA,OAAiB,CAACD;YACvC,MAAM,IAAI,CAAC,iBAAiB;YAC5B,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;QACtB,EAAE,OAAOE,OAAO;YACd,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,wCAAwCA;YAC1D,MAAMA;QACR;IACF;IAvCA,YAAoBV,OAA8B,CAAE;QAClD,KAAK,CAACA,UAAAA,iBAAAA,IAAAA,EAAAA,WAAAA,KAAAA,IAAAA,IAAAA,CADYA,OAAO,GAAPA;IAEpB;AAsCF"}
|
package/dist/remote-browser.mjs
CHANGED
|
@@ -20,10 +20,9 @@ class RemoteBrowser extends __WEBPACK_EXTERNAL_MODULE__base_browser_mjs_64d751a3
|
|
|
20
20
|
this.logger.info('Browser Launch options:', options);
|
|
21
21
|
let browserWSEndpoint = null === (_this_options = this.options) || void 0 === _this_options ? void 0 : _this_options.wsEndpoint;
|
|
22
22
|
if (!browserWSEndpoint) {
|
|
23
|
-
var _this_options1
|
|
24
|
-
const
|
|
25
|
-
const
|
|
26
|
-
const response = await fetch(`http://${host}:${port}/json/version`);
|
|
23
|
+
var _this_options1;
|
|
24
|
+
const cdpEndpoint = (null === (_this_options1 = this.options) || void 0 === _this_options1 ? void 0 : _this_options1.cdpEndpoint) || "http://127.0.0.1:9222/json/version";
|
|
25
|
+
const response = await fetch(cdpEndpoint);
|
|
27
26
|
const { webSocketDebuggerUrl } = await response.json();
|
|
28
27
|
browserWSEndpoint = webSocketDebuggerUrl;
|
|
29
28
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remote-browser.mjs","sources":["webpack://@agent-infra/browser/./src/remote-browser.ts"],"sourcesContent":["/*\n * Copyright (c) 2025 Bytedance, Inc. and its affiliates.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport * as puppeteer from 'puppeteer-core';\nimport { BaseBrowser, BaseBrowserOptions } from './base-browser';\nimport { LaunchOptions } from './types';\n\n/**\n * Configuration options for RemoteBrowser\n * @extends BaseBrowserOptions\n * @interface RemoteBrowserOptions\n * @property {string} [wsEndpoint] - WebSocket endpoint URL for direct connection\n * @property {string} [
|
|
1
|
+
{"version":3,"file":"remote-browser.mjs","sources":["webpack://@agent-infra/browser/./src/remote-browser.ts"],"sourcesContent":["/*\n * Copyright (c) 2025 Bytedance, Inc. and its affiliates.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport * as puppeteer from 'puppeteer-core';\nimport { BaseBrowser, BaseBrowserOptions } from './base-browser';\nimport { LaunchOptions } from './types';\n\n/**\n * Configuration options for RemoteBrowser\n * @extends BaseBrowserOptions\n * @interface RemoteBrowserOptions\n * @property {string} [wsEndpoint] - WebSocket endpoint URL for direct connection\n * @property {string} [cdpEndpoint] - Remote Chrome DevTools Protocol endpoint\n */\nexport interface RemoteBrowserOptions extends BaseBrowserOptions {\n wsEndpoint?: string;\n /** @default http://localhost:9222/json/version */\n cdpEndpoint?: string;\n}\n\n/**\n * RemoteBrowser class for connecting to remote browser instances\n *\n * Currently, this RemoteBrowser is not production ready,\n * mainly because it still relies on `puppeteer-core`,\n * which can only run on Node.js.\n *\n * At the same time, Chrome instances built with\n * `--remote-debugging-address` on Linux have security risks\n *\n * @see https://issues.chromium.org/issues/41487252\n * @see https://issues.chromium.org/issues/40261787\n * @see https://github.com/pyppeteer/pyppeteer/pull/379\n * @see https://stackoverflow.com/questions/72760355/chrome-remote-debugging-not-working-computer-to-computer\n *\n * @extends BaseBrowser\n */\nexport class RemoteBrowser extends BaseBrowser {\n /**\n * Creates a new RemoteBrowser instance\n * @param {RemoteBrowserOptions} [options] - Configuration options for remote browser connection\n */\n constructor(private options?: RemoteBrowserOptions) {\n super(options);\n }\n\n /**\n * Connects to a remote browser instance using WebSocket\n * If no WebSocket endpoint is provided, attempts to discover it using the DevTools Protocol\n * @param {LaunchOptions} [options] - Launch configuration options\n * @returns {Promise<void>} Promise that resolves when connected to the remote browser\n * @throws {Error} If connection to the remote browser fails\n */\n async launch(options?: LaunchOptions): Promise<void> {\n this.logger.info('Browser Launch options:', options);\n\n let browserWSEndpoint = this.options?.wsEndpoint;\n\n if (!browserWSEndpoint) {\n const cdpEndpoint =\n this.options?.cdpEndpoint || `http://127.0.0.1:9222/json/version`;\n const response = await fetch(cdpEndpoint);\n const { webSocketDebuggerUrl } = await response.json();\n browserWSEndpoint = webSocketDebuggerUrl;\n }\n\n this.logger.info('Using WebSocket endpoint:', browserWSEndpoint);\n\n const puppeteerConnectOptions: puppeteer.ConnectOptions = {\n browserWSEndpoint,\n defaultViewport: options?.defaultViewport ?? { width: 1280, height: 800 },\n };\n\n try {\n this.browser = await puppeteer.connect(puppeteerConnectOptions);\n await this.setupPageListener();\n this.logger.success('Connected to remote browser successfully');\n } catch (error) {\n this.logger.error('Failed to connect to remote browser:', error);\n throw error;\n }\n }\n}\n"],"names":["RemoteBrowser","BaseBrowser","options","_this_options","browserWSEndpoint","_this_options1","cdpEndpoint","response","fetch","webSocketDebuggerUrl","puppeteerConnectOptions","puppeteer","error"],"mappings":";;;;;;AAGC;;;;;;;;;;AAmCM,MAAMA,sBAAsBC,uDAAAA,WAAWA;IAgB5C,MAAM,OAAOC,OAAuB,EAAiB;YAG3BC;QAFxB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,2BAA2BD;QAE5C,IAAIE,oBAAoB,AAAY,SAAZD,CAAAA,gBAAAA,IAAI,CAAC,OAAO,AAAD,KAAXA,AAAAA,KAAAA,MAAAA,gBAAAA,KAAAA,IAAAA,cAAc,UAAU;QAEhD,IAAI,CAACC,mBAAmB;gBAEpBC;YADF,MAAMC,cACJD,AAAAA,CAAY,SAAZA,CAAAA,iBAAAA,IAAI,CAAC,OAAO,AAAD,KAAXA,AAAAA,KAAAA,MAAAA,iBAAAA,KAAAA,IAAAA,eAAc,WAAW,AAAD,KAAK;YAC/B,MAAME,WAAW,MAAMC,MAAMF;YAC7B,MAAM,EAAEG,oBAAoB,EAAE,GAAG,MAAMF,SAAS,IAAI;YACpDH,oBAAoBK;QACtB;QAEA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,6BAA6BL;QAE9C,MAAMM,0BAAoD;YACxDN;YACA,iBAAiBF,AAAAA,CAAAA,QAAAA,UAAAA,KAAAA,IAAAA,QAAS,eAAe,AAAD,KAAK;gBAAE,OAAO;gBAAM,QAAQ;YAAI;QAC1E;QAEA,IAAI;YACF,IAAI,CAAC,OAAO,GAAG,MAAMS,oDAAAA,OAAiB,CAACD;YACvC,MAAM,IAAI,CAAC,iBAAiB;YAC5B,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;QACtB,EAAE,OAAOE,OAAO;YACd,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,wCAAwCA;YAC1D,MAAMA;QACR;IACF;IAvCA,YAAoBV,OAA8B,CAAE;QAClD,KAAK,CAACA,UAAAA,iBAAAA,IAAAA,EAAAA,WAAAA,KAAAA,IAAAA,IAAAA,CADYA,OAAO,GAAPA;IAEpB;AAsCF"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,14 +1,29 @@
|
|
|
1
|
-
import { Page, WaitForOptions } from 'puppeteer-core';
|
|
1
|
+
import type { Page, KeyInput, WaitForOptions } from 'puppeteer-core';
|
|
2
|
+
export type BrowserType = 'chrome' | 'edge' | 'firefox';
|
|
2
3
|
/**
|
|
3
4
|
* Options for launching a browser instance
|
|
4
5
|
* @interface LaunchOptions
|
|
5
6
|
*/
|
|
6
7
|
export interface LaunchOptions {
|
|
8
|
+
/**
|
|
9
|
+
* Additional command line arguments to pass to the browser instance.
|
|
10
|
+
*/
|
|
11
|
+
args?: string[];
|
|
12
|
+
/**
|
|
13
|
+
* If true, pipes the browser process stdout and stderr to `process.stdout`
|
|
14
|
+
* and `process.stderr`.
|
|
15
|
+
* @defaultValue `false`
|
|
16
|
+
*/
|
|
17
|
+
dumpio?: boolean;
|
|
7
18
|
/**
|
|
8
19
|
* Whether to run browser in headless mode
|
|
9
20
|
* @default false
|
|
10
21
|
*/
|
|
11
22
|
headless?: boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Browser type, 'chrome' | 'edge' | 'firefox'
|
|
25
|
+
*/
|
|
26
|
+
browserType?: BrowserType;
|
|
12
27
|
/**
|
|
13
28
|
* Maximum time in milliseconds to wait for the browser to start
|
|
14
29
|
* @default 0 (no timeout)
|
|
@@ -38,6 +53,17 @@ export interface LaunchOptions {
|
|
|
38
53
|
* Used to route browser traffic through a proxy server
|
|
39
54
|
*/
|
|
40
55
|
proxy?: string;
|
|
56
|
+
/**
|
|
57
|
+
* Proxy bypass list, e.g. '*.example.com,*.test.com'
|
|
58
|
+
* Used to bypass the proxy server for specific domains
|
|
59
|
+
*/
|
|
60
|
+
proxyBypassList?: string;
|
|
61
|
+
/**
|
|
62
|
+
* Path to a user data directory.
|
|
63
|
+
* {@link https://chromium.googlesource.com/chromium/src/+/refs/heads/main/docs/user_data_dir.md | see the Chromium docs}
|
|
64
|
+
* for more info.
|
|
65
|
+
*/
|
|
66
|
+
userDataDir?: string;
|
|
41
67
|
}
|
|
42
68
|
/**
|
|
43
69
|
* Options for evaluating JavaScript in a new page
|
|
@@ -128,5 +154,5 @@ export interface BrowserInterface {
|
|
|
128
154
|
*/
|
|
129
155
|
getActivePage(): Promise<Page>;
|
|
130
156
|
}
|
|
131
|
-
export { Page };
|
|
157
|
+
export { Page, KeyInput };
|
|
132
158
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErE,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAC;AAExD;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;OAEG;IACH,WAAW,CAAC,EAAE,WAAW,CAAC;IAE1B;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;;OAIG;IACH,eAAe,CAAC,EAAE;QAChB,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IAEF;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;GAKG;AACH,MAAM,WAAW,wBAAwB,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,CAAC;IAC1D;;;OAGG;IACH,GAAG,EAAE,MAAM,CAAC;IAEZ;;OAEG;IACH,cAAc,CAAC,EAAE,cAAc,CAAC;IAEhC;;;;;;OAMG;IACH,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC;IAEhD;;;OAGG;IACH,kBAAkB,EAAE,CAAC,CAAC;IAEtB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtD;;;;;OAKG;IACH,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAErD;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CAC9D;AAED;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;OAIG;IACH,MAAM,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE/C;;;OAGG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvB;;;OAGG;IACH,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5B;;;;;;;OAOG;IACH,iBAAiB,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,CAAC,EAClC,OAAO,EAAE,wBAAwB,CAAC,CAAC,EAAE,CAAC,CAAC,GACtC,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAErB;;;OAGG;IACH,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAChC;AAED,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC"}
|
package/dist/types.js
CHANGED
|
@@ -4,17 +4,6 @@
|
|
|
4
4
|
*/
|
|
5
5
|
"use strict";
|
|
6
6
|
var __webpack_require__ = {};
|
|
7
|
-
(()=>{
|
|
8
|
-
__webpack_require__.d = (exports1, definition)=>{
|
|
9
|
-
for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
|
|
10
|
-
enumerable: true,
|
|
11
|
-
get: definition[key]
|
|
12
|
-
});
|
|
13
|
-
};
|
|
14
|
-
})();
|
|
15
|
-
(()=>{
|
|
16
|
-
__webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
|
|
17
|
-
})();
|
|
18
7
|
(()=>{
|
|
19
8
|
__webpack_require__.r = function(exports1) {
|
|
20
9
|
if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
|
|
@@ -27,10 +16,6 @@ var __webpack_require__ = {};
|
|
|
27
16
|
})();
|
|
28
17
|
var __webpack_exports__ = {};
|
|
29
18
|
__webpack_require__.r(__webpack_exports__);
|
|
30
|
-
__webpack_require__.d(__webpack_exports__, {
|
|
31
|
-
Page: ()=>external_puppeteer_core_namespaceObject.Page
|
|
32
|
-
});
|
|
33
|
-
const external_puppeteer_core_namespaceObject = require("puppeteer-core");
|
|
34
19
|
var __webpack_export_target__ = exports;
|
|
35
20
|
for(var __webpack_i__ in __webpack_exports__)__webpack_export_target__[__webpack_i__] = __webpack_exports__[__webpack_i__];
|
|
36
21
|
if (__webpack_exports__.__esModule) Object.defineProperty(__webpack_export_target__, '__esModule', {
|
package/dist/types.mjs
CHANGED
|
@@ -2,6 +2,3 @@
|
|
|
2
2
|
* Copyright (c) 2025 Bytedance, Inc. and its affiliates.
|
|
3
3
|
* SPDX-License-Identifier: Apache-2.0
|
|
4
4
|
*/
|
|
5
|
-
import * as __WEBPACK_EXTERNAL_MODULE_puppeteer_core_17481843__ from "puppeteer-core";
|
|
6
|
-
var __webpack_exports__Page = __WEBPACK_EXTERNAL_MODULE_puppeteer_core_17481843__.Page;
|
|
7
|
-
export { __webpack_exports__Page as Page };
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agent-infra/browser",
|
|
3
3
|
"description": "A tiny Browser Control library, built for Agent Tars.",
|
|
4
|
-
"version": "0.0
|
|
4
|
+
"version": "0.1.0",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.mjs",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
@@ -16,11 +16,14 @@
|
|
|
16
16
|
"dist"
|
|
17
17
|
],
|
|
18
18
|
"dependencies": {
|
|
19
|
-
"puppeteer-core": "24.
|
|
19
|
+
"puppeteer-core": "24.7.2",
|
|
20
|
+
"which": "5.0.0",
|
|
21
|
+
"edge-paths": "3.0.5",
|
|
20
22
|
"@agent-infra/logger": "0.0.1",
|
|
21
23
|
"@agent-infra/shared": "0.0.1"
|
|
22
24
|
},
|
|
23
25
|
"devDependencies": {
|
|
26
|
+
"@types/which": "3.0.4",
|
|
24
27
|
"@types/node": "20.14.8",
|
|
25
28
|
"typescript": "^5.7.3",
|
|
26
29
|
"vitest": "3.0.7",
|
package/dist/browser-finder.d.ts
DELETED
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The following code is modified based on
|
|
3
|
-
* https://github.com/egoist/local-web-search/blob/main/src/find-browser.ts
|
|
4
|
-
*
|
|
5
|
-
* MIT Licensed
|
|
6
|
-
* Copyright (c) 2025 ChatWise (https://chatwise.app) <kevin@chatwise.app>
|
|
7
|
-
* https://github.com/egoist/local-web-search/blob/main/LICENSE
|
|
8
|
-
*/
|
|
9
|
-
import { Logger } from '@agent-infra/logger';
|
|
10
|
-
/**
|
|
11
|
-
* Class responsible for finding and managing browser installations
|
|
12
|
-
* Detects installed browsers and their profiles across different platforms
|
|
13
|
-
*/
|
|
14
|
-
export declare class BrowserFinder {
|
|
15
|
-
/**
|
|
16
|
-
* Logger instance for diagnostic output
|
|
17
|
-
* @private
|
|
18
|
-
*/
|
|
19
|
-
private logger;
|
|
20
|
-
/**
|
|
21
|
-
* Creates a new BrowserFinder instance
|
|
22
|
-
* @param {Logger} [logger] - Optional custom logger
|
|
23
|
-
*/
|
|
24
|
-
constructor(logger?: Logger);
|
|
25
|
-
/**
|
|
26
|
-
* Getter that returns the list of supported browsers with their platform-specific paths
|
|
27
|
-
* @returns {Browser[]} Array of browser configurations
|
|
28
|
-
* @private
|
|
29
|
-
*/
|
|
30
|
-
private get browsers();
|
|
31
|
-
/**
|
|
32
|
-
* Find a specific browser or the first available browser
|
|
33
|
-
* @param {string} [name] - Optional browser name to find
|
|
34
|
-
* @returns {{ executable: string; userDataDir: string }} Browser executable and user data paths
|
|
35
|
-
* @throws {Error} If no supported browser is found or the platform is unsupported
|
|
36
|
-
*/
|
|
37
|
-
findBrowser(name?: string): {
|
|
38
|
-
executable: string;
|
|
39
|
-
userDataDir: string;
|
|
40
|
-
};
|
|
41
|
-
/**
|
|
42
|
-
* Get browser profiles for a specific browser
|
|
43
|
-
* Reads the Local State file to extract profile information
|
|
44
|
-
* @param {string} [browserName] - Optional browser name to get profiles for
|
|
45
|
-
* @returns {Array<{ displayName: string; path: string }>} Array of profile objects with display names and paths
|
|
46
|
-
*/
|
|
47
|
-
getBrowserProfiles(browserName?: string): Array<{
|
|
48
|
-
displayName: string;
|
|
49
|
-
path: string;
|
|
50
|
-
}>;
|
|
51
|
-
/**
|
|
52
|
-
* Legacy method for backwards compatibility
|
|
53
|
-
* Finds Chrome browser executable path
|
|
54
|
-
* @deprecated Use findBrowser instead
|
|
55
|
-
* @returns {string | null} Chrome executable path or null if not found
|
|
56
|
-
*/
|
|
57
|
-
findChrome(): string | null;
|
|
58
|
-
}
|
|
59
|
-
//# sourceMappingURL=browser-finder.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"browser-finder.d.ts","sourceRoot":"","sources":["../src/browser-finder.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,EAAE,MAAM,EAAiB,MAAM,qBAAqB,CAAC;AAsC5D;;;GAGG;AACH,qBAAa,aAAa;IACxB;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAS;IAEvB;;;OAGG;gBACS,MAAM,CAAC,EAAE,MAAM;IAI3B;;;;OAIG;IACH,OAAO,KAAK,QAAQ,GAiDnB;IAED;;;;;OAKG;IACH,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG;QAC1B,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;KACrB;IAuCD;;;;;OAKG;IACH,kBAAkB,CAChB,WAAW,CAAC,EAAE,MAAM,GACnB,KAAK,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAoB/C;;;;;OAKG;IACH,UAAU,IAAI,MAAM,GAAG,IAAI;CAQ5B"}
|
package/dist/browser-finder.js
DELETED
|
@@ -1,148 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Copyright (c) 2025 Bytedance, Inc. and its affiliates.
|
|
3
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
-
*/
|
|
5
|
-
"use strict";
|
|
6
|
-
var __webpack_require__ = {};
|
|
7
|
-
(()=>{
|
|
8
|
-
__webpack_require__.d = (exports1, definition)=>{
|
|
9
|
-
for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
|
|
10
|
-
enumerable: true,
|
|
11
|
-
get: definition[key]
|
|
12
|
-
});
|
|
13
|
-
};
|
|
14
|
-
})();
|
|
15
|
-
(()=>{
|
|
16
|
-
__webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
|
|
17
|
-
})();
|
|
18
|
-
(()=>{
|
|
19
|
-
__webpack_require__.r = function(exports1) {
|
|
20
|
-
if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
|
|
21
|
-
value: 'Module'
|
|
22
|
-
});
|
|
23
|
-
Object.defineProperty(exports1, '__esModule', {
|
|
24
|
-
value: true
|
|
25
|
-
});
|
|
26
|
-
};
|
|
27
|
-
})();
|
|
28
|
-
var __webpack_exports__ = {};
|
|
29
|
-
__webpack_require__.r(__webpack_exports__);
|
|
30
|
-
__webpack_require__.d(__webpack_exports__, {
|
|
31
|
-
BrowserFinder: ()=>BrowserFinder
|
|
32
|
-
});
|
|
33
|
-
const external_fs_namespaceObject = require("fs");
|
|
34
|
-
const external_path_namespaceObject = require("path");
|
|
35
|
-
const external_os_namespaceObject = require("os");
|
|
36
|
-
const logger_namespaceObject = require("@agent-infra/logger");
|
|
37
|
-
function _define_property(obj, key, value) {
|
|
38
|
-
if (key in obj) Object.defineProperty(obj, key, {
|
|
39
|
-
value: value,
|
|
40
|
-
enumerable: true,
|
|
41
|
-
configurable: true,
|
|
42
|
-
writable: true
|
|
43
|
-
});
|
|
44
|
-
else obj[key] = value;
|
|
45
|
-
return obj;
|
|
46
|
-
}
|
|
47
|
-
class BrowserFinder {
|
|
48
|
-
get browsers() {
|
|
49
|
-
const HOME_DIR = external_os_namespaceObject.homedir();
|
|
50
|
-
const LOCAL_APP_DATA = process.env.LOCALAPPDATA;
|
|
51
|
-
return [
|
|
52
|
-
{
|
|
53
|
-
name: 'Chromium',
|
|
54
|
-
executable: {
|
|
55
|
-
win32: 'C:\\Program Files\\Chromium\\Application\\chrome.exe',
|
|
56
|
-
darwin: '/Applications/Chromium.app/Contents/MacOS/Chromium',
|
|
57
|
-
linux: '/usr/bin/chromium'
|
|
58
|
-
},
|
|
59
|
-
userDataDir: {
|
|
60
|
-
win32: `${LOCAL_APP_DATA}\\Chromium\\User Data`,
|
|
61
|
-
darwin: `${HOME_DIR}/Library/Application Support/Chromium`,
|
|
62
|
-
linux: `${HOME_DIR}/.config/chromium`
|
|
63
|
-
}
|
|
64
|
-
},
|
|
65
|
-
{
|
|
66
|
-
name: 'Google Chrome',
|
|
67
|
-
executable: {
|
|
68
|
-
win32: 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe',
|
|
69
|
-
darwin: '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome',
|
|
70
|
-
linux: '/usr/bin/google-chrome'
|
|
71
|
-
},
|
|
72
|
-
userDataDir: {
|
|
73
|
-
win32: `${LOCAL_APP_DATA}\\Google\\Chrome\\User Data`,
|
|
74
|
-
darwin: `${HOME_DIR}/Library/Application Support/Google/Chrome`,
|
|
75
|
-
linux: `${HOME_DIR}/.config/google-chrome`
|
|
76
|
-
}
|
|
77
|
-
},
|
|
78
|
-
{
|
|
79
|
-
name: 'Google Chrome Canary',
|
|
80
|
-
executable: {
|
|
81
|
-
win32: 'C:\\Program Files\\Google\\Chrome Canary\\Application\\chrome.exe',
|
|
82
|
-
darwin: '/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary',
|
|
83
|
-
linux: '/usr/bin/google-chrome-canary'
|
|
84
|
-
},
|
|
85
|
-
userDataDir: {
|
|
86
|
-
win32: `${LOCAL_APP_DATA}\\Google\\Chrome Canary\\User Data`,
|
|
87
|
-
darwin: `${HOME_DIR}/Library/Application Support/Google/Chrome Canary`,
|
|
88
|
-
linux: `${HOME_DIR}/.config/google-chrome-canary`
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
];
|
|
92
|
-
}
|
|
93
|
-
findBrowser(name) {
|
|
94
|
-
const platform = process.platform;
|
|
95
|
-
this.logger.info('Finding browser on platform:', platform);
|
|
96
|
-
if ('darwin' !== platform && 'win32' !== platform && 'linux' !== platform) {
|
|
97
|
-
const error = new Error(`Unsupported platform: ${platform}`);
|
|
98
|
-
this.logger.error(error.message);
|
|
99
|
-
throw error;
|
|
100
|
-
}
|
|
101
|
-
const browser = name ? this.browsers.find((b)=>b.name === name && external_fs_namespaceObject.existsSync(b.executable[platform])) : this.browsers.find((b)=>external_fs_namespaceObject.existsSync(b.executable[platform]));
|
|
102
|
-
this.logger.log('browser', browser);
|
|
103
|
-
if (!browser) {
|
|
104
|
-
const error = name ? new Error(`Cannot find browser: ${name}`) : new Error('Cannot find a supported browser on your system. Please install Chrome, Edge, or Brave.');
|
|
105
|
-
this.logger.error(error.message);
|
|
106
|
-
throw error;
|
|
107
|
-
}
|
|
108
|
-
const result = {
|
|
109
|
-
executable: browser.executable[platform],
|
|
110
|
-
userDataDir: browser.userDataDir[platform]
|
|
111
|
-
};
|
|
112
|
-
this.logger.success(`Found browser: ${browser.name}`);
|
|
113
|
-
this.logger.info('Browser details:', result);
|
|
114
|
-
return result;
|
|
115
|
-
}
|
|
116
|
-
getBrowserProfiles(browserName) {
|
|
117
|
-
const browser = this.findBrowser(browserName);
|
|
118
|
-
try {
|
|
119
|
-
const localState = JSON.parse(external_fs_namespaceObject.readFileSync(external_path_namespaceObject.join(browser.userDataDir, 'Local State'), 'utf8'));
|
|
120
|
-
const profileInfo = localState.profile.info_cache;
|
|
121
|
-
return Object.entries(profileInfo).map(([profileName, info])=>({
|
|
122
|
-
displayName: info.name,
|
|
123
|
-
path: external_path_namespaceObject.join(browser.userDataDir, profileName)
|
|
124
|
-
}));
|
|
125
|
-
} catch (error) {
|
|
126
|
-
return [];
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
findChrome() {
|
|
130
|
-
try {
|
|
131
|
-
const { executable } = this.findBrowser('Google Chrome');
|
|
132
|
-
return executable;
|
|
133
|
-
} catch {
|
|
134
|
-
return null;
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
constructor(logger){
|
|
138
|
-
_define_property(this, "logger", void 0);
|
|
139
|
-
this.logger = logger ?? logger_namespaceObject.defaultLogger;
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
var __webpack_export_target__ = exports;
|
|
143
|
-
for(var __webpack_i__ in __webpack_exports__)__webpack_export_target__[__webpack_i__] = __webpack_exports__[__webpack_i__];
|
|
144
|
-
if (__webpack_exports__.__esModule) Object.defineProperty(__webpack_export_target__, '__esModule', {
|
|
145
|
-
value: true
|
|
146
|
-
});
|
|
147
|
-
|
|
148
|
-
//# sourceMappingURL=browser-finder.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"browser-finder.js","sources":["webpack://@agent-infra/browser/./src/browser-finder.ts"],"sourcesContent":["/**\n * The following code is modified based on\n * https://github.com/egoist/local-web-search/blob/main/src/find-browser.ts\n *\n * MIT Licensed\n * Copyright (c) 2025 ChatWise (https://chatwise.app) <kevin@chatwise.app>\n * https://github.com/egoist/local-web-search/blob/main/LICENSE\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\nimport { Logger, defaultLogger } from '@agent-infra/logger';\n\n/**\n * Interface defining browser locations and configurations\n * Contains paths and settings for different operating systems\n * @interface Browser\n */\ninterface Browser {\n /**\n * Browser name identifier\n */\n name: string;\n\n /**\n * Executable paths by platform\n * @property {string} win32 - Windows executable path\n * @property {string} darwin - macOS executable path\n * @property {string} linux - Linux executable path\n */\n executable: {\n win32: string;\n darwin: string;\n linux: string;\n };\n\n /**\n * User data directory paths by platform\n * @property {string} win32 - Windows user data directory\n * @property {string} darwin - macOS user data directory\n * @property {string} linux - Linux user data directory\n */\n userDataDir: {\n win32: string;\n darwin: string;\n linux: string;\n };\n}\n\n/**\n * Class responsible for finding and managing browser installations\n * Detects installed browsers and their profiles across different platforms\n */\nexport class BrowserFinder {\n /**\n * Logger instance for diagnostic output\n * @private\n */\n private logger: Logger;\n\n /**\n * Creates a new BrowserFinder instance\n * @param {Logger} [logger] - Optional custom logger\n */\n constructor(logger?: Logger) {\n this.logger = logger ?? defaultLogger;\n }\n\n /**\n * Getter that returns the list of supported browsers with their platform-specific paths\n * @returns {Browser[]} Array of browser configurations\n * @private\n */\n private get browsers(): Browser[] {\n // Get HOME_DIR inside the getter to ensure it's always current\n const HOME_DIR = os.homedir();\n const LOCAL_APP_DATA = process.env.LOCALAPPDATA;\n\n return [\n {\n name: 'Chromium',\n executable: {\n win32: 'C:\\\\Program Files\\\\Chromium\\\\Application\\\\chrome.exe',\n darwin: '/Applications/Chromium.app/Contents/MacOS/Chromium',\n linux: '/usr/bin/chromium',\n },\n userDataDir: {\n win32: `${LOCAL_APP_DATA}\\\\Chromium\\\\User Data`,\n darwin: `${HOME_DIR}/Library/Application Support/Chromium`,\n linux: `${HOME_DIR}/.config/chromium`,\n },\n },\n {\n name: 'Google Chrome',\n executable: {\n win32: 'C:\\\\Program Files\\\\Google\\\\Chrome\\\\Application\\\\chrome.exe',\n darwin:\n '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome',\n linux: '/usr/bin/google-chrome',\n },\n userDataDir: {\n win32: `${LOCAL_APP_DATA}\\\\Google\\\\Chrome\\\\User Data`,\n darwin: `${HOME_DIR}/Library/Application Support/Google/Chrome`,\n linux: `${HOME_DIR}/.config/google-chrome`,\n },\n },\n {\n name: 'Google Chrome Canary',\n executable: {\n win32:\n 'C:\\\\Program Files\\\\Google\\\\Chrome Canary\\\\Application\\\\chrome.exe',\n darwin:\n '/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary',\n linux: '/usr/bin/google-chrome-canary',\n },\n userDataDir: {\n win32: `${LOCAL_APP_DATA}\\\\Google\\\\Chrome Canary\\\\User Data`,\n darwin: `${HOME_DIR}/Library/Application Support/Google/Chrome Canary`,\n linux: `${HOME_DIR}/.config/google-chrome-canary`,\n },\n },\n ];\n }\n\n /**\n * Find a specific browser or the first available browser\n * @param {string} [name] - Optional browser name to find\n * @returns {{ executable: string; userDataDir: string }} Browser executable and user data paths\n * @throws {Error} If no supported browser is found or the platform is unsupported\n */\n findBrowser(name?: string): {\n executable: string;\n userDataDir: string;\n } {\n const platform = process.platform;\n this.logger.info('Finding browser on platform:', platform);\n\n if (platform !== 'darwin' && platform !== 'win32' && platform !== 'linux') {\n const error = new Error(`Unsupported platform: ${platform}`);\n this.logger.error(error.message);\n throw error;\n }\n\n const browser = name\n ? this.browsers.find(\n (b) => b.name === name && fs.existsSync(b.executable[platform]),\n )\n : this.browsers.find((b) => fs.existsSync(b.executable[platform]));\n\n this.logger.log('browser', browser);\n\n if (!browser) {\n const error = name\n ? new Error(`Cannot find browser: ${name}`)\n : new Error(\n 'Cannot find a supported browser on your system. Please install Chrome, Edge, or Brave.',\n );\n this.logger.error(error.message);\n throw error;\n }\n\n const result = {\n executable: browser.executable[platform],\n userDataDir: browser.userDataDir[platform],\n };\n\n this.logger.success(`Found browser: ${browser.name}`);\n this.logger.info('Browser details:', result);\n\n return result;\n }\n\n /**\n * Get browser profiles for a specific browser\n * Reads the Local State file to extract profile information\n * @param {string} [browserName] - Optional browser name to get profiles for\n * @returns {Array<{ displayName: string; path: string }>} Array of profile objects with display names and paths\n */\n getBrowserProfiles(\n browserName?: string,\n ): Array<{ displayName: string; path: string }> {\n const browser = this.findBrowser(browserName);\n\n try {\n const localState = JSON.parse(\n fs.readFileSync(path.join(browser.userDataDir, 'Local State'), 'utf8'),\n );\n const profileInfo = localState.profile.info_cache;\n\n return Object.entries(profileInfo).map(\n ([profileName, info]: [string, any]) => ({\n displayName: info.name,\n path: path.join(browser.userDataDir, profileName),\n }),\n );\n } catch (error) {\n return [];\n }\n }\n\n /**\n * Legacy method for backwards compatibility\n * Finds Chrome browser executable path\n * @deprecated Use findBrowser instead\n * @returns {string | null} Chrome executable path or null if not found\n */\n findChrome(): string | null {\n try {\n const { executable } = this.findBrowser('Google Chrome');\n return executable;\n } catch {\n return null;\n }\n }\n}\n"],"names":["BrowserFinder","HOME_DIR","os","LOCAL_APP_DATA","process","name","platform","error","Error","browser","b","fs","result","browserName","localState","JSON","path","profileInfo","Object","profileName","info","executable","logger","defaultLogger"],"mappings":"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"}
|