
    *"hjK                    Z   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mZm	Z	 ddl
mZ ddlmZ ddl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mZ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,  ejZ                  e.      Z/ G d d      Z0 G d de*      Z1y)zG
Agent-driven evolve server implementation inside the unified package.
    )annotationsN)datetimetimezone)Path)Any)bundle_entrypoint_bytesbundle_file_recordsbundle_tree_sha256   )EvolveServerConfig)AsyncLLMClient)SkillIDRegistry)build_skill_md)_extract_session_metadatabuild_session_trajectorysummarize_sessions_parallel)delete_session_keysfetch_skill_bundlelist_object_keyslist_session_keyssave_manifestsave_version_bundle   )AgentWorkspace)load_agents_md)EvolveEngineMixin)OpenClawRunnerc                  J    e Zd ZdZ	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 ddZddZd	dZy)
_AnthropicMessagesLLMClientz:Minimal Anthropic Messages client for the summarizer path.c                J    || _         || _        || _        || _        || _        y )Napi_keybase_urlmodel
max_tokenstemperature)selfr"   r#   r$   r%   r&   s         6/root/.hermes/SkillClaw/evolve_server/engines/agent.py__init__z$_AnthropicMessagesLLMClient.__init__2   s(      
$&    c                    t        | j                  xs d      j                  d      }|j                  d      r|S |j                  d      r| dS | dS )Nhttps://api.anthropic.com/z	/messagesz/v1z/v1/messages)strr#   rstripendswith)r'   bases     r(   _messages_urlz)_AnthropicMessagesLLMClient._messages_url@   sX    4==?$?@GGL==%K==V9%%|$$r*   c           
       K   dd l }dd l}g }g }|D ]p  }t        |j                  d      xs d      }t        |j                  d      xs d      }	|dk(  r|	r|j	                  |	       X|dv s]|j	                  ||	d       r | j
                  |xs dddg|j                  d	| j                        |j                  d
| j                        d}
|rdj                  |      |
d<   |
j                  |       ddd}| j                  r| j                  |d<   d}|j                  dd      }|j                  |      4 d {   }t        |      D ]  }	 |j                  | j!                         |
|       d {   }|j#                          |j%                         }g }|j                  dg       xs g D ]^  }t'        |t(              s|j                  d      dk(  s)|j                  d      }t'        |t              sK|sN|j	                  |       ` dj                  |      c cd d d       d {    S  d d d       d {    y 7 7 7 # t*        $ rM ||dz
  k  rCt-        d|z  |j/                  dd      z   d      }t1        j2                  |       d {  7   Y X w xY w7 e# 1 d {  7  sw Y   y xY ww)Nr   role contentsystem>   user	assistant)r4   r6   r8   r%   r&   )r$   messagesr%   r&   z

zapplication/jsonz
2023-06-01)zcontent-typezanthropic-versionz	x-api-key   g     @g      >@)connect)timeout)jsonheaderstypetextr   r      )randomhttpxr.   getappendr$   popr%   r&   joinupdater"   TimeoutAsyncClientrangepostr2   raise_for_statusr>   
isinstancedict	Exceptionminuniformasynciosleep)r'   r:   kwargsrC   rD   system_partsbody_messagesmessager4   r6   request_bodyr?   max_retriesr=   clientattemptresppayloadpartsitemrA   waits                         r(   chatz _AnthropicMessagesLLMClient.chatH   s    "$.0 	IGw{{6*0b1D'++i06B7Gx ''0,,$$dw%GH	I ZZ%J6b*I)J **\4??C!::mT5E5EF	(
 %+[[%>L"F# /!-
 <<#'<<GK --t-4$$W$5 	 	 - !'**,) ' "- " D
 ))+"iikG')E 'Ir : @b 3%dD1dhhv6F&6P#'88F#3D)$4 %T 2	3
 775>)!	 	 		 	 		" ! q0"1g:q!0D#DbI%mmD111 #	 	 	 	s   A+K.CKIKJ2%I<I=AII"!II#I*J2,K8I9K>J2?K
