@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/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.browser_context = null;
2417
- this.current_page = null;
2416
+ this.browserContext = null;
2417
+ this.activePage = null;
2418
2418
  this.headless = false;
2419
2419
  this.pageMap = new Map();
2420
- this.activePage = null;
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: 'jpeg',
2442
+ type: "jpeg",
2443
2443
  quality: 60,
2444
+ animations: "disabled",
2444
2445
  });
2445
- const base64 = screenshotBuffer.toString('base64');
2446
+ const base64 = screenshotBuffer.toString("base64");
2446
2447
  return {
2447
- imageType: 'image/jpeg',
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.browser_context) {
2468
+ if (!this.browserContext) {
2467
2469
  return [];
2468
2470
  }
2469
2471
  const result = [];
2470
- const pages = this.browser_context.pages();
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.browser_context) {
2493
- throw new Error('tabId does not exist: ' + tabId);
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('tabId does not exist: ' + tabId);
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('Enter');
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: 'domcontentloaded',
2568
+ waitUntil: "domcontentloaded",
2569
2569
  timeout: 10000,
2570
2570
  });
2571
- await page.waitForLoadState('networkidle', { timeout: 5000 });
2571
+ await page.waitForLoadState("networkidle", { timeout: 5000 });
2572
2572
  }
2573
2573
  catch (e) {
2574
- if ((e + '').indexOf('Timeout') == -1) {
2574
+ if ((e + "").indexOf("Timeout") == -1) {
2575
2575
  throw e;
2576
2576
  }
2577
2577
  }
2578
- this.current_page = page;
2578
+ this.activePage = page;
2579
2579
  return page;
2580
2580
  }
2581
2581
  async currentPage() {
2582
- if (this.current_page == null) {
2583
- throw new Error('There is no page, please call navigate_to first');
2582
+ if (this.activePage == null) {
2583
+ throw new Error("There is no page, please call navigate_to first");
2584
2584
  }
2585
- const page = this.current_page;
2585
+ const page = this.activePage;
2586
2586
  try {
2587
- await page.waitForLoadState('domcontentloaded', { timeout: 10000 });
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 != 'INPUT' &&
2598
- element.tagName != 'TEXTAREA' &&
2597
+ if (element.tagName != "INPUT" &&
2598
+ element.tagName != "TEXTAREA" &&
2599
2599
  element.childElementCount != 0) {
2600
2600
  element =
2601
- element.querySelector('input') ||
2602
- element.querySelector('textarea') ||
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.browser_context) {
2614
- this.current_page = null;
2615
- this.browser_context = null;
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.browser_context = await this.browser.newContext({
2637
+ this.browserContext = await this.browser.newContext({
2619
2638
  userAgent: this.getUserAgent(),
2620
- viewport: { width: 1536, height: 864 },
2639
+ viewport: viewport,
2621
2640
  });
2622
2641
  }
2623
2642
  else if (this.userDataDir) {
2624
- this.browser_context = (await chromium.launchPersistentContext(this.userDataDir, {
2643
+ this.browserContext = (await chromium.launchPersistentContext(this.userDataDir, {
2625
2644
  headless: this.headless,
2626
- channel: 'chrome',
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.browser_context = await this.browser.newContext({
2657
+ this.browserContext = await this.browser.newContext({
2638
2658
  userAgent: this.getUserAgent(),
2639
- viewport: { width: 1536, height: 864 },
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.browser_context.addInitScript(init_script);
2668
+ this.browserContext.addInitScript(init_script);
2649
2669
  }
2650
- this.browser_context.on('page', async (page) => {
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('framenavigated', async (frame) => {
2676
+ page.on("framenavigated", async (frame) => {
2657
2677
  if (frame === page.mainFrame()) {
2658
2678
  const url = frame.url();
2659
- if (url.startsWith('http')) {
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('close', () => {
2685
+ page.on("close", () => {
2666
2686
  this.pageMap.delete(page);
2667
2687
  });
2668
2688
  });
2669
2689
  }
2670
2690
  if (this.cookies) {
2671
- this.browser_context?.addCookies(this.cookies);
2691
+ this.browserContext?.addCookies(this.cookies);
2672
2692
  }
2673
- return this.browser_context;
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.browser_context?.clearCookies();
2680
- await this.browser_context?.addCookies(cookies);
2699
+ await this.browserContext?.clearCookies();
2700
+ await this.browserContext?.addCookies(cookies);
2681
2701
  }
2682
2702
  }
2683
2703
  catch (e) {
2684
- Log.error('Failed to auto load cookies: ' + url, e);
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('Failed to inject localStorage: ' + url, e);
2717
+ Log.error("Failed to inject localStorage: " + url, e);
2698
2718
  }
2699
2719
  }, localStorageData);
2700
2720
  }
2701
2721
  catch (e) {
2702
- Log.error('Failed to auto load localStorage: ' + url, e);
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
- '--no-sandbox',
2714
- '--remote-allow-origins=*',
2715
- '--disable-dev-shm-usage',
2716
- '--disable-popup-blocking',
2717
- '--ignore-ssl-errors',
2718
- '--ignore-certificate-errors',
2719
- '--ignore-certificate-errors-spki-list',
2720
- '--disable-blink-features=AutomationControlled',
2721
- '--disable-infobars',
2722
- '--disable-notifications',
2723
- '--disable-web-security',
2724
- '--disable-features=IsolateOrigins,site-per-process',
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 {