
    i                        d Z ddlZddlZddl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 ddlmZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZmZmZmZmZmZ ddlm Z  ddl!m"Z" ddl#m$Z$ ddl%m&Z& ddl'm(Z( ddl)m*Z*m+Z+ ddl,m-Z- ddl.m/Z/ ddl0m1Z1m2Z2 ddl3m4Z4m5Z5m6Z6m7Z7 ddl8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZA  ej                  eC      ZD G d d      ZEy)zUCode-use agent service - Jupyter notebook-like code execution for browser automation.    N)Path)Any)uuid7str)BrowserSession)BrowserProfile)
DomService)
FileSystem)BaseChatModel)AssistantMessageBaseMessageContentPartImageParamContentPartTextParamImageURLUserMessage)ScreenshotService)ProductTelemetry)AgentTelemetryEvent)	TokenCost)UsageSummary)CodeAgentToolsTools)get_browser_use_version   )format_browser_state_for_llm)EvaluateErrorcreate_namespace)detect_token_limit_issueextract_code_blocksextract_url_from_tasktruncate_message_content)	CellTypeCodeAgentHistoryCodeAgentHistoryListCodeAgentModelOutputCodeAgentResultCodeAgentStateCodeAgentStepMetadataExecutionStatusNotebookSessionc            "          e Zd ZdZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d<dededz  dedz  dedz  dedz  dedz  d	edz  d
edz  de	e   dz  de
eee
eef   z  f   dz  dededededededz  f dZd=dedz  defdZd=dedz  deeef   fdZdededdfdZdedeedz  edz  edz  f   fdZdeeedz  f   fdZd=dededz  dedz  d edz  def
d!Zdefd"Zdededz  fd#Zd$ed%ededz  dedz  d&edz  ddfd'Zd>d(ed)ed*e
eef   dz  ddfd+Zd,eddfd-Zd.edz  ddfd/Zd=ded0edz  ddfd1Zd=d2edz  de	edz     fd3Ze defd4       Z!e de"fd5       Z#d?d6Z$d@d7Z%d8e&e'   dz  d9e'dz  d:eddfd;Z(y)A	CodeAgenta  
	Agent that executes Python code in a notebook-like environment for browser automation.

	This agent provides a Jupyter notebook-like interface where the LLM writes Python code
	that gets executed in a persistent namespace with browser control functions available.
	Ntaskllmbrowser_sessionbrowsertools
controllerpage_extraction_llmfile_systemavailable_file_pathssensitive_data	max_stepsmax_failuresmax_validations
use_visioncalculate_cost	demo_modec                 P   |r/t         j                  dt        |j                                       |#	 ddlm}  |       }t         j                  d       d|j                  j                  vrt        d      |r|rt        d	      |xs |}|r|rt        d
      |xs |}d| _        |i }|||d<   t        di || _        nd| _        || _        || _        || _        | j                   r|Z| j                   j"                  j$                  |k7  r7| j                   j"                  j'                  d|i      | j                   _        t)        | j                   j"                  j$                        | _        |xs
 t+               | _        || _        ||nt1        d      | _        |	xs g | _        |
| _        || _        || _        || _        || _        tA               | _!        i | _"        g | _#        g | _$        d| _%        d| _&        d| _'        d| _(        d| _)        d| _*        d| _+        d| _,        d| _-        t]               | _/        t`        j`                  jc                         je                  d      }tg        d      }|d| j^                   d| z  | _4        tk        | jh                        | _6        to        |      | _8        | jp                  js                  |       |r| jp                  js                  |       tu               | _;        	 tg        tx              jz                  jz                  jz                  g d}t}        fd|D              rd| _?        nd| _?        t               | _A        y# t        $ r}t        d|       d}~ww xY w# t        $ r
 d| _?        Y Aw xY w)a  
		Initialize the code-use agent.

		Args:
			task: The task description for the agent
			browser_session: Optional browser session (will be created if not provided) [DEPRECATED: use browser]
			browser: Optional browser session (cleaner API)
			tools: Optional Tools instance (will create default if not provided)
			controller: Optional Tools instance
			page_extraction_llm: Optional LLM for page extraction
			file_system: Optional file system for file operations
			available_file_paths: Optional list of available file paths
			sensitive_data: Optional sensitive data dictionary
			max_steps: Maximum number of execution steps
			max_failures: Maximum consecutive errors before termination (default: 8)
			max_validations: Maximum number of times to run the validator agent (default: 0)
			use_vision: Whether to include screenshots in LLM messages (default: True)
			calculate_cost: Whether to calculate token costs (default: False)
			demo_mode: Enable the in-browser demo panel for live logging (default: False)
			llm: Optional ChatBrowserUse LLM instance (will create default if not provided)
			**kwargs: Additional keyword arguments for compatibility (ignored)
		z8Ignoring additional kwargs for CodeAgent compatibility: Nr   )ChatBrowserUsezCodeAgent using ChatBrowserUsez$Failed to initialize CodeAgent LLM: r=   z*This agent works only with ChatBrowserUse.zbCannot specify both "browser" and "browser_session" parameters. Use "browser" for the cleaner API.z^Cannot specify both "controller" and "tools" parameters. Use "controller" for the cleaner API.Fr;   )updatez./)base_dirg        z%Y%m%d_%H%M%Sz/tmpbrowser_use_code_agent__)agent_directory)include_cost)z.gitz	README.mddocsexamplesc              3   V   K   | ]   }t        |z        j                          " y wN)r   exists).0filepackage_roots     f/mnt/e/genesis-system/.venvs/browser-army/lib/python3.12/site-packages/browser_use/code_use/service.py	<genexpr>z%CodeAgent.__init__.<locals>.<genexpr>   s$     	D$|d"