J0KIKAJ-"J%
#J-(J2+J--J20K2K8J;9K KN)r5   r,   zgpt-5.4i g?)r"   r.   r#   r.   r$   r.   r%   intr&   floatreturnNonerf   r.   )r:   zlist[dict[str, str]]rV   r   rf   r.   )__name__
__module____qualname____doc__r)   r2   rc    r*   r(   r   r   /   s_    D 3  '' ' 	'
 ' ' 
'%:r*   r   c                  ~    e Zd ZdZddd	 	 	 	 	 	 	 ddZddZddZ	 d	 	 	 	 	 	 	 ddZdd	Zdd
Z	ddZ
ddZd Zy)AgentEvolveServera?  Agent-driven evolution server.

    Parameters
    ----------
    config:
        Server configuration (storage, LLM, scheduling, OpenClaw settings).
    mock:
        If ``True``, use a local directory instead of remote storage.
    mock_root:
        Custom root for mock mode (default: ``evolve_server/mock/``).
    FNmock	mock_rootc          
        || _         || _        |r5|3t        t        t              j                         j                  dz        n|}| j                  |||      | _        |j                   d| _
        t               | _        d| _        | j                  j                  | j                  | j                         t        |j                         | _        t%        |j&                  |j(                  |j*                  |j,                  |j.                  |j0                  |j2                  |j4                        | _        d|j                   | _        y )Nrq   rp   r-   F)openclaw_binopenclaw_homefreshr=   llm_api_keyllm_base_url	llm_modelllm_api_typezevolve-)config_mockr.   r   __file__resolveparent_build_bucket_bucketgroup_id_prefixr   _id_registry_runningload_from_ossr   workspace_root
_workspacer   rt   ru   rv   agent_timeoutrw   rx   ry   rz   _runner_agent_session_id)r'   r{   rq   rr   default_mocks        r(   r)   zAgentEvolveServer.__init__   s    
HLQZQbs4>113::VCDhq))&t|)T //*!,+-''dllC()>)>?%,, ..,,((**,,&&,,	
 $+6??*;!<r*   c                F  K   t        | j                  j                  xs d      j                         j	                         }|dv rt        | j                  j                  | j                  j                  | j                  j                  | j                  j                  | j                  j                        }t        ||       d{    y|dk(  rt        | j                  j                  | j                  j                  | j                  j                  | j                  j                  | j                  j                        }t        ||       d{    yt        j                  d|xs d       |D ]   }t        |       t!        |      |d<   d|d	<   " y7 7 Gw)
z?Attach compact trajectory/summary fields before workspace prep.r5   >   openai-responsesopenai-completionsr5   ollamar!   Nzanthropic-messageszk[AgentEvolveServer] summarizer does not support llm_api_type=%s; falling back to metadata + trajectory onlyz(empty)_trajectory_summary)r.   r{   rz   striplowerr   rw   rx   ry   llm_max_tokensllm_temperaturer   r   loggerwarningr   r   )r'   sessionsapi_typellmsessions        r(   _summarize_sessionsz%AgentEvolveServer._summarize_sessions   sY    t{{//526<<>DDFOO%//11kk++;;55 KK77C .c8<<<++-//11kk++;;55 KK77C .c8<<<9!		

   	%G%g.%=g%FGM""$GJ	%' = =s&   CF!	F
BF!FAF!F!c                    i }|j                         D ]/  \  }}t        | j                  | j                  ||      }|s+|||<   1 |S )z9Fetch full bundle content for all skills in the manifest.)itemsr   r   r   )r'   manifestskillsnamerecordbundles         r(   _fetch_all_skillsz#AgentEvolveServer._fetch_all_skills   sL    .0$NN, 	&LD&'dllD&QF%t	& r*   c                   |j                  dd      }|sy | j                  j                  |      }d|vr i |dt        |      j	                  d      i}t        |      }| j                   d| d}| j                  j                  ||       t               }t        |j                               D ]L  \  }	}
|	dk(  r| j                   d| d|	 }|j                  |       | j                  j                  ||
       N t        | j                  | j                   d| d      D ]"  }||vs| j                  j                  |       $ t        j                   |      j#                         }t%        |      }dd|t'        |      d	}| j                  j)                  ||||
      }t+        | j                  | j                  |||       | j-                         }i |j                  |i       |||||dd|d   dt/        j0                  t2        j4                        j7                         |j                  dd      |j                  dd      d||<   t9        | j                  | j                  |       t:        j=                  d||||       y )Nr   r5   zSKILL.mdutf-8zskills/z	/SKILL.mdz/files/	bundle_v1)format
