
    {i                        d Z ddlZddlZddlZddlZddlmZ ddlmZm	Z	m
Z
 	 ddlmZmZmZmZ 	 ddlmZ d	Z ed
      Zej1                  dd       dZeej4                  j7                  dd      vr.e dej4                  j7                  dd       ej4                  d<   ddlZ G d d      ZddlZd Ze dk(  r e        yy# e$ r  ed        ej$                  d       Y w xY w# e$ r  ed        ej$                  d       Y w xY w)zK
Browser Agent for Genesis System
Powered by Playwright and Gemini Vision.
    N)Path)DictAnyOptional)sync_playwrightPageBrowserBrowserContextzRERROR: Playwright not installed. Run: pip install playwright && playwright install   zNERROR: google-generativeai not installed. Run: pip install google-generativeaizgemini-3-pro-previewz&/mnt/e/genesis-system/data/screenshotsT)parentsexist_okzE/mnt/e/genesis-system/.venvs/playwright-libs/usr/lib/x86_64-linux-gnuLD_LIBRARY_PATH :c                   v    e Zd ZddedefdZd Zd Zd Zdde	d	e	fd
Z
dde	de	fdZdde	de	de	fdZde	fdZy)BrowserAgentNheadlessuser_agentsc                    || _         d | _        d | _        d | _        d | _        t
        j                  j                  d      | _        |xs g d| _	        | j                  s[t        d      }|j                         r@|j                         j                         | _        | j                  t
        j                  d<   | j                  r!t        j                  | j                         y t!        d       y )NGOOGLE_API_KEY)zoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36zuMozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36zeMozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36z4/mnt/e/genesis-system/Credentials/gemini_api_key.txt)api_keyzDWARNING: GOOGLE_API_KEY not found. Vision features will be disabled.)r   
playwrightbrowsercontextpageosenvirongetr   r   r   exists	read_textstripgenai	configureprint)selfr   r   key_paths       ./mnt/e/genesis-system/scripts/browser_agent.py__init__zBrowserAgent.__init__(   s     	zz~~&67& 
 +
 ||RSH '11399;/3||

+,<<OODLL1XY    c                     t               j                         | _        | j                  j                  j	                  | j
                  ddg      | _        y)zStart the browser.z--no-sandboxz--disable-gpu)r   argsN)r   startr   chromiumlaunchr   r   r%   s    r'   r,   zBrowserAgent.startA   sE    )+113//66]] /2 7 
r)   c                    t        j                  | j                        }| j                  j	                  ddd|      | _        | j
                  j                         | _        t        d| j                   d| d       y)	z+Create a new page with a random user agent.i  i8  )widthheight)viewport
user_agentzBrowser started (headless=z, user_agent=)N)
randomchoicer   r   new_contextr   new_pager   r$   r   )r%   r4   s     r'   r9   zBrowserAgent.new_pageI   so    ]]4#3#34
||//#t4! 0 
 LL))+	*4==/zlRSTUr)   c                     | j                   r| j                   j                          | j                  r| j                  j                          | j                  r| j                  j	                          t        d       y)zStop the browser.zBrowser stoppedN)r   closer   r   stopr$   r/   s    r'   r<   zBrowserAgent.stopS   sP    <<LL <<LL ??OO  " r)   url
wait_untilc           
         | j                   st        d      t        d      D ]W  }	 t        d| d|dz    d       | j                   j	                  ||d      }t        d	| d