#
*
*
,	Ds   &)gitpipunknown )Bloggerdebuglistkeysbrowser_user=   	ExceptionRuntimeError	__class____name__
ValueError_demo_mode_enabledr   _browser_profile_for_initr,   r-   r.   browser_profiler;   
model_copyboolr   r0   r2   r	   r3   r4   r5   r6   r7   r8   r9   r)   session	namespace_llm_messagescomplete_historydom_service_last_browser_state_text_last_screenshot_consecutive_errors_validation_count_last_llm_usage_step_start_timeusage_summary_sample_output_addedr   iddatetimenowstrftimer   rB   r   screenshot_servicer   token_cost_serviceregister_llmr   version__file__parentallsourcer   	telemetry)selfr,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   kwargsr=   eprofile_kwargs	timestampbase_tmp
repo_filesrK   s                           @rL   __init__zCodeAgent.__init__>   s{   Z 	<<J4PVP[P[P]K^J_`a[C*

C
LL12 S]]333	@	AA 	x	yy./ E	t	uu

% "$$&>"+N;$2$D^$D4!$(4!$)$(($	 4 4 D D N NR[ [+/+?+?+O+O+Z+Z)$ ,[ ,D( "$"6"6"F"F"P"PQ4(($*0$$/$;[UYAZ$28b$&$$."$($$/ "$,#%$.*,$24$(,$.2$&*$$$%)$$,0$#$ J$'##%..?)&\(!&=dggYa	{$SS$-d>R>RS$ &>B$&&s+''(;< )*$,x.''..55<9:		D	DDDKDK
 $%$.k  C
=aSA
BBCb 
 4;s*   "M3 AN 3	N<N

NN%$N%returnc                 $  K   ||n| j                   }|| _         | j                  K| j                  J t        | j                        | _        | j                  j	                          d{    | j                  rt        | j                  j                  j                        | _        | j                  r6t        | j                  j                  dd      rt        j                  d       | j                  r*| j                  d| j                   ddd	i       d{    t        | j                  d
      | _        t!        | j                  | j"                  | j$                  | j&                  | j(                  | j*                        | _        | j.                  j1                  t3        d| j                                d}d}t5        | j                        }|r	 t        j7                  d|         | j,                  d   |       d{    t9        j:                  d       d{    d| d}| j<                  j?                  |      }t@        jB                  |_"        | j<                  jG                         |_$        d| |_%        | j                  r#	 | jM                          d{   \  }}	||_'        | j                  r6| j                  r*	 | jM                          d{   \  }}|| _-        || _.        t_        | j                         D ]  }t        j7                  d|dz    d| j                           | j                  d|dz    d| j                    dd|dz   i       d{    t`        j`                  jc                         je                         | _3        | j                   |z
  dz
  }| jh                  | jj                  z
  }|dk  xs |dk  xs |dk  xr | jj                  dk\  }|rHd|dz    d | jj                   d| jh                   d!}| j.                  j1                  t3        |             	 | jZ                  sW| j                  rK| j                  r?	 t        jS                  d"       | jM                          d{   \  }}|| _-        || _.        	 | jm                  |dz   $       d{   \  }}|r|jo                         d+k(  r| jq                         rPt        j7                  d,       | js                  d+||d| ju                  |dz          d{   -       d{     n%t        j                  d.       | xjj                  dz  c_5        | j                  r6| j                  r*	 | jM                          d{   \  }}|| _-        || _.        | j,                  jw                  d0i       }ty        |j{                               D cg c]  }|j}                  d1      s| }}t        |      dkD  rrd}d}t        |      D ]_  \  }}t        j7                  d2|dz    dt        |              ||   }| j                  |       d{   \  }}}	|r	|xs d+|z   }|s]|} n n| j                  |       d{   \  }}}	|r| xjj                  dz  c_5        t        j                  d3| jj                   d| jh                          | jj                  | jh                  k\  rt        jY                  d)| jh                   d4       | j                  d5| jh                   d6d(d|dz   i       d{    | js                  |d7| jh                   d8dd9| jh                   d:d-       d{     nd;| _5        | jq                         r| j,                  jw                  d<      }| j                   |z
  dz
  }| j                  | j                  k  xr |d=k\  xr | jj                  d>k  } | r| xj                  dz  c_B        t        j7                  d?       dd@lmD}!  |!| j                  || j                  A       d{   \  }"}#|"st        j                  dB       dC|# dD}$d| j,                  dE<   | j,                  j                  d<d       | j,                  j                  dFd       | j.                  j1                  t3        |$             npt        j7                  dG       |rY|}nV| j                  | j                  k\  r$t        j7                  dH| j                   dI       nt        j7                  dJ       |r|}|r| jq                         rpt        j7                  dKt        |      dLkD  r|ddL n|        | j,                  jw                  dM      }%|%r@t        j7                  dNdOj                  |%              nt        j7                  dP|        | ju                  |dz          d{   }&| js                  |||||&-       d{    | jq                         r| j,                  jw                  d<|      }t        j7                  dQ       |r)t        j7                  dR|        | j                  |       | j                  r$| j                  dS|xs dT dUdd	i       d{    d
} n| j                  ||||dz   V      }'t        |'      }(| j.                  j1                  t3        |(              t        j                  dX| j                    dY       | j                  dX| j                    dZd(dd	i       d{    | jq                         s| j                  r| j                  d[   })|)j                  r|)j                  d;   nd}*|*r|*j                  nd}+|*r|*jX                  nd},g }-|-j1                  d\| j                    d]       |-j1                  d^       |+r|-j1                  d_|+        |,r|-j1                  d`|,        g }.ty        | j,                  j{                               D ]y  }/|/j}                  da      r|/dbvs| j,                  |/   }0t        |0t        t        f      s@|0sC|.j1                  dc|/ dt        |0      j                   ddt        |0       de       { |.r"|-j1                  df       |-j                  |.       dgj                  |-      }1|*r|1|*_O        d|*_V        d|*_W        t        j7                  dh|1        | j                  r | j                  di|1 d(dd	i       d{    | jq                         rt        j7                  dj       t        j7                  dk       t        j7                  dl       | j,                  jw                  d<      }|r)t        j7                  dm|        | j                  |       | j,                  jw                  dM      }%|%r0t        j7                  dnt        do      j                  |%              t        j7                  dp       | j                  r(|s&| j                  dS|xs dT dUdd	i       d{    d
}|r)| j                  rt9        j:                  dq       d{    | j                          d{    | j                  j                          d{   | _\        | j                  j                          d{    	 | j                  | j                   |r       | j                  | j<                  __        | j                  | j<                  _`        | j<                  S 7 7 U7 g7 M7 # tP        $ r#}
t        jS                  d|
        Y d}
~
d}
~
ww xY w# tP        $ r}t        j                  d| d|        d| d}| j<                  j?                  |      }t@        jT                  |_"        | j<                  jG                         |_$        tW        |      |_,        Y d}~~d}~ww xY w7 Z# tP        $ r#}t        j                  d|        Y d}~nd}~ww xY w7 7 # tP        $ r#}t        j                  d#|        Y d}~d}~ww xY w7 # tP        $ r}| xjj                  dz  c_5        t        j                  d%| jj                   d| jh                   d&|        | j                  d'| d(d|dz   i       d{  7   | jj                  | jh                  k\  r*t        jY                  d)| jh                   d*       Y d}~ t9        j:                  d       d{  7   Y d}~td}~ww xY w7 n7 d7 	# tP        $ r#}t        j                  d/|        Y d}~d}~ww xY wc c}w 7 q7 C7 
7 
[7 	7 7 7 (# tP        $ r>}t        jY                  dW|dz    d|        t        j                          Y d}~ d}~ww xY w7 7 7 7 7 |7 ]7 9# tP        $ r%}2t        jY                  ds|2 d
t       Y d}2~2Bd}2~2ww xY ww)uz
		Run the agent to complete the task.

		Args:
			max_steps: Optional override for maximum number of steps (uses __init__ value if not provided)

		Returns:
			The notebook session with all executed cells
		N)r^   headlessFz\Demo mode is enabled but the browser is headless=True; set headless=False to view the panel.zStarted CodeAgent task: infotagr,   T)r.   cross_origin_iframes)r.   r0   r2   r3   r4   r5   zTask: contentz(Extracted URL from task, navigating to: navigate   zawait navigate('z')ry   zNavigated to z=Failed to capture browser state for initial navigation cell: z$Failed to navigate to extracted URL : z%Failed to get initial browser state: z






Step r   /zStarting step stepuT   

⚠️ CRITICAL WARNING: You are approaching execution limits!
- Steps remaining: z
- Consecutive errors: ae  

YOU MUST call done() in your NEXT response, even if the task is incomplete:
- Set success=False if you couldn't complete the task
- Return EVERYTHING you found so far (partial data is better than nothing)
- Include any variables you've stored (products, all_data, etc.)
- Explain what worked and what didn't

Without done(), the user will receive NOTHING.u.   🔍 Fetching browser state before LLM call...z-Failed to get browser state before LLM call: )step_numberz%LLM call failed (consecutive errors: z), retrying: zLLM call failed: errorzTerminating: z consecutive LLM failures zBTask already marked as done, LLM provided explanation without code)model_output_codefull_llm_responseoutputr   screenshot_pathzLLM returned empty codez!Failed to get new browser state: _all_code_blockspython_zExecuting Python block zConsecutive errors: zB consecutive errors reached. The agent is unable to make progress.zTerminating after z% consecutive errors without progress.z[Terminated after z consecutive errors]zAuto-terminated: z$ consecutive errors without progressr   _task_result      z&Validating task completion with LLM...)validate_task_completion)r,   r   r-   z+Validator: Task not complete, continuing...uq   

⚠️ VALIDATOR FEEDBACK:
Your done() call was rejected. The task is NOT complete yet.

Validation reasoning:
z

You must continue working on the task. Analyze what is missing and complete it.
Do NOT call done() again until the task is truly finished.
_task_done_task_successzValidator: Task completezReached max validations (z,) - skipping validation and accepting done()z*At step/error limits - skipping validationu/   ✓ Task completed - Final output from done():
i,  _task_attachmentszFiles displayed: , zCode output:
zTask completed successfullyzFinal result: zFinal Result: zTask completedsuccess)current_stepzError in step zMaximum steps (z!) reached without task completionz&) reached without completing the task.z&Task incomplete - reached step limit (z steps).zLast step output:z	
Output: z
Error: rA   >   recsvr   jsonasyncioro   z  - z with z itemsz6
Variables in namespace that may contain partial data:
z)
Partial result captured from last step:
zPartial result:
z=
============================================================zTASK COMPLETED SUCCESSFULLYz<============================================================z
Final Output:
z
Files Attached:

   z=============================================================
   )r6   agent_run_errorzFailed to log telemetry event: )exc_info)ar6   r.   r]   r   startr`   r^   r;   r\   getattrrR   warning_demo_mode_logr,   r   re   r   r0   r2   r3   r4   r5   rb   rc   appendr   r   r   r   sleepra   add_cellr(   SUCCESSstatusincrement_execution_countexecution_countr   _get_browser_statebrowser_staterW   rS   ERRORstrr   rf   rg   rangero   rp   r   rk   r7   rh   _get_code_from_llmstrip_is_task_done_add_step_to_complete_history_capture_screenshotgetsortedrU   
startswithlen	enumerate_execute_coderi   r8   r   r-   popjoin_add_sample_output_cell_format_execution_resultr    	traceback	print_excrd   resultextracted_content
isinstancerT   dicttyperZ   extendis_doner   chrclosers   get_usage_summaryrl   log_usage_summary_log_agent_event_complete_history_usage_summary)3r{   r6   steps_to_runr   should_delay_closeinitial_urlnav_codecellbrowser_state_textrA   state_errorr}   
screenshotr   steps_remainingerrors_remainingshould_warnwarning_messagecoder   	llm_error
all_blockskpython_blocksr   r   i	block_key
block_codeblock_outputblock_errorfinal_resultshould_validater   is_complete	reasoningvalidation_feedbackattachmentsr   result_messagetruncated_result	last_steplast_resultlast_output
last_errorpartial_result_parts	data_varsvar_name	var_valuepartial_resultlog_es3                                                      rL   runzCodeAgent.run   s     (3,$.	!

(
(
44
4(9W9WX4				#	#	%%%	!$"6"6"F"F"P"PQ4
'$*>*>*N*NPZ\a"b
NNqr



 8DfuV\o
^^^  ''$ $''	//11%%$. K&0DEF !%/ &dii0+
KK:;-HI
$$..
$[
111
--
 "+b1H<<   1D!))DK<<AACD!+/DK b$($;$;$==!-d 
d..@+/+B+B+D%D"
$6D!&D
 DNN# Ud	;;$TAXJa/?@A			~dQhZq8HI6TZ\`cd\dSe	fff $,,002<<>4 ^^d*Q.?''$*B*BB q @1@1>!9!9Q!>  *Q./ 0"667q9J9J8K L67  	k/BCn
((T-A-AdFVFVJllCD-1-D-D-F'F$*&8d#(d%)%<%<PQ%<%RRT* 4::<2%kkVW..*!55dQh?? /    ^^-.	" 	!1!1?.2.E.E.G(G%:'9t$)t  ##$6;J &z'8 9U1Q\\)=TQUMU
=AVU"=1 Ikk+AE7!C4F3GHIi(j+/+=+=j+I%I"lK 
2-v	u #0066VUA 	"^^*4+C+C*DAdFWFWEXYZ 	  D$5$55ll	t(())kl 	D--..STq   ..-d.?.?-@@TU !2!2 33WX /     !"T  $ 2 2> B\ ~~,q0_
t333 '
Q
'

"
"Q
&  	
!kk:;5%=II88&  k9 ~~CD""+ -E	F  ',t~~l#~~.$/~~/40   5H!IJ {{-.
 
		4#7#7	7{{
#D$8$8#99ef	 {{?@	vkk	9#f+X[J[&#,ag9hi '+nn&8&89L&Mk	{{&tyy'=&>?@kkN6(+,
 !44TAX>>O 
,
,($ -     $ 2 2>6 J\[[./kkN<.12
""<0	8(89:v  
 

 224UY\]U]2^N/?k2BCDQU` 
>>ODNN#33TUV			dnn%%KL
FO
   
			$"7"7$$R(9(1(8(8!!!$d;2=..4;%0!!d: !GGWW_`a23*[M :;)J< 89 9$..--/0 bxs#8l(l)Y9tTl+	hZr$y/*B*B)C6#i.IYY_`ab  YZ	*II23> $2K!KK	;;<^<LMN



 1.1ABGeU[_
]]] 
	;;	;;,-	;;x"nn00@<
KK#L>23  .#'>>#5#56I#J;
KK%c"gll;&?%@AB	;;
&8


l6&678V_  
  D33	r	

 "44FFHH$ 	11333J4>>?S
 $(#8#8$,,  $ 2 2$,,	s & _> 2 > bllRS^R_`aab  
NN9+bLM!+b1H<<   1D!''DK<<AACDQDJJ &E  @
NN:1#>??@ gD (G  JnnDQCHIIJ
  S 	"^^-d.F.F-GqIZIZH[[hirhst )%tax   	  D$5$55ll]4#4#4"55NOP==%< @ )H  ?~~9!=>>? V &J 7< v ?"  

LL>$(2aS12	
^ ^"  I 4
 
 J	<<1%9D<IIJst  A*AI8,}0-B1AI8}3B?AI80~. }6~. ,}9-A0~. }? 1}<2}?  AI8AA	 ,AA-AA	 A/AI81AA82CAI8$AG(&(AA>AA;AA>%AB0=AB->AB0A AG(%AF&AG(2AF3AG(7AI8:AAG(=AFAFAF&AI8(7AG(AG6AG:A%AG(AG AG(6AG(AGB3AG(AG9AG(>AG?AG(AI8C
AG(AGF2AG(AGAG(!AG""BAG(=AG%>AG(AI8AAG(AAI8AH2DAI8!AI8&%AI8AI8CAI8AH5D)AI8=AH8>,AI8*AH;+AI8AH>!AI8$AI%&AI8AIAI8AI .AAI83AI86~. 9~. <}? ?	~+~& ~. &~++~. .	AA7BA@>@8AI8@>AAAAI8AAA	 A		AA5AAA0A*AI8A0AA5A5AI8A;AA>A>	AB*BAB%BAG(B%AB*B*AG(B-AB0B0	AFB9A%AFDAD!DAAFE AG(E$AI8E'AFE?AFF AFFAG(F	AI8FAFFAG(FAG(FAFF	AGF%AGF=AG(GAGG	AG(GAG(GAG(GAG(GAG(GAG(G"AG(G%AG(G(	AH/G12AH*H#AI8H*AH/H/AI8H5AI8H8AI8H;AI8H>AI8IAI8IAI8I	AI5IAI0I*AI8I0AI5I5AI8r   c           	        K   | j                   j                         }| j                  r| j                  rs| j                  rgt        | j                        g}|j                  t        t        d| j                   dd                   |j                  t        |             n%|j                  t        | j                               d| _        d| _        | j                  j                  |       d{   }|j                  | _        t        j                  d	|j                           | j#                  d	|j                    d
|rd|ind       d{    t%        | j                  dd      }|j                  r|j                  j&                  nd}t)        |j                   |||j*                        \  }}|rKt        j-                  d|        d| d}	| j                   j                  t        |	             dd| dfS |j                   }
t/        |j                         }d| j0                  vrt3               | j0                  d<   |j5                         D ]  \  }}|j7                  d      r|| j0                  |<   | j0                  d   j9                  |       t;        d| dt=        |       d       t        j?                  d| dt=        |       d        || j0                  d<   |jA                  d|j                         }tC        |j                         }| j                   j                  tE        |             ||
fS 7 Z7 w)z\Get Python code from the LLM.

		Returns:
			Tuple of (extracted_code, full_llm_response)
		)textzdata:image/png;base64,z	image/pngauto)url
media_typedetail)	image_urlr   NzLLM Response:
thoughtr   
max_tokens)
completioncompletion_tokensr  stop_reasonzToken limit issue detected: z?Your previous response hit a token limit or became repetitive: z^

Please write a SHORT plan (2 sentences) for what to do next, then execute ONE simple action.r   z[Token limit error: ]_code_block_varspythonu   → Code block variable:  (str, z chars)z	Injected z block into namespace (r   )#rc   copyrf   r9   rg   r   r   r   r   r   r-   ainvokeusagerj   rR   r   r  r   r   r  r   r  r   r   rb   setitemsr   addprintr   rS   r   r    r   )r{   r   messages_to_sendcontent_partsresponser  r  is_problematicissue_messagerecovery_promptfull_responsecode_blocks
block_typeblock_contentr   truncated_completions                   rL   r   zCodeAgent._get_code_from_llm  s:     '',,.	""
oo$// t<<=IM
 #D$9$9#:; K>? K0M0MNO $(4 4 88##$455( "$ 	++ 3 3456X(()*'FKT	   txxt4*:B..hnn66d":!!&##	#.- 	>>0@A Fm_ Uc c  [AB
$]O15
55 %%- $H$7$78+ t~~-(+4>>$%#.#4#4#6 ]j-



)!.DNN:NN%&**:6	%j\]9K8LG
TU
LL9ZL(?M@R?SSZ[\] (3$..#$
 
8#6#6	7$ 2(2E2EF,5IJK	}	G 6s-   C7M9M:A MMDM;CMMr  valuec                 P   h d}||v ryd| j                   v r'|| j                   j                  dt                     v ryt        |t        t
        f      rCt        |      dd }t        d| dt        |      j                   dt        |       d| d		       yt        |t              r0t        |      d
kD  r"t        d| dt        |       d|dd
  d	       yt        |      rt        d| d       yt        d| dt        |      j                   dt        |      dd
  d       y)z/Print compact info about a variable assignment.>   nppdr   r   pltr   r   r   r/   ro   requests	PdfReaderr3   BeautifulSoupNr  d   u   → Variable: z (z, len=z
, preview=z...)2   r  z chars, preview=z (function)z, value=))rb   r   r  r   rT   r   r   r  r   rZ   r   callablerepr)r{   r  r(  
skip_namespreviews        rL   _print_variable_infozCodeAgent._print_variable_info  s%   *  	 4>>)h$..:L:LM_adaf:g.g	 d|$Z7>(2d5k&:&:%;6#e*ZX_W``d	ef%#e*r/>(73u:,6FuSbzlRV	WX>(;	/0>(2d5k&:&:%;8DKPSQSDTCUUV	WX    r   c                 <  .K   | j                   j                  |      }t        j                  |_        | j                   j                         |_        d}d}d}	 ddl.ddl}ddl	}|j                  }|j                         |_
        	 d| j                  vrt        | j                  d<   || j                  d<   | j                  | j                  d<   	 .j                  |d      }	t!        .fd	.j#                  |	      D              }
|
r	 t'               }t'               }.j#                  	      D ]d  }t)        |.j*                        rD|j,                  D ]4  }t)        |.j.                        s|j1                  |j2                         6 ^t)        |.j4                        rFt)        |j6                  .j.                        r&|j1                  |j6                  j2                         t)        |.j8                  .j:                  f      rVt=        |d      st)        |j6                  .j.                        s|j1                  |j6                  j2                         2t)        |.j>                        sJ|jA                  |jB                         g |D ]   }|| j                  vsd| j                  |<   " ||z  D ch c]  }|| j                  v s| }}d}d
}|r"djG                  tI        |            }d| d}d}djG                  d |jK                  d      D              }d| | d}|| j                  d<   tM        |dd      }tO        || j                  | j                         | j                  jQ                  d      }|r| d{   }|r9|jS                         D ]&  \  }}|jU                  d      r|| j                  |<   ( | j                  jW                  dd       | j                  jW                  dd       nyt'        | j                  jY                               }tM        |dd      }tO        || j                  | j                         t'        | j                  jY                               }||z
  }|j                  j[                         }|r|}||_
        t        j\                  d       d{    t        j^                  |_        ||_0        d|_1        ||dfS # t$        $ r d
}
Y w xY wc c}w # tD        $ r}t'               }Y d}~Bd}~ww xY w7 # ||_
        w xY w7 s# tD        $ r}t)        |td              rgtg        |      }t        jh                  |_        ||_5        tl        jk                  d|        t        j\                  d       d{  7   ||dfcY d}~S t)        |tn              rOtg        |      } t        jh                  |_        ||_5        t        j\                  d       d{  7   ||dfcY d}~S t)        |t$              r|jp                  r|jp                  n
