@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/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,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: 'jpeg',
2442
+ type: "jpeg",
2443
2443
  quality: 60,
2444
2444
  });
2445
- const base64 = screenshotBuffer.toString('base64');
2445
+ const base64 = screenshotBuffer.toString("base64");
2446
2446
  return {
2447
- imageType: 'image/jpeg',
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.browser_context) {
2467
+ if (!this.browserContext) {
2467
2468
  return [];
2468
2469
  }
2469
2470
  const result = [];
2470
- const pages = this.browser_context.pages();
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.browser_context) {
2493
- throw new Error('tabId does not exist: ' + tabId);
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('tabId does not exist: ' + tabId);
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('Enter');
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: 'domcontentloaded',
2569
+ waitUntil: "domcontentloaded",
2569
2570
  timeout: 10000,
2570
2571
  });
2571
- await page.waitForLoadState('networkidle', { timeout: 5000 });
2572
+ await page.waitForLoadState("networkidle", { timeout: 5000 });
2572
2573
  }
2573
2574
  catch (e) {
2574
- if ((e + '').indexOf('Timeout') == -1) {
2575
+ if ((e + "").indexOf("Timeout") == -1) {
2575
2576
  throw e;
2576
2577
  }
2577
2578
  }
2578
- this.current_page = page;
2579
+ this.activePage = page;
2579
2580
  return page;
2580
2581
  }
2581
2582
  async currentPage() {
2582
- if (this.current_page == null) {
2583
- throw new Error('There is no page, please call navigate_to first');
2583
+ if (this.activePage == null) {
2584
+ throw new Error("There is no page, please call navigate_to first");
2584
2585
  }
2585
- const page = this.current_page;
2586
+ const page = this.activePage;
2586
2587
  try {
2587
- await page.waitForLoadState('domcontentloaded', { timeout: 10000 });
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 != 'INPUT' &&
2598
- element.tagName != 'TEXTAREA' &&
2598
+ if (element.tagName != "INPUT" &&
2599
+ element.tagName != "TEXTAREA" &&
2599
2600
  element.childElementCount != 0) {
2600
2601
  element =
2601
- element.querySelector('input') ||
2602
- element.querySelector('textarea') ||
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.browser_context) {
2614
- this.current_page = null;
2615
- this.browser_context = null;
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.browser_context = await this.browser.newContext({
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.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(),
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.browser_context = await this.browser.newContext({
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.browser_context.addInitScript(init_script);
2667
+ this.browserContext.addInitScript(init_script);
2649
2668
  }
2650
- this.browser_context.on('page', async (page) => {
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('framenavigated', async (frame) => {
2675
+ page.on("framenavigated", async (frame) => {
2657
2676
  if (frame === page.mainFrame()) {
2658
2677
  const url = frame.url();
2659
- if (url.startsWith('http')) {
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('close', () => {
2684
+ page.on("close", () => {
2666
2685
  this.pageMap.delete(page);
2667
2686
  });
2668
2687
  });
2669
2688
  }
2670
2689
  if (this.cookies) {
2671
- this.browser_context?.addCookies(this.cookies);
2690
+ this.browserContext?.addCookies(this.cookies);
2672
2691
  }
2673
- return this.browser_context;
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.browser_context?.clearCookies();
2680
- await this.browser_context?.addCookies(cookies);
2698
+ await this.browserContext?.clearCookies();
2699
+ await this.browserContext?.addCookies(cookies);
2681
2700
  }
2682
2701
  }
2683
2702
  catch (e) {
2684
- Log.error('Failed to auto load cookies: ' + url, e);
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('Failed to inject localStorage: ' + url, e);
2716
+ Log.error("Failed to inject localStorage: " + url, e);
2698
2717
  }
2699
2718
  }, localStorageData);
2700
2719
  }
2701
2720
  catch (e) {
2702
- Log.error('Failed to auto load localStorage: ' + url, e);
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
- '--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',
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 {