UNPKG

@gui-agent/operator-aio

Version:
142 lines (141 loc) 5.17 kB
/** * Copyright (c) 2025 Bytedance, Inc. and its affiliates. * SPDX-License-Identifier: Apache-2.0 */ import { RemoteBrowser } from "@agent-infra/browser"; import { defaultLogger } from "@agent-infra/logger"; import { AioClient } from "@agent-infra/sandbox"; function _define_property(obj, key, value) { if (key in obj) Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); else obj[key] = value; return obj; } class AIOBrowser { async launch(options) { this.logger.info('Launching browser with options:', options); try { await this.browser.launch(options); this.logger.success('Browser launched successfully'); } catch (error) { this.logger.error('Failed to launch browser:', error); throw error; } } async close() { this.logger.info('Closing browser'); try { await this.browser.close(); this.logger.success('Browser closed successfully'); } catch (error) { this.logger.error('Failed to close browser:', error); throw error; } } async createPage() { this.logger.info('Creating new page'); try { const page = await this.browser.createPage(); this.logger.success('New page created successfully'); return page; } catch (error) { this.logger.error('Failed to create new page:', error); throw error; } } async handleNavigate(inputs) { const page = await this.getActivePage(); let { url } = inputs; if (!/^https?:\/\//i.test(url)) url = 'https://' + url; this.logger.info(`Navigating to: ${url}`); await page.goto(url, { waitUntil: [] }); this.logger.info('Navigation completed'); } async handleNavigateBack() { const page = await this.getActivePage(); this.logger.info("handleNavigateBack"); await page.goBack(); this.logger.info('handleNavigateBack completed'); } async getActiveUrl() { this.logger.info('Getting active page URL'); const pages = await this.browser.getBrowser().pages(); try { for (const page of pages){ const isVisible = await page.waitForFunction(()=>'visible' === document.visibilityState, { timeout: 1000 }); if (isVisible) return page.url(); } } catch (error) { this.logger.error('Failed to get active page URL:', error); } return ''; } async getActivePage() { this.logger.info('Getting active page'); const pages = await this.browser.getBrowser().pages(); try { for (const page of pages){ const isVisible = await page.waitForFunction(()=>'visible' === document.visibilityState, { timeout: 1000 }); if (isVisible) { this.logger.success('Active visible page retrieved successfully'); return page; } } this.logger.success('Active original page retrieved successfully'); return this.browser.getActivePage(); } catch (error) { this.logger.error('Failed to get active page:', error); throw error; } } async evaluateOnNewPage(options) { this.logger.info('Evaluating function on new page with URL:', options.url); try { const result = await this.browser.evaluateOnNewPage(options); this.logger.success('Function evaluated successfully on new page'); return result; } catch (error) { this.logger.error('Failed to evaluate function on new page:', error); throw error; } } async isBrowserAlive() { try { return await this.browser.isBrowserAlive(); } catch (error) { this.logger.error('Error checking if browser is alive:', error); return false; } } static async create(options) { const aioClient = new AioClient({ baseUrl: options.baseURl }); const cdpVersionResponse = await (null == aioClient ? void 0 : aioClient.cdpVersion()); const cdpVersion = (null == cdpVersionResponse ? void 0 : cdpVersionResponse.data) || cdpVersionResponse; const cdpUrl = null == cdpVersion ? void 0 : cdpVersion.webSocketDebuggerUrl; return new AIOBrowser(cdpUrl, options.logger); } constructor(cdpUrl, logger){ _define_property(this, "browser", void 0); _define_property(this, "logger", void 0); this.logger = (logger ?? defaultLogger).spawn('[AIOBrowser]'); this.browser = new RemoteBrowser({ wsEndpoint: cdpUrl, logger: this.logger }); this.logger.info('AIOBrowser constructed with cdpUrl:', cdpUrl); } } export { AIOBrowser }; //# sourceMappingURL=AIOBrowser.mjs.map