@gui-agent/operator-aio
Version:
AIO (All-in-One) operator for GUI Agent
142 lines (141 loc) • 5.17 kB
JavaScript
/**
* 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