@eko-ai/eko-nodejs 4.1.1 → 4.1.3
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/browser.d.ts +12 -9
- package/dist/browser.d.ts.map +1 -1
- package/dist/index.cjs +92 -61
- package/dist/index.cjs.map +1 -1
- package/dist/index.esm.js +92 -61
- package/dist/index.esm.js.map +1 -1
- package/package.json +2 -2
package/dist/index.esm.js
CHANGED
|
@@ -2413,11 +2413,11 @@ class BrowserAgent extends BaseBrowserLabelsAgent {
|
|
|
2413
2413
|
constructor() {
|
|
2414
2414
|
super(...arguments);
|
|
2415
2415
|
this.browser = null;
|
|
2416
|
-
this.
|
|
2417
|
-
this.
|
|
2416
|
+
this.browserContext = null;
|
|
2417
|
+
this.activePage = null;
|
|
2418
2418
|
this.headless = false;
|
|
2419
2419
|
this.pageMap = new Map();
|
|
2420
|
-
this.
|
|
2420
|
+
this.lastSwitchedPage = null;
|
|
2421
2421
|
}
|
|
2422
2422
|
setHeadless(headless) {
|
|
2423
2423
|
this.headless = headless;
|
|
@@ -2439,17 +2439,19 @@ class BrowserAgent extends BaseBrowserLabelsAgent {
|
|
|
2439
2439
|
const page = await this.currentPage();
|
|
2440
2440
|
const screenshotBuffer = await page.screenshot({
|
|
2441
2441
|
fullPage: false,
|
|
2442
|
-
type:
|
|
2442
|
+
type: "jpeg",
|
|
2443
2443
|
quality: 60,
|
|
2444
|
+
animations: "disabled",
|
|
2444
2445
|
});
|
|
2445
|
-
const base64 = screenshotBuffer.toString(
|
|
2446
|
+
const base64 = screenshotBuffer.toString("base64");
|
|
2446
2447
|
return {
|
|
2447
|
-
imageType:
|
|
2448
|
+
imageType: "image/jpeg",
|
|
2448
2449
|
imageBase64: base64,
|
|
2449
2450
|
};
|
|
2450
2451
|
}
|
|
2451
2452
|
async navigate_to(agentContext, url) {
|
|
2452
2453
|
const page = await this.open_url(agentContext, url);
|
|
2454
|
+
this.lastSwitchedPage = page;
|
|
2453
2455
|
await this.sleep(200);
|
|
2454
2456
|
return {
|
|
2455
2457
|
url: page.url(),
|
|
@@ -2463,11 +2465,11 @@ class BrowserAgent extends BaseBrowserLabelsAgent {
|
|
|
2463
2465
|
return this.pageMap;
|
|
2464
2466
|
}
|
|
2465
2467
|
async get_all_tabs(agentContext) {
|
|
2466
|
-
if (!this.
|
|
2468
|
+
if (!this.browserContext) {
|
|
2467
2469
|
return [];
|
|
2468
2470
|
}
|
|
2469
2471
|
const result = [];
|
|
2470
|
-
const pages = this.
|
|
2472
|
+
const pages = this.browserContext.pages();
|
|
2471
2473
|
for (let i = 0; i < pages.length; i++) {
|
|
2472
2474
|
let page = pages[i];
|
|
2473
2475
|
let pageInfo = this.pageMap.get(page);
|
|
@@ -2489,8 +2491,8 @@ class BrowserAgent extends BaseBrowserLabelsAgent {
|
|
|
2489
2491
|
return result;
|
|
2490
2492
|
}
|
|
2491
2493
|
async switch_tab(agentContext, tabId) {
|
|
2492
|
-
if (!this.
|
|
2493
|
-
throw new Error(
|
|
2494
|
+
if (!this.browserContext) {
|
|
2495
|
+
throw new Error("tabId does not exist: " + tabId);
|
|
2494
2496
|
}
|
|
2495
2497
|
let switchPage = null;
|
|
2496
2498
|
this.pageMap.forEach((pageInfo, page) => {
|
|
@@ -2500,10 +2502,10 @@ class BrowserAgent extends BaseBrowserLabelsAgent {
|
|
|
2500
2502
|
}
|
|
2501
2503
|
});
|
|
2502
2504
|
if (!switchPage) {
|
|
2503
|
-
throw new Error(
|
|
2505
|
+
throw new Error("tabId does not exist: " + tabId);
|
|
2504
2506
|
}
|
|
2505
|
-
this.current_page = switchPage;
|
|
2506
2507
|
this.activePage = switchPage;
|
|
2508
|
+
this.lastSwitchedPage = switchPage;
|
|
2507
2509
|
return {
|
|
2508
2510
|
tabId: tabId,
|
|
2509
2511
|
url: switchPage.url(),
|
|
@@ -2513,10 +2515,10 @@ class BrowserAgent extends BaseBrowserLabelsAgent {
|
|
|
2513
2515
|
async input_text(agentContext, index, text, enter) {
|
|
2514
2516
|
try {
|
|
2515
2517
|
const elementHandle = await this.get_element(index, true);
|
|
2516
|
-
await elementHandle.fill(
|
|
2518
|
+
await elementHandle.fill("");
|
|
2517
2519
|
await elementHandle.fill(text);
|
|
2518
2520
|
if (enter) {
|
|
2519
|
-
await elementHandle.press(
|
|
2521
|
+
await elementHandle.press("Enter");
|
|
2520
2522
|
await this.sleep(200);
|
|
2521
2523
|
}
|
|
2522
2524
|
}
|
|
@@ -2559,32 +2561,30 @@ class BrowserAgent extends BaseBrowserLabelsAgent {
|
|
|
2559
2561
|
async open_url(agentContext, url) {
|
|
2560
2562
|
const browser_context = await this.getBrowserContext();
|
|
2561
2563
|
const page = await browser_context.newPage();
|
|
2562
|
-
// await page.setViewportSize({ width: 1920, height: 1080 });
|
|
2563
|
-
await page.setViewportSize({ width: 1536, height: 864 });
|
|
2564
2564
|
try {
|
|
2565
2565
|
await this.autoLoadCookies(url);
|
|
2566
2566
|
await this.autoLoadLocalStorage(page, url);
|
|
2567
2567
|
await page.goto(url, {
|
|
2568
|
-
waitUntil:
|
|
2568
|
+
waitUntil: "domcontentloaded",
|
|
2569
2569
|
timeout: 10000,
|
|
2570
2570
|
});
|
|
2571
|
-
await page.waitForLoadState(
|
|
2571
|
+
await page.waitForLoadState("networkidle", { timeout: 5000 });
|
|
2572
2572
|
}
|
|
2573
2573
|
catch (e) {
|
|
2574
|
-
if ((e +
|
|
2574
|
+
if ((e + "").indexOf("Timeout") == -1) {
|
|
2575
2575
|
throw e;
|
|
2576
2576
|
}
|
|
2577
2577
|
}
|
|
2578
|
-
this.
|
|
2578
|
+
this.activePage = page;
|
|
2579
2579
|
return page;
|
|
2580
2580
|
}
|
|
2581
2581
|
async currentPage() {
|
|
2582
|
-
if (this.
|
|
2583
|
-
throw new Error(
|
|
2582
|
+
if (this.activePage == null) {
|
|
2583
|
+
throw new Error("There is no page, please call navigate_to first");
|
|
2584
2584
|
}
|
|
2585
|
-
const page = this.
|
|
2585
|
+
const page = this.activePage;
|
|
2586
2586
|
try {
|
|
2587
|
-
await page.waitForLoadState(
|
|
2587
|
+
await page.waitForLoadState("domcontentloaded", { timeout: 10000 });
|
|
2588
2588
|
}
|
|
2589
2589
|
catch (e) { }
|
|
2590
2590
|
return page;
|
|
@@ -2594,37 +2594,57 @@ class BrowserAgent extends BaseBrowserLabelsAgent {
|
|
|
2594
2594
|
return await page.evaluateHandle((params) => {
|
|
2595
2595
|
let element = window.get_highlight_element(params.index);
|
|
2596
2596
|
if (element && params.findInput) {
|
|
2597
|
-
if (element.tagName !=
|
|
2598
|
-
element.tagName !=
|
|
2597
|
+
if (element.tagName != "INPUT" &&
|
|
2598
|
+
element.tagName != "TEXTAREA" &&
|
|
2599
2599
|
element.childElementCount != 0) {
|
|
2600
2600
|
element =
|
|
2601
|
-
element.querySelector(
|
|
2602
|
-
element.querySelector(
|
|
2601
|
+
element.querySelector("input") ||
|
|
2602
|
+
element.querySelector("textarea") ||
|
|
2603
2603
|
element;
|
|
2604
2604
|
}
|
|
2605
2605
|
}
|
|
2606
2606
|
return element;
|
|
2607
2607
|
}, { index, findInput });
|
|
2608
2608
|
}
|
|
2609
|
+
async go_back(agentContext) {
|
|
2610
|
+
try {
|
|
2611
|
+
await this.execute_script(agentContext, async () => {
|
|
2612
|
+
await window.navigation.back().finished;
|
|
2613
|
+
}, []);
|
|
2614
|
+
await this.sleep(100);
|
|
2615
|
+
}
|
|
2616
|
+
catch (e) {
|
|
2617
|
+
if (e?.name == "InvalidStateError" && this.lastSwitchedPage) {
|
|
2618
|
+
this.activePage && (await this.activePage.close());
|
|
2619
|
+
this.activePage = this.lastSwitchedPage;
|
|
2620
|
+
this.lastSwitchedPage = null;
|
|
2621
|
+
}
|
|
2622
|
+
else {
|
|
2623
|
+
throw new Error("Cannot go back");
|
|
2624
|
+
}
|
|
2625
|
+
}
|
|
2626
|
+
}
|
|
2609
2627
|
sleep(time) {
|
|
2610
2628
|
return new Promise((resolve) => setTimeout(() => resolve(), time));
|
|
2611
2629
|
}
|
|
2612
2630
|
async getBrowserContext() {
|
|
2613
|
-
if (!this.
|
|
2614
|
-
this.
|
|
2615
|
-
this.
|
|
2631
|
+
if (!this.browserContext) {
|
|
2632
|
+
this.activePage = null;
|
|
2633
|
+
this.browserContext = null;
|
|
2634
|
+
const viewport = this.options?.viewport || { width: 1536, height: 864 };
|
|
2616
2635
|
if (this.cdpWsEndpoint) {
|
|
2617
2636
|
this.browser = (await chromium.connectOverCDP(this.cdpWsEndpoint, this.options));
|
|
2618
|
-
this.
|
|
2637
|
+
this.browserContext = await this.browser.newContext({
|
|
2619
2638
|
userAgent: this.getUserAgent(),
|
|
2620
|
-
viewport:
|
|
2639
|
+
viewport: viewport,
|
|
2621
2640
|
});
|
|
2622
2641
|
}
|
|
2623
2642
|
else if (this.userDataDir) {
|
|
2624
|
-
this.
|
|
2643
|
+
this.browserContext = (await chromium.launchPersistentContext(this.userDataDir, {
|
|
2625
2644
|
headless: this.headless,
|
|
2626
|
-
channel:
|
|
2645
|
+
channel: "chrome",
|
|
2627
2646
|
args: this.getChromiumArgs(),
|
|
2647
|
+
viewport: viewport,
|
|
2628
2648
|
...this.options,
|
|
2629
2649
|
}));
|
|
2630
2650
|
}
|
|
@@ -2634,9 +2654,9 @@ class BrowserAgent extends BaseBrowserLabelsAgent {
|
|
|
2634
2654
|
args: this.getChromiumArgs(),
|
|
2635
2655
|
...this.options,
|
|
2636
2656
|
}));
|
|
2637
|
-
this.
|
|
2657
|
+
this.browserContext = await this.browser.newContext({
|
|
2638
2658
|
userAgent: this.getUserAgent(),
|
|
2639
|
-
viewport:
|
|
2659
|
+
viewport: viewport,
|
|
2640
2660
|
});
|
|
2641
2661
|
}
|
|
2642
2662
|
// Anti-crawling detection website:
|
|
@@ -2645,43 +2665,43 @@ class BrowserAgent extends BaseBrowserLabelsAgent {
|
|
|
2645
2665
|
chromium.use(StealthPlugin());
|
|
2646
2666
|
const init_script = await this.initScript();
|
|
2647
2667
|
if (init_script.content || init_script.path) {
|
|
2648
|
-
this.
|
|
2668
|
+
this.browserContext.addInitScript(init_script);
|
|
2649
2669
|
}
|
|
2650
|
-
this.
|
|
2670
|
+
this.browserContext.on("page", async (page) => {
|
|
2651
2671
|
this.activePage = page;
|
|
2652
2672
|
this.pageMap.set(page, {
|
|
2653
2673
|
tabId: tabId++,
|
|
2654
2674
|
lastAccessed: Date.now(),
|
|
2655
2675
|
});
|
|
2656
|
-
page.on(
|
|
2676
|
+
page.on("framenavigated", async (frame) => {
|
|
2657
2677
|
if (frame === page.mainFrame()) {
|
|
2658
2678
|
const url = frame.url();
|
|
2659
|
-
if (url.startsWith(
|
|
2679
|
+
if (url.startsWith("http")) {
|
|
2660
2680
|
await this.autoLoadCookies(url);
|
|
2661
2681
|
await this.autoLoadLocalStorage(page, url);
|
|
2662
2682
|
}
|
|
2663
2683
|
}
|
|
2664
2684
|
});
|
|
2665
|
-
page.on(
|
|
2685
|
+
page.on("close", () => {
|
|
2666
2686
|
this.pageMap.delete(page);
|
|
2667
2687
|
});
|
|
2668
2688
|
});
|
|
2669
2689
|
}
|
|
2670
2690
|
if (this.cookies) {
|
|
2671
|
-
this.
|
|
2691
|
+
this.browserContext?.addCookies(this.cookies);
|
|
2672
2692
|
}
|
|
2673
|
-
return this.
|
|
2693
|
+
return this.browserContext;
|
|
2674
2694
|
}
|
|
2675
2695
|
async autoLoadCookies(url) {
|
|
2676
2696
|
try {
|
|
2677
2697
|
const cookies = await this.loadCookiesWithUrl(url);
|
|
2678
2698
|
if (cookies && cookies.length > 0) {
|
|
2679
|
-
await this.
|
|
2680
|
-
await this.
|
|
2699
|
+
await this.browserContext?.clearCookies();
|
|
2700
|
+
await this.browserContext?.addCookies(cookies);
|
|
2681
2701
|
}
|
|
2682
2702
|
}
|
|
2683
2703
|
catch (e) {
|
|
2684
|
-
Log.error(
|
|
2704
|
+
Log.error("Failed to auto load cookies: " + url, e);
|
|
2685
2705
|
}
|
|
2686
2706
|
}
|
|
2687
2707
|
async autoLoadLocalStorage(page, url) {
|
|
@@ -2694,12 +2714,12 @@ class BrowserAgent extends BaseBrowserLabelsAgent {
|
|
|
2694
2714
|
}
|
|
2695
2715
|
}
|
|
2696
2716
|
catch (e) {
|
|
2697
|
-
Log.error(
|
|
2717
|
+
Log.error("Failed to inject localStorage: " + url, e);
|
|
2698
2718
|
}
|
|
2699
2719
|
}, localStorageData);
|
|
2700
2720
|
}
|
|
2701
2721
|
catch (e) {
|
|
2702
|
-
Log.error(
|
|
2722
|
+
Log.error("Failed to auto load localStorage: " + url, e);
|
|
2703
2723
|
}
|
|
2704
2724
|
}
|
|
2705
2725
|
async loadCookiesWithUrl(url) {
|
|
@@ -2710,18 +2730,18 @@ class BrowserAgent extends BaseBrowserLabelsAgent {
|
|
|
2710
2730
|
}
|
|
2711
2731
|
getChromiumArgs() {
|
|
2712
2732
|
return [
|
|
2713
|
-
|
|
2714
|
-
|
|
2715
|
-
|
|
2716
|
-
|
|
2717
|
-
|
|
2718
|
-
|
|
2719
|
-
|
|
2720
|
-
|
|
2721
|
-
|
|
2722
|
-
|
|
2723
|
-
|
|
2724
|
-
|
|
2733
|
+
"--no-sandbox",
|
|
2734
|
+
"--remote-allow-origins=*",
|
|
2735
|
+
"--disable-dev-shm-usage",
|
|
2736
|
+
"--disable-popup-blocking",
|
|
2737
|
+
"--ignore-ssl-errors",
|
|
2738
|
+
"--ignore-certificate-errors",
|
|
2739
|
+
"--ignore-certificate-errors-spki-list",
|
|
2740
|
+
"--disable-blink-features=AutomationControlled",
|
|
2741
|
+
"--disable-infobars",
|
|
2742
|
+
"--disable-notifications",
|
|
2743
|
+
"--disable-web-security",
|
|
2744
|
+
"--disable-features=IsolateOrigins,site-per-process",
|
|
2725
2745
|
];
|
|
2726
2746
|
}
|
|
2727
2747
|
getUserAgent() {
|
|
@@ -2737,9 +2757,20 @@ class BrowserAgent extends BaseBrowserLabelsAgent {
|
|
|
2737
2757
|
async initScript() {
|
|
2738
2758
|
return {};
|
|
2739
2759
|
}
|
|
2760
|
+
async getBrowser() {
|
|
2761
|
+
return this.browser;
|
|
2762
|
+
}
|
|
2740
2763
|
async getActivePage() {
|
|
2741
2764
|
return this.activePage;
|
|
2742
2765
|
}
|
|
2766
|
+
async close() {
|
|
2767
|
+
if (this.browserContext) {
|
|
2768
|
+
await this.browserContext.close();
|
|
2769
|
+
}
|
|
2770
|
+
if (this.browser) {
|
|
2771
|
+
await this.browser.close();
|
|
2772
|
+
}
|
|
2773
|
+
}
|
|
2743
2774
|
}
|
|
2744
2775
|
|
|
2745
2776
|
class SimpleStdioMcpClient {
|