tg        |      } ts        |      jt                   d|  }d| jw                         v r|d| jw                         v rj|rhty        t{        j|                  d|            }!ty        t{        j|                  d |            }"ty        t{        j|                  d!|            }#|!r	|"s|#r|d"z  }d| jw                         v rd| jw                         v rd#| jw                         v }$| jw                         }%d$|%v r	d%|%v rd&}&d'}'n,d$|%v rd(}&d$}'n#d%|%v r	d)|%v rd*}&d+}'nd%|%v rd,}&d-}'nd)|%v rd.}&d)}'nd}&d}'|$r|&rd/|& d0|& d1|' d2}(nd3}(|(d4z  }(n|&rd/|& d5|& d6|' d7}(nd8}(|d|( z  }|j~                  r|d|j~                   z  }n|j                  r|r|jK                  d      })d|j                  cxk  rt        |)      k  rn n|d|)|j                  dz
      z  }ntg        |      }*|*rts        |      jt                   d|* nts        |      jt                   d9}t=        |d:      rQ|j                  }+d},|+A|+j                  }-|-j                  j                  dk(  r|+j                  },n|+j                  }+|+At        jh                  |_        ||_5        tl        jk                  d|        t        j\                  d       d{  7   Y d}~'d}~ww xY ww);z
		Execute Python code in the namespace.

		Args:
			code: The Python code to execute

		Returns:
			Tuple of (output, error, browser_state)
		r   Nr   r   _current_cell_coderh   exec)modec              3   x   K   | ]1  }t        |j                  j                  j                  f       3 y wrG   )r   Await	AsyncWithAsyncFor)rI   nodeasts     rL   rM   z*CodeAgent._execute_code.<locals>.<genexpr>R  s,     kTXZsyy#--&NOks   7:Ftargetr   r   z    global r   Tc              3   J   K   | ]  }|j                         rd |z   n|  yw)z    N)r   )rI   lines     rL   rM   z*CodeAgent._execute_code.<locals>.<genexpr>  s!     d4