|r|j
                  nd d        y y# t        $ r6}t        d|dz    d| d|        t        j                  d       Y d}~d}~ww xY w)zNavigate to a URL with retries.Browser not started   zNavigating to z
 (attempt r   z)...i`  )r>   timeoutzLoaded z
 (Status: Unknownr5   TzAttempt z failed: Error navigating to z:    NF)	r   RuntimeErrorranger$   gotostatus	Exceptiontimesleep)r%   r=   r>   iresponsees         r'   navigatezBrowserAgent.navigate^   s    yy455q 	Ase:acU$?@99>>#*e>TuJ(xPY.ZZ[\]	 	  1%B3%r!MN

1s   AA>>	B=,B88B=filenamereturnc                 
   | j                   st        d      |s#t        t        j                               }d| d}t        |z  }| j                   j                  t        |      d       t        d|        t        |      S )z&Take a screenshot and return the path.r@   screenshot_z.pngT)path	full_pagezScreenshot saved to )r   rE   intrJ   SCREENSHOT_DIR
screenshotstrr$   )r%   rP   	timestamprT   s       r'   rX   zBrowserAgent.screenshoto   su    yy455DIIK(I$YKt4H(		#d)t<$TF+,4yr)   promptscreenshot_pathc                    | j                   sy|s| j                         }t        d| dt         d       	 t	        j
                  t              }t        |d      5 }|j                         }ddd       ddg}|j                  ||d	   g      }t        d
       |j                  S # 1 sw Y   <xY w# t        $ r}t        d|        d| cY d}~S d}~ww xY w)zHAnalyze the current page (or a specific screenshot) using Gemini Vision.z1Error: No API key configured for vision analysis.z
Analyzing z with z...rbNz	image/png)	mime_typedatar   zAnalysis complete.zError during analysis: zError: )r   rX   r$   DEFAULT_MODELr"   GenerativeModelopenreadgenerate_contenttextrI   )	r%   r[   r\   modelf
image_dataimage_partsrM   rN   s	            r'   analyze_pagezBrowserAgent.analyze_page}   s    ||F"oo/O
?+6-DE	!))-8E ot, &VVX
&
 "-&K --v{1~.FGH&'== & &  	!+A3/0QC= 	!s5   %B4 B(-:B4 (B1-B4 4	C=CCCc                 d    | j                   st        d      | j                   j                         S )zGet current page HTML.r@   )r   rE   contentr/   s    r'   get_htmlzBrowserAgent.get_html   s(    yy455yy  ""r)   )TN)domcontentloaded)N)zAnalyze this webpage.N)__name__
__module____qualname__boollistr(   r,   r9   r<   rY   rO   rX   rk   rn    r)   r'   r   r   '   sv    Z Z4 Z2
V!C S "3 # !3 !SV !be !>## #r)   r   c                  T   t        j                  d      } | j                  ddd       | j                         }t	        d      }	 |j                          |j                  }|j                  |      rk|j                  d	      }d
}|j                  ||      }t        d       t        |       t        d       t        d      j                  |       t        d       |j                          y# t        $ r}t        d|        Y d}~-d}~ww xY w# |j                          w xY w)zTest the BrowserAgent.zBrowser Agent)descriptionz--urlzhttps://www.cairnsplumber.comzURL to visit)defaulthelpT)r   ztest_site.pngz
            Analyze this webpage.
            1. What is the main purpose of this page?
            2. Describe the visual style.
            3. Are there any visible interactive elements?
            z\n=== ANALYSIS RESULT ===\nz\n=======================\nztest_analysis.mdz"Analysis saved to test_analysis.mdzTest failed: N)argparseArgumentParseradd_argument
parse_argsr   r,   r=   rO   rX   rk   r$   r   
write_textrI   r<   )parserr+   agentr=   r\   r[   analysisrN   s           r'   mainr      s   $$AF
)H~^D$'E hh>>##..?OF ))&/BH12(O12 #$//967
 	

  #aS!""# 	

s+   BC1 1	D:DD DD D'__main__)!__doc__r   sysrJ   base64pathlibr   typingr   r   r   playwright.sync_apir   r   r	   r
   ImportErrorr$   exitgoogle.generativeaigenerativeair"   ra   rW   mkdir	LIBS_PATHr   r   r6   r   rz   r   rp   ru   r)   r'   <module>r      s"  
 
 
    & &RR
' '>?   TD  1 T	BJJNN#4b99'0k2::>>BSUW3X2Y$ZBJJ ! y# y#v %N zF w  	
^_CHHQK  	
Z[CHHQKs"   C C* C'&C'*DD