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