v}$Fds   !#zasync def __code_exec__():
zn
    # Return locals so we can update the namespace
    return locals()

__code_exec_coro__ = __code_exec__()
_has_global_declz<code>__code_exec_coro__rA   __code_exec__g      ?zCode execution error: r   r   unterminatedstringz\bf["\']z<json\.dumps|"[^"]*\{[^"]*\}[^"]*"|\'[^\']*\{[^\']*\}[^\']*\'zevaluate\(|await evaluateu   

💡 TIP: Detected f-string with JSON/JavaScript code containing {}.
   Use separate ```js or ```markdown blocks instead of f-strings to avoid escaping issues.
   If your code block needs ``` inside it, wrap with 4+ backticks: ````markdown code`
ztriple-quotedzf-stringrawzrf or frzraw f-stringfbyteszrb or brz	raw bytesrz
raw stringbzHint: Unterminated z'''...''' or z
"""..."" (z?). Check for missing closing quotes or unescaped quotes inside.zoHint: Unterminated '''...''' or """..."" detected. Check for missing closing quotes or unescaped quotes inside.zl
      If you need ``` inside your string, use a ````markdown varname` code block with 4+ backticks instead.z	'...' or z"..." (z>). Check for missing closing quote or unescaped quotes inside.zrHint: Unterminated '...' or "..." detected. Check for missing closing quote or unescaped quotes inside the string.z	 occurred__traceback__)Hra   r   r(   RUNNINGr   r   r   rB  iosysstdoutStringIOrb   r   rh   parseanywalkSyntaxErrorr  r   AssigntargetsNamer  rn   	AugAssignrC  	AnnAssign	NamedExprhasattrGlobalr>   namesrW   r   r   splitcompiler;  r   r  r   r   rU   getvaluer   r   r   r   r   r   r   r   rR   	NameErrormsgr   rZ   lowerr`   r   searchr  linenor   rP  tb_framef_codeco_filename	tb_linenotb_next)/r{   r   r   r   r   r   rR  rS  
old_stdouttree	has_awaitassigned_namesuser_global_namesrA  rC  nameexisting_varsr}   global_declhas_global_declvars_strindented_codewrapped_codecompiled_codecororesult_localskeyr(  vars_before
vars_afternew_varsoutput_value	error_msghas_fstringhas_json_patternhas_js_pattern	is_triple	msg_lowerprefixdeschintlines	error_strtbuser_code_linenoframerB  s/                                                 @rL   r   zCodeAgent._execute_code(  si     
		d		+$''$+??A$&
%-~

:3:t&!(T^^I ,0DNN'(,0,D,DDNN()IIdI(Tk\_\d\dei\jkkY
 un%((4. -$
T3::
&ll 	(Fvsxx(


VYY
'	( tS]]+
4;;0Q4;;>>*tcmmS]];<4"z$++sxx'H			DKKNN	+tSZZ(  ,-  $ $$
dnn
$#t$ *8:K)KgPTX\XfXfPftgmg
 [_6-01h!(2.koYYdSWS]S]^bScdd]m_ \ +:T^^&' \8V<]	-8 NN34T jm 
&,,. %:3~~c"$	% nn-t4
nn$/ t~~**,-[T8V4]	-8 dnn))+,Z[(X ::&&(LV CJ 
s	
 !((4;4;4v 
	U  YN h em: !@ CJ  
 uM"FE!''DKDJ
LL)%12
--
 5$ IAI!''DKDJ --
5$ K CFIAw 9+.E **x9??;L/LQU		+t45[RYY'fhlmn299%A4HI^)^ae **x9??;L/L IOO$55Y"Y 	iEY$6fd
	
!fd
9
I!5fd
9
fd
Y
fdfd 		#F8=PTv  VU  Vt Et
}}d	#F8;vhgdV  LJ  Kt Et
4&kU 	vv
166(mU	
dZZU	AHH"E
"E!((Q,'())e AI2;tAw 9+.DGDTDTCUU^A_E q/"
//R>kke		!	!X	- ,,::b > !&&4;4:	<<(01	q	kusA  Ad-T; 	A	T- 6S2 	T- A$T	 2B(T	  T	 ==T	 <1T	 .T	 TTT	  B6T- T*-T- C!T- &T; T9'T; -d2T=T-  TT- T	 		T'
T"T- "T''T- -	T66T; ;
dA'd,V/-	d6d7d<AdX	dddJ d<Add	ddddc                 x  K   | j                   r| j                  sy	 d}| j                   j                  |       d{   }t        || j                  | j                          d{   }|r|j
                  nd}||fS 7 B7 # t        $ r)}t        j                  d|        d| dfcY d}~S d}~ww xY ww)zGet the current browser state as text with ultra-minimal DOM structure for code agents.

		Returns:
			Tuple of (browser_state_text, screenshot_base64)
		)zBrowser state not availableNTinclude_screenshotN)staterb   r.   zFailed to get browser state: zError getting browser state: )	r.   re   get_browser_state_summaryr   rb   r   rW   rR   r   )r{   r  r  r   r   r}   s         rL   r   zCodeAgent._get_browser_state?  s      
		T%5%5
-4%%??Se?ff5 ;
4>>4;O;O  %7  D:
j
(( g 
 4	<</s34)!
-t
334sV   B:!B B)B (B)B  B:B B 	B7B2,B7-B:2B77B:r   r   r   c                    g }|Td| d| j                    d}|r.| j                  dkD  r|d| j                   d| j                   z  }|j                  |       |r|j                  d|        |r*t	        |      dkD  r|dd	 d
z   }|j                  d|        t	        |      dk(  r|j                  d       dj                  |      S )z@Format the execution result for the LLM (without browser state).NStep r   z	 executedr   z | Consecutive failures: Error: i'  i&  z#
[Truncated after 10000 characters]zOutput: Executedr   )r6   rh   r7   r   r   r   )r{   r   r   r   r   r   progress_headers          rL   r   z"CodeAgent._format_execution_resultY  s    & \N!DNN+;9E?((1,243K3K2LAdN_N_M`aaO	==!
	==75'"#	&kEET]CCF	==8F8$%[A	==	6	r8  c                 :    | j                   j                  dd      S )z5Check if the task is marked as done in the namespace.r   F)rb   r   r{   s    rL   r   zCodeAgent._is_task_doneq  s     
		L%	00r8  c                 r  K   | j                   sy	 | j                   j                  d       d{   }|rJ|j                  r=| j                  j	                  |j                  |       d{   }|rt        |      S dS yy7 Q7 # t        $ r%}t        j                  d| d|        Y d}~yd}~ww xY ww)z/Capture and store screenshot for eval tracking.NTr  z&Failed to capture screenshot for step r   )	r.   r  r   rr   store_screenshotr   rW   rR   r   )r{   r   r  r   r}   s        rL   r   zCodeAgent._capture_screenshotv  s     			
	%%??SW?XX5   33DDUEUEUWbccO#23<< !e Y d	 	>>:;-r!MN
s\   B7B B;B ,B-B =B7>B ?B7B B 	B4B/*B7/B44B7r   r   r   c                   K   d}d}| j                   r	 | j                   j                          d{   }| j                   j                          d{   }|j                  j                  j
                  j                  ddd|j                         d{   }	|	j                  di       j                  d      }| j                         }d}|r/| j                  j                  d	      }t        |t              r|nd}t!        |r|nd|r|nd||
      }t#        |||      }t$        j$                  j'                         j)                         }t+        | j,                  r| j,                  j.                  nd| j,                  r| j,                  j0                  nd| j2                  |      }d}|s|rt5        |r|nd|r|nd      }t7        ||g|||      }| j8                  j;                  |       | j=                  |       d{    y7 7 7 ~# t        $ r#}
t        j                  d|
        Y d}
~
d}
~
ww xY w7 =w)z6Add a step to complete_history using type-safe models.Nzdocument.titleT)
expressionreturnByValue)params
session_idr   r(  z-Failed to get browser URL/title for history: r   )r   r   r   r   )r	  titler   )input_tokensoutput_tokensstep_start_timestep_end_timer   )model_outputr#  )r  r   r  metadatar   )r.   get_current_page_urlget_or_create_cdp_session
cdp_clientsendRuntimeevaluater  r   rW   rR   rS   r   rb   r   r`   r%   r&   ro   rp   r   r'   rj   prompt_tokensr  rk   r$   r"   rd   r   _demo_mode_log_step)r{   r   r   r   r   r   r	  r  cdp_sessionr   r}   r   self_reported_successtask_successresult_entrystate_entryr  metadata_entrymodel_output_entryhistory_entrys                       rL   r   z'CodeAgent._add_step_to_complete_history  s4     #%	
F$$99;
;C,,FFHHK))..66??+dC&& @  F JJx$((1E
  ' (,..$$_5<+5lD+I<t !%V4T 	, 3e_U+ ##'')335-(6:6J6J$$22PT;?;O;O%%77UY((	. 59+,&7"R'8#b #".	"- }-  ///u <H
  F
LL@DEEFd 0sp   IH H!H HAH H%H ?EII	IH H H 	I#I;IIImessagelevelr  c                    K   | j                   r|r| j                  sy 	 | j                  j                  |||xs i        d {    y 7 # t        $ r"}t        j                  d|        Y d }~y d }~ww xY ww)N)r  r  r  z[DemoMode] Failed to send log: )r\   r.   send_demo_mode_logrW   rR   rS   )r{   r  r  r  excs        rL   r   zCodeAgent._demo_mode_log  sy     

!
!g$2F2F	9				0	0
^ 
1 
  
 
 9	<<1#7889s@   A:%A A
A 	A:
A 	A7A2-A:2A77A:r  c                   K   | j                   sy t        | j                        }|j                  r|j                  d   nd }|sy |j                  rdn|j
                  rdnd}d| dg}|j                  r|j                  d|j                          |j                  r|j                  |j                         n/|j
                  r|j                  d       n|j                  d	       | j                  d
j                  |      j                         |||j                  r|j                  j                  nd d       d {    y 7 w)Nr   r   r   r   r  :r  zMarked done.z	Executed. )r   r	  )r\   r   rd   r   r   r   r   r   r   r   r   r  r	  )r{   r  r   r   r  message_partss         rL   r  zCodeAgent._demo_mode_log_step  s    		 	 	D))*+&3&:&:="&		\\'FNNy%;-q)*-\\'&,,01001~~'$88M  "=;N;N 3 3 7 7TXY	  s   EEE	Er   c                    | j                   s|y d }dt        dt        d z  fd}d }t        |t              r	 t	        j
                  |      }nt        |t        t        f      r|}|E ||      }t        |t        t        f      r	 t	        j                  |dd      }n|t        |      }|sy | j                  j                  d      }t        j                  |_        t         j"                  |_        d |_        t)        j*                  |      }d	| d
|_        d| _         y # t        $ r |j                         }Y w xY w# t        $ r t        |      }Y w xY w)Ndatar   c                     t        | t              r| r| d   S t        | t              r| rt        t	        |             }|| |   iS t        | t
        t        t        t        f      r| S d S )Nr   )	r   rT   r   nextiterr   intfloatr`   )r  	first_keys     rL   _extract_samplez:CodeAgent._add_sample_output_cell.<locals>._extract_sample  s]    t7NtT$Z ItI''TCeT#:;$EEr8  r   F)indentensure_asciiz# Sample output previewr   z<pre>z</pre>T)rm   r   r   r   r   loadsrW   r   rT   r   dumpsra   r   r!   MARKDOWN	cell_typer(   r   r   r   htmlescaper   )r{   r   sample_contentr  r  samplesample_cellescapeds           rL   r   z!CodeAgent._add_sample_output_cell  sR   	,"6	#.FC FC$J F $c"*::l#D ,t-
4	D!6$&"jjF^ 	[N		%%-F%G+"+++&..+ $+KK''wiv.+"$3  *!'')N*  "&k^"s#   D% E %E EEEr   c                 >   ddl m} | j                  j                  | j                  j
                        }g }| j                  D ]`  }|j                  rA|j                  j                  r+|j                  j                  }|j                  d|ig       P|j                  d       b | j                  j                  d      }t        |t              r|nd}	g }
| j                  D ]W  }|j                  j                  s|j                  j                  |
vs3|
j                  |j                  j                         Y g }| j                  D ];  }|j                   D ]*  }|j"                  s|j                  |j"                         , = | j%                         }| j                  j                  d      }t        |t&              r|n|rdnd}| j(                  j+                  t-        d!i d| j.                  d	| j                  j
                  d
| j                  j0                  d|ddd| j2                  d| j4                  d| j6                  d| j8                  r<| j8                  j:                  r& || j8                  j:                        j<                  ndddd|d|d|
dt?        | j                        d|j@                  d|jB                  d|jD                  d|jF                  dtI        d | j                  D              d|d|	d |       y)"z/Send the agent event for this run to telemetry.r   )urlparsellm_responseNr   r   Fr,   modelmodel_providerr6   max_actions_per_stepr   r9   ru   ry   cdp_url
agent_typer   action_errorsaction_historyurls_visitedstepstotal_input_tokenstotal_output_tokensprompt_cached_tokenstotal_tokenstotal_duration_secondsc              3   b   K   | ]'  }|j                   s|j                   j                   ) y wrG   )r  duration_seconds)rI   r   s     rL   rM   z-CodeAgent._log_agent_event.<locals>.<genexpr>^  s#     q$cgcpcpt}}==qs   //r   final_result_responseerror_messagerQ   )%urllib.parser  rs   get_usage_tokens_for_modelr-   r  rd   r  r#  r   rb   r   r   r   r  r	  r   r   r   r`   rz   capturer   r,   providerr9   ru   ry   r.   r  hostnamer   r  r  r  r  sum)r{   r6   r   r  token_summaryaction_history_datar   r   r   final_result_strr  errorsr   r   r  r  s                   rL   r   zCodeAgent._log_agent_event   s   #))DDTXX^^T- <>## %d
D--;;**D 678t$% nn((8,1;L#1NTX ,## (d
jjnn|;

'(
 &## !d !v||]]6<< !!  'nn((9,7A,PT7U|el\arv.. 	
((.. 88$$ 	
   LL ;;  4 4 < < T))112;;	   '   d##
$!" %22#$ &77%& ';;'( ++)* q$J_J_qq+, "-. +/0 "1r8  n_lastc                     | j                   D cg c]  }|j                   }}|t        |      |kD  r|| d S |S |S c c}w )z
		Get screenshot paths from complete_history for eval system.

		Args:
			n_last: Optional number of last screenshots to return

		Returns:
			List of screenshot file paths (or None for missing screenshots)
		N)rd   r   r   )r{   r  r   pathss       rL   screenshot_pathszCodeAgent.screenshot_pathse  sR     -1,A,A
BD4
B%
B Z&0%/;e;	, Cs   >c                 :     G d d      } || j                         S )zi
		Compatibility property for eval system.
		Returns a mock object with last_input_messages attribute.
		c                   "    e Zd Zdee   ddfdZy)5CodeAgent.message_manager.<locals>.MockMessageManagerllm_messagesr   Nc                     || _         y rG   )last_input_messages)r{   r   s     rL   r   z>CodeAgent.message_manager.<locals>.MockMessageManager.__init__~  s
    +Dr8  )rZ   
__module____qualname__rT   r   r   rQ   r8  rL   MockMessageManagerr  }  s    ,D$5 ,$ ,r8  r  )rc   )r{   r  s     rL   message_managerzCodeAgent.message_managerv  s    , ,
 
D..	//r8  c                 B    t        | j                  | j                        S )z
		Compatibility property for eval system.
		Returns a CodeAgentHistoryList object with history attribute containing complete_history.
		This is what the eval system expects when it does: agent_history = agent.history
		)r#   rd   rl   r  s    rL   historyzCodeAgent.history  s     
d33T5G5G	HHr8  c                    K   | j                   rY| j                   j                  j                  s#| j                   j                          d{    yt        j                  d       yy7 w)zClose the browser session.Nz7Browser keep_alive is True, not closing browser session)r.   r^   
keep_alivekillrR   rS   r  s    rL   r   zCodeAgent.close  sS     	



.
.
9
9



#
#
%%%
LLJK  &s   A
A+A)A+c                    K   | S w)zAsync context manager entry.rQ   r  s    rL   
__aenter__zCodeAgent.__aenter__  s     	+s   exc_typeexc_valexc_tbc                 @   K   | j                          d{    y7 w)zAsync context manager exit.N)r   )r{   r  r  r  s       rL   	__aexit__zCodeAgent.__aexit__  s     

s   )NNNNNNNNNr0     r   TFNrG   )r   N)r   N)r   r+   ))rZ   r  r  __doc__r   r
   r   r   r	   rT   r   r  r`   r   r)   r  tupler   r   r7  r   r   r   r   r   r   r   r"   r  r   r   r  propertyr  r#   r  r   r  r   BaseExceptionr  rQ   r8  rL   r+   r+   6   s    #+/#'!.2#'+/;?'K&K& t	K&
 "D(K& D K& 
K& dlK& %t+K& D K& S	D(K& sC$sCx.001D8K& K& K&  !K&" #K&$ %K&& D['K&ZJd
 Jo JXjt juSRUX jX#Y# #Yc #Yd #YJUS UU3:sTz3QU:3U-V Un4uS#*_'= 44# sTz #PT* dgjndn z} 01D 1
# #*  H0H0 H0 *	H0
 
tH0 :H0 H0T
9 
9S 
9TRUWZRZ^^bMb 
9nr 
94D  .+#t +# +#ZCs CS4Z CSW CJC$J $sTz:J " 0c 0 0 I* I ILT-%84%? -Z^J^ hk pt r8  r+   )Fr  r   ro   r  r   loggingr   r   pathlibr   typingr   uuid_extensionsr   browser_use.browserr   browser_use.browser.profiler   browser_use.dom.servicer   "browser_use.filesystem.file_systemr	   browser_use.llm.baser
   browser_use.llm.messagesr   r   r   r   r   r   browser_use.screenshots.servicer   browser_use.telemetry.servicer   browser_use.telemetry.viewsr   browser_use.tokens.servicer   browser_use.tokens.viewsr   browser_use.tools.servicer   r   browser_use.utilsr   
formattingr   rb   r   r   utilsr   r   r   r    viewsr!   r"   r#   r$   r%   r&   r'   r(   r)   	getLoggerrZ   rR   r+   rQ   r8  rL   <module>r-     s    [      	    $ . 6 . 9 .  > : ; 0 1 ; 5 4 6 q q
 
 
 
		8	$f fr8  