entrypointtree_sha256files)actionbundle_recordr   evolve_serverdescriptioncategorygeneral)r   skill_idversionsha256r   r   r   r   uploaded_byuploaded_atr   r   z8[AgentEvolveServer] uploaded skill %s (id=%s, v%d) to %s)rE   r   get_or_creater   encoder   r   r   
put_objectsetsortedr   addr   delete_objecthashlibr   	hexdigestr
   r	   record_updater   _load_remote_skillsr   nowr   utc	isoformatr   r   info)r'   skillbundle_filesr   r   r   md_bytes
object_keykeep_bundle_keysrel_pathdatakeycontent_shatree_shar   r   r   s                    r(   _upload_skillzAgentEvolveServer._upload_skill   s{    yy$$$2248\)^l^Ju8M8T8TU\8]^L*<8~WTF)<

H5%(U$\%7%7%9: 	/NHd:%\\N'$wxjAC  %LL##C.	/ $DLLT\\N'$w2WX 	0C****3/	0 nnX.88:%l3!$#(6	
 ##11'	 2 
 	DLL$,,g|T++-
ll4$
 !#!$"7+*#<<5??A 99]B7		*i8
 	dllDLL(;F	
r*   c           	       K   t         j                  d       t        j                         }| j	                          d{   \  }}|st         j                  d       ddddS | j                  |       d{    t         j                  dt        |             | j                  j                  r| j                  j                          | j                  | j                         d{   }| j                  | j                  |       d{   }| j                         }| j                  j!                         }| j                  j#                  |||||       | j                  j%                         }| j                  j                  s| j&                  nd}	dt        |       d	t        |       d
}
t)        j*                  | j,                  j.                  t1        | j                  j2                        |
|	       d{   }| j                  j5                  |      }d}g }|D ]  }|d   }|d   }| j7                  |j9                  d|d               }||d<   	 | j                  | j:                  ||j9                  di       |       d{    |dz  }|j=                  ||| j                  j?                  |      | j                  jA                  |      dd        | j                  | j                  jF                  | jH                  | jJ                         d{    | j                  tL        | jH                  |       d{    | j                  jO                          t        j                         |z
  }tQ        jR                  tT        jV                        jY                         t[        |d      t        |      ||j\                  |d}| j_                  |       t         j                  dt        |      |||j\                         |S 7 7 7 37 7  7 # tB        $ r"}t         jE                  d||       Y d}~&d}~ww xY w7 37 w)a^  Run one full agent-driven evolution cycle.

        1. Drain session files from storage
        2. Prepare workspace (sessions + existing skills)
        3. Snapshot current skills state
        4. Run OpenClaw agent
        5. Collect skill changes from workspace
        6. Upload changed skills to storage
        7. Ack consumed sessions
        z4[AgentEvolveServer] === starting evolution cycle ===Nu6   [AgentEvolveServer] queue empty — nothing to processr   )r   skills_evolvedagent_returncodez,[AgentEvolveServer] summarized %d session(s))r   existing_skillsr   	agents_mdskill_registry_infozProcess the z session file(s) in the sessions/ directory. Follow the instructions in AGENTS.md to analyze them and evolve the skill library in skills/. There are currently z existing skill(s).)workspace_pathrY   
session_idr   r   r   r   r   agent)r   
skill_namer   r   sourcez3[AgentEvolveServer] failed to upload skill '%s': %s)	timestampelapsed_secondsr   r   r   
evolutionsz_[AgentEvolveServer] === cycle done: %d sessions, %d skills evolved in %.1fs (agent exit=%d) ===)0r   r   time	monotonic_drain_sessionsr   lenr{   rv   r   reset_call_storager   r   _load_agents_mdr   all_entriespreparesnapshot_skillsr   rT   	to_threadr   runr   r   collect_changes_sanitise_namerE   r   rF   r   get_versionrQ   errorsave_to_ossr   r   r   cleanup_sessionsr   r   r   r   r   round
returncode_append_history)r'   t0r   session_keysr   r   agents_md_textregistry_infobefore_snapshotr   rY   resultchangesr   evolution_recordschanger   r   r   eelapsedsummarys                         r(   run_oncezAgentEvolveServer.run_once2  s     	JK^^ (,';';'=!=,KKPQ"#$(  &&x000:M	
 ;;OO!!#++D,D,DEE $ 2 243I3I8 TT--/))557+$ - 	  	
 //99; 48;;3D3DT++$
