@gui-agent/operator-aio
Version:
AIO (All-in-One) operator for GUI Agent
176 lines (175 loc) • 6.46 kB
JavaScript
/**
* Copyright (c) 2025 Bytedance, Inc. and its affiliates.
* SPDX-License-Identifier: Apache-2.0
*/
;
var __webpack_require__ = {};
(()=>{
__webpack_require__.d = (exports1, definition)=>{
for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
enumerable: true,
get: definition[key]
});
};
})();
(()=>{
__webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
})();
(()=>{
__webpack_require__.r = (exports1)=>{
if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
value: 'Module'
});
Object.defineProperty(exports1, '__esModule', {
value: true
});
};
})();
var __webpack_exports__ = {};
__webpack_require__.r(__webpack_exports__);
__webpack_require__.d(__webpack_exports__, {
AIOBrowser: ()=>AIOBrowser
});
const browser_namespaceObject = require("@agent-infra/browser");
const logger_namespaceObject = require("@agent-infra/logger");
const sandbox_namespaceObject = require("@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 sandbox_namespaceObject.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 ?? logger_namespaceObject.defaultLogger).spawn('[AIOBrowser]');
this.browser = new browser_namespaceObject.RemoteBrowser({
wsEndpoint: cdpUrl,
logger: this.logger
});
this.logger.info('AIOBrowser constructed with cdpUrl:', cdpUrl);
}
}
exports.AIOBrowser = __webpack_exports__.AIOBrowser;
for(var __webpack_i__ in __webpack_exports__)if (-1 === [
"AIOBrowser"
].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
Object.defineProperty(exports, '__esModule', {
value: true
});
//# sourceMappingURL=AIOBrowser.js.map