
    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 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  ej(                  d
ej*                        Ze G d d             Z G d de      Zy)z&Executor for Python code runner nodes.    N)	dataclass)Path)List)Node)PythonRunnerConfig)MessageMessageRole)NodeExecutorz2```(?P<lang>[a-zA-Z0-9_+-]*)?\s*\n(?P<code>.*?)```c                   P    e Zd ZU eed<   eed<   eed<   edz  ed<   dZedz  ed<   y)_ExecutionResultsuccessstdoutstderrN	exit_codeerror)__name__
__module____qualname__bool__annotations__strintr        R/Users/bowang/.openclaw/workspace/ChatDev/runtime/node/executor/python_executor.pyr   r      s)    MKKTzE3:r   r   c                       e Zd ZdZdZdZdedee   dee   fdZ	de
fdZd	ed
z  defdZdede
dede
fdZdede
de
dedef
dZd
d
d
ddede
deded
z  ded
z  de
d
z  defdZy
)PythonNodeExecutorz.Execute inline Python code passed to the node.python_workspace_rootpython_node_run_countersnodeinputsreturnc                 L   |j                   dk7  rt        d|j                   d      | j                         }|r|d   nd }| j	                  |      }|s| j                  ||d      gS | j                  |||      }|j                  t              }|st        d|j                   d      | j                  ||||      }t        |      t        |      d}	|j                  r|j                  rB| j                  j                  d	|j                   d
|j                  d|j                  i       | j                  t         j"                  |j$                  |j                  |	      gS |j&                  xs d}
| j                  |||
|j(                  |j                  |      gS )NpythonzNode z is not a python nodez No executable code segment found)
error_textz missing PythonRunnerConfig)	workspacescript_pathzPython node z stderrr   )node_iddetailsrolecontentsourcemetadatazScript execution failed)r&   r   r   r(   )	node_type
ValueErrorid_ensure_workspace_root_extract_code_build_failure_message_write_script_file	as_configr   _run_processr   r   r   log_managerdebug_build_messager	   	ASSISTANTr   r   r   )selfr    r!   r'   last_messagecode_payloadr(   configresultr/   r&   s              r   executezPythonNodeExecutor.execute#   s   >>X%uTWWI-BCDD//1	%+vbz)),7//= 0    --dI|L 23uTWWI-HIJJ""6;	4HY{+
 >>}}  &&"477)73TWWxY_YfYfNg '  '' **ww!	 (    \\>%>
++!&&==# , 
  	r   c                    | j                   j                  j                  | j                  d       }|| j                   j                  j	                  d      }|st        d      t        |      dz  j                         }|j                  dd       t        |      | j                   j                  | j                  <   |S t        |      j                         }|j                  dd       |S )Ngraph_directoryz.graph_directory missing from execution contextcode_workspaceT)parentsexist_ok)
contextglobal_state
setdefaultWORKSPACE_KEYgetRuntimeErrorr   resolvemkdirr   )r=   root	graph_dirs      r   r3   z)PythonNodeExecutor._ensure_workspace_rootQ   s    ||((33D4F4FM<11556GHI"#STTO&66??ADJJtdJ3<?IDLL%%d&8&89  :%%'DJJtdJ3r   messageNc                     |sy|j                         }|r|j                         syt        j                  |      }|r|j	                  d      n|}t        j                  |      j                         S )N code)text_contentstrip_CODE_BLOCK_REsearchgrouptextwrapdedent)r=   rR   rawmatchrU   s        r   r4   z PythonNodeExecutor._extract_code_   s^    ""$#))+%%c*&+u{{6"t$**,,r   r'   rU   c                    | j                   j                  j                  | j                  i       }t	        j
                  dd|j                        }|j                  |j                  d      dz   }|||j                  <   |dkD  rd| nd}| | d}||z  j                         }	|	j                  ||j                  d      sdndz   d	
       |	S )Nz[^0-9A-Za-z_\-]_r      z_run-rT   z.py
zutf-8)encoding)rH   rI   rJ   COUNTER_KEYresubr2   rL   rN   
write_textendswith)
r=   r    r'   rU   counterssafe_node_id	run_countsuffixfilenamepaths
             r   r6   z%PythonNodeExecutor._write_script_filei   s    <<,,778H8H"Mvv0#tww?LL!,q0	%(1A5$2"^F83/H$--/DMM$,?RHSZ[r   r@   r(   c           
         |j                   g}|j                  r|j                  |j                         |j                  t	        |             t
        j                  j                         }|j                  |j                  xs i        |j                  t	        |      t	        |      |j                  d       	 t        j                  |t	        |      dd|j                        }|j                   j#                  |j$                  d      }	|j(                  j#                  |j$                  d      }
t        |j*                  dk(  |	|
|j*                        S # t        j                  $ r[}t        dd|j                   r'|j                   j#                  |j$                  d      ndd d|j                   d	
      cY d }~S d }~wt&        $ r! t        dddd d|j                    d
      cY S w xY w)N)MAC_CODE_WORKSPACEMAC_CODE_SCRIPTMAC_NODE_IDTF)cwdcapture_outputchecktimeoutrT   replace)errorszScript did not finish within s)r   r   r   r   r   zInterpreter z
 not foundr   )r   r   r   r   )interpreterargsextendappendr   osenvironcopyupdateenvr2   
subprocessruntimeout_secondsTimeoutExpiredr   r   decoderc   FileNotFoundErrorr   
returncode)r=   r@   r(   r'   r    cmdr   	completedexcr   r   s              r   r8   zPythonNodeExecutor._run_processt   s    !!";;JJv{{#

3{#$jjoo

6::#$

&))n#&{#3#ww	
	"	N#..I. !!(((K!!(((K((A-**	
 	
% (( 	#ORzzszz(((K_a5f6L6L5MQO  ! 	#$V%7%7$8
C 	s%   >-E G52AGG5*G54G5)r   r   r(   r&   r   r   c                0   dt        |      i}|rt        |      |d<   |||d<   |r||d<   d|g}||j                  d|        |r|j                  d|        | j                  t        j                  dj                  |      |j                  |	      S )
Nr'   r(   r   r   z==CODE EXECUTION FAILED==z
exit_code=zstderr:
rb   r+   )r   r}   r;   r	   r<   joinr2   )	r=   r    r'   r&   r   r   r(   r/   content_liness	            r   r5   z)PythonNodeExecutor._build_failure_message   s     Y
 &)+&6H]# $-H[!!'HX4jA   :i[!9:  9VH!56""&&IIm,77	 # 
 	
r   )r   r   r   __doc__rK   rd   r   r   r   rB   r   r3   r   r4   r6   r   r   r8   r   r5   r   r   r   r   r      s   8+M,K,D ,$w- ,DM ,\ -Wt^ - -	t 	 	C 	D 	3
"3
 3
 	3

 3
 
3
v !%!#'

 

 
 :
 d

 D[
 

r   r   )r   r~   re   r   r[   dataclassesr   pathlibr   typingr   entity.configsr   !entity.configs.node.python_runnerr   entity.messagesr   r	   runtime.node.executor.baser
   compileDOTALLrX   r   r   r   r   r   <module>r      sl    , 	 	   !    @ 0 3 QSUS\S\]   k
 k
r   