3x=/ *# $'#7"88KM 	 ((LL : :;!	
 
 //11/B (* 	F7OEH%F&&uyy'HID E&M((&&JJ~r2	   !#!(("(&*$($5$5$C$CD$I#'#4#4#@#@#F")	>   ))LLLL
 	
 	

   !4dllLQQQ((*.."R'!hll3==?$Wa0H, & 1 1+
 	W%mM	
 y ">  	1 FT4
*   I 	

 	Rs   =QP 8Q8P9A1Q*P+#QP C4QP#AQ 1P)P&AP)$A Q$Q%(QQC
QQQ Q#Q&P))	Q2Q	QQQQc                    | j                   j                  }|rFt        j                  j	                  |      r't        |d      5 }|j                         cddd       S t               S # 1 sw Y   t               S xY w)z8Load AGENTS.md from custom path or the built-in default.r   )encodingN)r{   agents_md_pathospathisfileopenreadr   )r'   custom_pathfs      r(   r   z!AgentEvolveServer._load_agents_md  s_    kk00277>>+6kG4  vvx    s   A))A;c                  K   d| _         t        j                  d| j                  j                         | j                   rX	 | j                          d {    t        j                  | j                  j                         d {    | j                   rWy y 7 D# t        $ r"}t        j                  d|d       Y d }~hd }~ww xY w7 Cw)NTz/[AgentEvolveServer] periodic mode: interval=%dsz#[AgentEvolveServer] cycle error: %s)exc_info)
r   r   r   r{   interval_secondsr  rQ   r   rT   rU   )r'   r   s     r(   run_periodiczAgentEvolveServer.run_periodic  s     =KK((	
 mmVmmo%% -- < <=== mm% VBAPTUUV=sS   >CB BB ,CC	CCB 	C$C<CCCc                    d| _         y )NF)r   )r'   s    r(   stopzAgentEvolveServer.stop  s	    r*   c                     ddl m} ddlm  |d      }|j	                  d       fd       }|j                  d       fd	       }|j                  d
      d        }|S )zAReturn a FastAPI app with ``/trigger``, ``/status``, ``/health``.r   )FastAPI)JSONResponsezSkillClaw Agent Evolve Server)titlez/triggerc                 R   K   j                          d {   }  |       S 7 w)Nr6   )r  )r   r  r'   s    r(   trigger_evolvez9AgentEvolveServer.create_http_app.<locals>.trigger_evolve  s%      MMO+G00 ,s   '%'z/statusc            
       K   j                   j                         } | j                         D ci c]  \  }}||d   |j                  dd      d  }}}j	                  t
        j                  j                         d {   } j                  t        |      t        |       |j                  j                  d      S c c}}w 7 Iw)Nr   r   r   )r   r   )runningpending_sessionsregistered_skillsr   
fresh_moder  )r   r   r   rE   r   r   r   r   r   r   r{   rv   )entriesr   r   skill_summarypending_keysr  r'   s        r(   statusz1AgentEvolveServer.create_http_app.<locals>.status  s     ''335G  '}}
 D!	  !* uuY2 M  "&!3!3!" L
  #}}(+L(9),W+"&++"3"3 s   .C#C	1CCA
Cz/healthc                    K   ddiS w)Nr!  okrm   rm   r*   r(   healthz1AgentEvolveServer.create_http_app.<locals>.health  s     d##s   )fastapir  fastapi.responsesr  rM   rE   )r'   r  appr  r!  r$  r  s   `     @r(   create_http_appz!AgentEvolveServer.create_http_app  sp    #2;<	*		1 
	1 
		 
	0 
		$ 
	$ 
r*   )r{   r   rq   boolrr   z
str | Nonerf   rg   )r   z
list[dict]rf   rg   )r   zdict[str, dict]rf   zdict[str, dict[str, bytes]])create)r   rP   r   zdict[str, bytes]r   r.   rf   rg   )rf   rP   rh   )rf   rg   )ri   rj   rk   rl   r)   r   r   r   r  r   r  r  r(  rm   r*   r(   ro   ro      s    
   $ =" = 	 =
  = 
 =D!%N" 	D
D
 'D
 	D

 
D
TKb >)r*   ro   )2rl   
__future__r   rT   r   loggingr  r   r   r   pathlibr   typingr   skillclaw.skill_bundler   r	   r
   core.configr   core.llm_clientr   core.skill_registryr   
core.utilsr   pipeline.summarizerr   r   r   storage.oss_helpersr   r   r   r   r   r   agent_workspacer   r   r   commonr   openclaw_runnerr   	getLoggerri   r   r   ro   rm   r*   r(   <module>r:     s    #    	  '    - , 1 ' 
  , % % +			8	$S SlG) Gr*   