
    *"hj                        d Z ddlm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  ej                  e      Z G d d      Zy)a-  
OpenClaw subprocess wrapper for the agent engine under ``evolve_server``.

Manages the lifecycle of an OpenClaw agent instance:
- Configures ``openclaw.json`` (model provider, workspace, sandbox)
- Controls ``OPENCLAW_HOME`` isolation (fresh vs. persistent)
- Runs ``openclaw agent`` as a subprocess
    )annotationsN)Path)Anyc                      e Zd ZdZ	 	 dddddddd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd	Zedd
       Zedd       ZddZddZ	ddZ
	 d	 	 	 	 	 	 	 ddZy)OpenClawRunnerz+Manage OpenClaw agent subprocess execution. TiX  zhttps://api.openai.com/v1zgpt-5.4zopenai-completions)freshtimeoutllm_api_keyllm_base_url	llm_modelllm_api_typec                   || _         |rt        |      nt        j                         dz  | _        || _        || _        || _        || _        || _        || _	        y )Nz.openclaw_home)
openclaw_binr   cwdopenclaw_homer	   r
   r   r   r   r   )	selfr   r   r	   r
   r   r   r   r   s	            @/root/.hermes/SkillClaw/evolve_server/engines/openclaw_runner.py__init__zOpenClawRunner.__init__   sV     )4AT-0txxzTdGd
&("(    c                     | j                   dz  S )Nz	.openclaw)r   r   s    r   _openclaw_dirzOpenClawRunner._openclaw_dir0   s    !!K//r   c                     | j                   dz  S )Nzopenclaw.json)r   r   s    r   _config_pathzOpenClawRunner._config_path4   s    !!O33r   c                F   | j                   r[| j                  j                         r!t        j                  | j                  d       t
        j                  d| j                         | j                  j                  dd       | j                  j                  dd       y)zDPrepare OPENCLAW_HOME: wipe if fresh, otherwise keep existing state.T)ignore_errorsz%[OpenClawRunner] fresh mode: wiped %sparentsexist_okN)	r	   r   existsshutilrmtreeloggerinfomkdirr   r   s    r   _prepare_homezOpenClawRunner._prepare_home8   sv    ::!!((*d00EKK?ASAST   =   =r   c                $   i }| j                   j                         r0	 t        j                  | j                   j	                  d            }|j                  di        d|d   d<   d|d   d<   |d   j                  dd	       |j                  d
i       j                  di       }| j                  | j                  | j                  | j                  | j                  ddgddddddddgd|d<   |j                  di       }|j                  di       }d| j                   |j                  di       d<   d|j                  di       d<   t        |j                               |d<   | j                   j                  t        j                   |dd      dz   d       | j"                  dz  d z  d!z  }|j%                  d"d"#       |d$z  }|j'                         s|j                  d%d       y	y	# t        j
                  t        f$ r i }Y w xY w)&z:Write ``openclaw.json`` with model and workspace settings.zutf-8)encodinggatewaylocalmodeloopbackbindremoteNmodels	providersFtextr   )inputoutput	cacheRead
cacheWritei@ i @  )idname	reasoningr3   costcontextWindow	maxTokens)apibaseUrlapiKeyr0   z
evolve-llmagentsdefaultszevolve-llm/modelprimaryoffsandbox	workspace   )ensure_asciiindent
mainsessionsTr   zsessions.jsonz{}
)r   is_filejsonloads	read_textJSONDecodeErrorOSError
setdefaultpopr   r   r   r   strresolve
write_textdumpsr   r&   r!   )r   workspace_pathconfigr1   r@   rA   
agents_dirsessions_jsons           r   _write_configzOpenClawRunner._write_configB   s(   !#$$&D$5$5$?$?$?$QR 	)R($+y&!$.y&!yh-%%h3>>{BO	$$((&& .. NN!&$X&'11TUV%+!&
	#
	," ""8R0$$Z48CDNNCS6TGR(35:Ir*62 #N$:$:$< =$$JJvE!<tC 	% 	
 ''(2V;jH
5"_4##%$$Vg$> &S (('2 s   /G0 0HHc                    t        t        j                        }t        | j                        |d<   t        | j                        |d<   t        | j
                        |d<   d|d<   d|d<   |S )z.Build the environment dict for the subprocess.HOMEOPENCLAW_HOMEOPENCLAW_CONFIG_PATH1HF_HUB_OFFLINETRANSFORMERS_OFFLINE)dictosenvironrU   r   r   )r   envs     r   
_build_envzOpenClawRunner._build_envt   sj    2::$,,-F"4#5#56O&)$*;*;&<"# #&)"#
r   Nc                z   |$dt        j                         j                  dd  }| j                          | j	                  |       | j
                  dd|ddd|d	d
dt        | j                        g}| j                         }t        j                  ddj                  |dd dgz         | j                  | j                  |       	 t        j                  |t        |      |ddd| j                  dz         }|j&                  dk7  r4t        j)                  d|j&                  |j*                  xs ddd        |S t        j                  d       |S # t        j                  $ rT}t        j!                  d| j                         t        j"                  |d|j$                  xs dd|       cY d}~S d}~ww xY w)aQ  Run an OpenClaw agent with the given message.

        Parameters
        ----------
        workspace_path:
            Path to the prepared workspace directory.
        message:
            The instruction message for the agent.
        session_id:
            Optional session ID. If ``None``, a UUID is generated.
            When ``fresh=False``, reusing the same session_id across
            rounds lets the agent continue from previous context.

        Returns
        -------
        subprocess.CompletedProcess
            The completed process with stdout/stderr captured.
        Nzevolve-   agentz--session-idz--agentrK   z	--messagez--jsonz--localz	--timeoutz@[OpenClawRunner] running: %s (fresh=%s, timeout=%ds, session=%s)    z...TF   )r   rh   capture_outputr2   checkr
   z*[OpenClawRunner] agent timed out after %dsr   zTimeoutExpired: )args
returncodestdoutstderrr   z5[OpenClawRunner] agent exited with code %d
stderr: %si  z-[OpenClawRunner] agent completed successfully)uuiduuid4hexr'   r]   r   rU   r
   ri   r$   r%   joinr	   
subprocessrunTimeoutExpirederrorCompletedProcessru   rt   warningrv   )r   rY   message
session_idcmdrh   resultexcs           r   r|   zOpenClawRunner.run~   s   0 "4::<#3#3CR#8"9:J>* 
 ooNHHS!Ww&'JJLL	
	^^'#r)F$ !NNH!!$"ds+  KKGH% (( 	LLEt||T..zz'R)#/	 	s   2E F:&A	F5/F:5F:)openclawr   )r   rU   r   z
str | Pathr	   boolr
   intr   rU   r   rU   r   rU   r   rU   returnNone)r   r   )r   r   )rY   r   r   r   )r   zdict[str, str])N)rY   r   r   rU   r   z
str | Noner   z subprocess.CompletedProcess[str])__name__
__module____qualname____doc__r   propertyr   r   r'   r]   ri   r|    r   r   r   r      s    5 '$&)
 7"0)) ")
 ) ) ) ) ) ) 
)* 0 0 4 4>0?d "&	SS S 	S
 
*Sr   r   )r   
__future__r   rN   loggingrf   r"   r{   rw   pathlibr   typingr   	getLoggerr   r$   r   r   r   r   <module>r      sE    #   	     			8	$y yr   