
    *"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mZmZ ddl	m
Z
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lmZmZ ddlmZ ddlmZm Z m!Z!m"Z" ddl#m$Z$ ddl%m&Z& ddl'm(Z(m)Z) ddl*m+Z+m,Z,m-Z-m.Z.m/Z/ ddl0m1Z1  ejd                  e3      Z4 G d de1      Z5y)a  
Core orchestrator for the current session-level evolve_server pipeline.

Active flow:
1. Drain pending sessions from shared storage.
2. Summarize sessions and extract metadata.
3. Optionally backfill a session-level score with session_judge.
4. Aggregate sessions by referenced skill.
5. Evolve existing-skill groups or create new skills from no-skill groups.
6. Upload skills, persist registry state, and ack processed sessions.
    )annotationsN)datetimetimezone)AnyOptional)bundle_tree_sha256)ValidationStore   )EvolveServerConfig)NO_SKILL_KEYDecisionAction)AsyncLLMClient)SkillIDRegistry)build_skill_mdparse_skill_content)aggregate_sessions_by_skill)create_skill_from_sessionsevolve_skill_from_sessionsexecute_mergeset_evolve_debug_dir)judge_sessions_parallel)verify_skill_candidate)set_summarizer_debug_dirsummarize_sessions_parallel)delete_session_keysfetch_skill_contentlist_session_keyssave_manifestsave_version_bundle   )EvolveEngineMixinc                      e Zd ZdZddd	 	 	 	 	 	 	 d&dZd'dZd(dZd) fdZd*d	Ze		 	 	 	 	 	 d+d
       Z
d,d-dZd.dZd/dZd0dZd1dZe	d2d       Zd3dZd4dZd3dZd5dZd3dZd6dZd6dZdd	 	 	 	 	 	 	 	 	 	 	 	 	 d7dZd8dZdd	 	 	 	 	 	 	 	 	 d9dZdd	 	 	 	 	 	 	 d:dZdd	 	 	 	 	 	 	 	 	 	 	 	 	 d;dZ	 	 	 	 	 	 	 	 d<dZ	 	 	 	 	 	 d=d Zd>d!Zd?d"Z d?d#Z!d?d$Z"d% Z# xZ$S )@EvolveServerz<Session-level evolve server backed by shared object storage.FNmock	mock_rootc                  || _         || _        | j                  |||      | _        |j                   d| _        t        |j                  |j                  |j                  |j                  |j                        | _        t        | j                   j                  | j                   j                  | j                   j                   | j                   j"                  | j                   j$                  | j                   j&                  | j                   j(                  | j                   j*                  | j                   j                  	      | _        t/               | _        | j3                         | _        d| _        t9        |j:                         t=        |j:                         | j?                         s1| j0                  jA                  | j                  | j
                         y y )Nr$   /)api_keybase_urlmodel
max_tokenstemperature)	backendendpointbucketaccess_key_idsecret_access_keyregionsession_token
local_rootgroup_idF)!config_mock_build_bucket_bucketr6   _prefixr   llm_api_keyllm_base_url	llm_modelllm_max_tokensllm_temperature_llmr	   storage_backendstorage_endpointstorage_bucketstorage_access_key_idstorage_secret_access_keystorage_regionstorage_session_tokenr5   _validation_storer   _id_registry_build_nacos_skill_client_nacos_skill_client_runningr   debug_dump_dirr   _uses_nacos_skill_registryload_from_oss)selfr7   r%   r&   s       9/root/.hermes/SkillClaw/evolve_server/engines/workflow.py__init__zEvolveServer.__init__7   sk    
))&ty)Q //*!,"&&(("",,..
	 "1KK//[[11;;--++;;"kkCC;;--++;;{{--[[))
"
 ,-#'#A#A#C V223 !6!67..0++DLL$,,G 1    c                    t        t        | j                  dd      xs d      j                         j	                         dk(  S )Nskill_storage_backend nacos)strgetattrr7   striplowerrQ   s    rR   rO   z'EvolveServer._uses_nacos_skill_registry]   s8    74;;(?DJKQQSYY[_fffrT   c                   | j                         sy ddlm}  |t        t	        | j
                  dd      xs d      t        t	        | j
                  dd      xs d      t        t	        | j
                  dd      xs d      t        t	        | j
                  dd      xs d      t        t	        | j
                  d	d      xs d      
      S )Nr   )NacosSkillClientnacos_serverrW   nacos_namespace_idpublicnacos_access_tokennacos_usernamenacos_password)servernamespace_idaccess_tokenusernamepassword)rO   skillclaw.nacos_skill_hubr_   rY   rZ   r7   )rQ   r_   s     rR   rK   z&EvolveServer._build_nacos_skill_client`   s    ..0>wt{{NB?E2FWT[[2FKWxXWT[[2FKQrR.>CIrJ.>CIrJ
 	
rT   c                    | j                   Ii }| j                   j                         D ](  }t        |j                  d      xs d      }|s$|||<   * |S t        |          S )NnamerW   )rL   list_skillsrY   getsuper_load_remote_skills)rQ   skillsitemrm   	__class__s       rR   rq   z EvolveServer._load_remote_skillsm   sk    ##/02F00<<> (488F+1r2#'F4L( Mw*,,rT   c                h    | j                         j                  |      }t        |t              r|S d S )N)rq   ro   
isinstancedict)rQ   rm   recs      rR   _load_remote_skill_recordz&EvolveServer._load_remote_skill_recordw   s/    &&(,,T2 d+s55rT   c                   | r|s| S t        |j                  dd      xs d      j                         }|r5t        | j                  dd      xs d      j                         dk(  r|| d<   t        | j                  dd      xs d      j                         s4t        |j                  dd      xs d      j                         }|r|| d<   | S )NcategoryrW   generaldescription)rY   ro   r[   )skillmanifest_recordr{   r}   s       rR   _overlay_manifest_metadataz'EvolveServer._overlay_manifest_metadata{   s    
 OL**:r:@bAGGIEIIj)<I	JPPRV__ (E*599]B/526<<>o11-DJKQQSK'2m$rT   c                   ddl } |j                         |z   }d} |j                         |k  r	 | j                  j                  |      }|r|j	                  di       ni }|j	                  d      |k(  ry|s8	 | j                  j                  ||d       t        j                  d||       d} |j                  d	        |j                         |k  rt        j                  d
|||       y# t        $ r Y Kw xY w# t        $ r Y Zw xY w)a-  Publish a Nacos skill version and wait for it to go online.

        Nacos v3 runs a publish pipeline on submit. The pipeline must approve
        before the publish call succeeds. This method polls for approval and
        retries publish until the version goes online with the latest label.
        r   NFlabelslatestT)update_latest_labelz/[EvolveServer] Nacos publish accepted for %s %sg       @zA[EvolveServer] Nacos publish not confirmed for %s %s within %.0fs)time	monotonicrL   	get_skillro   publishloggerinfo	Exceptionsleepwarning)	rQ   rm   versiontimeoutr   deadline	publisheddetailr   s	            rR   _wait_nacos_publishz EvolveServer._wait_nacos_publish   s    	!4>>#g-	dnn)11;;DA5;Hb1::h'72 0088w\`8a$UW[]de$(	
 DJJsO dnn)  	Z\`bikrs %  s6   AC? 6C? 97C0 0	C<9C? ;C<<C? ?	D
Dc                   | j                   	 ddlm}m}m} | j                  |      xs i }	 |r| j                   j                  |      ni } |||      }|r$|\  }}	| j                   j                  ||	d      }
ngt        t        | j                  dd      xs d      } ||||      }	|	st        j                  d	||       y | j                   j                  ||	|
      }
 ||
      }|j                  d      }||j                  d      S d S t#        | j$                  | j&                  |      S # t        $ r i }Y w xY w# t        $ r!}t        j!                  d||       Y d }~y d }~ww xY w)Nr   )_nacos_published_version_nacos_working_version_nacos_zip_to_bundleTr   adminnacos_labelrW   r   )labelz9[EvolveServer] Nacos skill %s has no published %s version)r   r   SKILL.mdutf-8z1[EvolveServer] failed to fetch Nacos skill %s: %s)rL   rk   r   r   r   ry   r   r   download_skill_ziprY   rZ   r7   r   r   ro   decoder   r   r:   r;   )rQ   rm   r   r   r   recordr   working_statusr   	zip_bytesr   bundledataexcs                  rR   _fetch_skillzEvolveServer._fetch_skill   s   ##/$  77=C IOT55??EUWF 1@'.$GW $ 8 8 K KDZaim K nI]B G S8TE6vvUSG"W !
  $ $ 8 8 K K '# !L !I
 .i8zz*-/3/?t{{7+ITI #4<<tDD7 !  F 0  RTXZ]^sH   E D3 A7E A	E E 3E>E  EE 	E.E))E.c                x   |j                  dd      }|sy| j                  ddlm}m}m}m}m} t        |      }	|	j                  d      }
d|
i}| j                  |      xs i }	 |r| j                  j                  |      ni } |||      }|ro|\  }}	 | j                  j                  ||d	      } ||      } |||      rt        j!                  d|||       d| S t        j!                  d|||       d| S  |||      } |||      }| j                  j#                  || d| dd|       t%        t'        | j(                  dd      xs d      j+                         j-                         }|dv r| j                  j/                  ||       d}|dk(  r| j1                  ||      }t        j!                  d||||       |dk(  ry|dk(  ry|syy| j2                  j5                  |      }t        |      }	| j6                   d| d}|	j                  d      }
| j8                  j;                  ||
       t=        j>                  |
      jA                         }tC        d|
i      }dd|d|tE        |
      dgd }| j2                  jG                  ||||!      }tI        | j8                  | j6                  ||d|
i       | jK                         }|||||dd|d"   d#tM        jN                  tP        jR                        jU                         |j                  d$d      |j                  d%d&      d'||<   tW        | j8                  | j6                  |       t        j!                  d(||||       y# t        $ r i }Y w xY w# t        $ r(}t        j                  d
||||       d| cY d }~S d }~ww xY w))Nrm   rW   skipped_missing_namer   )_bundle_matches_remote_bundle_to_nacos_zipr   r   _next_versionr   r   Tr   zK[EvolveServer] skipping Nacos skill %s: failed to inspect %s version %s: %sskipped_existing_zD[EvolveServer] skipped Nacos skill %s: %s version %s already matcheszC[EvolveServer] skipped Nacos skill %s: %s version %s already exists-z.zip)r   filename	overwritetarget_versionnacos_publish_modereview>   directr   Fr   zM[EvolveServer] uploaded skill %s to Nacos as %s via action=%s publish_mode=%sdraftuploaded_draftuploaded_pending_reviewuploaded_pending_publishuploadedzskills/z	/SKILL.md	bundle_v1)pathsha256size)format
entrypointtree_sha256files)actionbundle_recordr   evolve_serverr}   r{   r|   )rm   skill_idr   r   r   r   r   r   uploaded_byuploaded_atr}   r{   z3[EvolveServer] uploaded skill %s (id=%s, v%d) to %s),ro   rL   rk   r   r   r   r   r   r   encodery   r   r   r   r   r   r   upload_skill_ziprY   rZ   r7   r[   r\   submitr   rJ   get_or_creater;   r:   
put_objecthashlibr   	hexdigestr   lenrecord_updater   rq   r   nowr   utc	isoformatr   )rQ   r~   r   rm   r   r   r   r   r   
md_contentmd_bytesbundle_filesr   r   r   statusr   r   remote_bundler   r   publish_modepublish_confirmedr   
object_keycontent_shatree_shar   manifests                                rR   _upload_skillzEvolveServer._upload_skill   s   yy$)##/  (.J!((1H&1L33D9?RFEK11;;DAQS -VV<G")8 $ 8 8 K KDZaim K nI$8$CM *,FKK^	 /vh77Y	 +6(33*66:N,T<@I$$55# 6>"2$7-	 6  wt{{4H"MYQYZ``bhhjL33((//nE %x'$($<$<T>$R!KK_ w&'x'0$1$$2248#E*
~WTF)<
$$W-
H5nnX.88:%z8&<=!$#)[#h-XY	
 ##11'	 2 
 	DLL$,,g
T\G]^++- !#!$"7+*#<<5??A 99]B7		*i8
 	dllDLL(;A	
 U   ! 8NNe /vh778s0   'M6 &N 6NN	N9N4.N94N9c                   | j                   | j                  |      }|syt        j                  |j	                  d            j                         }t        |      }t        j                  |j	                  d            j                         }||k7  S | j                  j                  |      }|syt        |      }t        j                  |j	                  d            j                         }||k7  S )NFr   )	rL   r   r   r   r   r   r   rJ   get_content_sha)rQ   rm   incoming_skillexisting_mdexisting_shaincoming_mdincoming_shas          rR   _detect_conflictzEvolveServer._detect_conflictR  s    ##/++D1K">>+*<*<W*EFPPRL(8K">>+*<*<W*EFPPRL<//((88>$^4~~k&8&8&ABLLN|++rT   c                   K   |j                  dd      }| j                  | j                  ||       d {   }|s7| j                  | j                  ||       d {   }| j	                  ||      S t
        j                  d|       | j                  | j                  |       d {   }|s7| j                  | j                  ||       d {   }| j	                  ||      S t        ||      }| j                  || j                  |            }| j                  j                  |      |d<   t        | j                  ||       d {   }|rM|j                  d      r<||d<   | j                  | j                  |d       d {   }| j	                  d|      S t
        j                  d|       | j                  | j                  ||       d {   }| j	                  ||      S 7 7 7 J7 &7 7 q7 &w)Nrm   rW   z3[EvolveServer] conflict detected for '%s' - merging_versionmergez?[EvolveServer] merge failed for '%s' - keeping incoming version)ro   _call_storager   r   _upload_status_to_actionr   r   r   r   r   ry   rJ   get_versionr   rA   r   )	rQ   r~   action_typerm   has_conflictupload_statusr   existing_skillmergeds	            rR   _resolve_and_uploadz EvolveServer._resolve_and_uploadb  s    yy$!//0E0EtUSS"&"4"4T5G5GP["\\M00mLLI4P ..t/@/@$GG"&"4"4T5G5GP["\\M00mLL,T;?88**40
 &*%6%6%B%B4%Hz"$TYYFFfjj(!F6N"&"4"4T5G5GQX"YYM00-HHXZ^_"001C1CUKXX,,[-HH3 T\ H\ G Z Ys~   3G>G,&G>G/AG>(G2)&G>G5A;G>G8<G>G:	AG>G<G>/G>2G>5G>8G>:G><G>c                d    |dk(  r| dfS |dk(  r|  ddfS |dk(  r|  ddfS |dk(  r|  d	dfS |dfS )
Nr   Tr   _pending_reviewFr   _pending_publishr   _draft )r   r   s     rR   r   z%EvolveServer._upload_status_to_action  sr    J&$$55!]/2E9966!]"23U::,,!]&)500e##rT   c                N    t        | j                  j                        ddd d d dS )Nr   )enabledjudged_sessionsscored_sessions
mean_score	min_score	max_score)boolr7   use_session_judger]   s    rR   _empty_judge_summaryz!EvolveServer._empty_judge_summary  s-    DKK99:  
 	
rT   c           	     r  K   | j                         }| j                  j                  r|s|S t        | j                  |       d {   }|D cg c]V  }|j                  d      }t        |t              r3t        |j                  d      t        t        f      rt        |d         X }}}||d<   t        |      |d<   |rTt        t        |      t        |      z  d      |d<   t        t        |      d      |d<   t        t        |      d      |d<   t        j!                  d	|       |S 7 c c}}w w)
N_judge_scoresoverall_scorer   r      r   r   r   z:[EvolveServer] judged %d sessions without benchmark scores)r  r7   r  r   rA   ro   rv   rw   intfloatr   roundsumminmaxr   r   )rQ   sessionssummaryjudgedsessionjudge_scoresscoress          rR   _run_session_judgezEvolveServer._run_session_judge  s    ++-{{,,HN.tyy(CC $
!(_!=,-*\=M=Mo=^adfk`l2m ,/0
 
 &,!"%([!"$)#f+F*CQ$GGL!#(Va#8GK #(Va#8GK PRXY D
s&   AD7D/	D7AD1+BD71D7c                P    t        | j                  j                        dddd d d dS )Nr   )r   verified_skillsacceptedrejectedr   r   r   )r   r7   use_skill_verifierr]   s    rR   _empty_skill_verifier_summaryz*EvolveServer._empty_skill_verifier_summary  s0    DKK::; 
 	
rT   c                   | j                         }| j                  j                  s|S g }|D ]  }|j                  d      }t	        |t
              r|j                  d      s6|dxx   dz  cc<   |j                  d      r|dxx   dz  cc<   n|dxx   dz  cc<   |j                  d      }t	        |t        t        f      st	        |t              r|j                  t        |              |rTt        t        |      t        |      z  d      |d	<   t        t        |      d      |d
<   t        t        |      d      |d<   |S )Nverificationr   r  r    r  r  scorer  r   r   r   )r  r7   r  ro   rv   rw   r  r  r   appendr	  r
  r   r  r  )rQ   recordsr  r  r   r  r  s          rR   _collect_skill_verifier_summaryz,EvolveServer._collect_skill_verifier_summary  s&   446{{--N  	,F!::n5LlD19I9I)9T%&!+&
+
#q(#
#q(# $$W-E%#u.z%7NeEl+	, $)#f+F*CQ$GGL!#(Va#8GK #(Va#8GK rT   c                <    | j                   j                  ddddddS )Nr   )r   jobs_scannedpendingr   r  skipped)r7   r   r]   s    rR   !_empty_validation_publish_summaryz.EvolveServer._empty_validation_publish_summary  s(     KK44
 	
rT   c                   g }|d d D ]   }t        |j                  dd            t        |j                  dd            d}|j                  d      }|rt        d |D              |d<   |j                  d	      }t        |t              r6t        |j                  d
      t
        t        f      rt        |d
         |d<   t        |j                  d      t
        t        f      rt        |d         |d<   |j                  |        |S )N   
session_idrW   _summary)r'  r  _skills_referencedc              3  Z   K   | ]#  }t        |xs d       st        |xs d        % yw)rW   N)rY   ).0ss     rR   	<genexpr>z:EvolveServer._build_validation_evidence.<locals>.<genexpr>  s'     2`ASVWXW^\^S_3qwB<2`s   ++skills_referencedr  r  judge_overall_score_avg_prmavg_prm)rY   ro   sortedrv   rw   r  r  r  )rQ   r  evidencer  rs   rr   r  s          rR   _build_validation_evidencez'EvolveServer._build_validation_evidence  s    )+| 	"G!'++lB"?@w{{:r:;$D [[!56F,22`2`,`()";;7L,-*\=M=Mo=^adfk`l2m.3L4Q.R*+'++j1C<@"'
(;"<YOOD!	" rT   c                   g }g }|d d D ]t  }t        |j                  dd      xs d      }|j                  d      xs g }t        |t              sI|D ]&  }t        |t              st        |j                  dd      xs d      j                         }t        |j                  dd      xs d      j                         }	|r|	st|t        |j                  dd      xs d      |d d	 |	d d
 t        |j                  d            t        |j                  d      xs |j                  d            d}
|
d   s|
d   s|j                  |
       n|j                  |
       t        |      dk\  s |d d c c S  w |r|d d S |d d S )N   r'  rW   turnsprompt_textresponse_textturn_numr   i  i  
tool_callstool_resultstool_observations)r'  r:  instructionreference_responsehad_tool_callshad_tool_resultsr@  rA  r  )
rY   ro   rv   listrw   r[   r  r   r  r   )rQ   r  	preferredfallbackr  r'  r7  turnr>  r?  cases              rR   _build_replay_casesz EvolveServer._build_replay_cases  s   *,	)+| 	)GW[[r:@bAJKK(.BEeT* )!$-!$((=""="CDJJL%(/2)F)L"%M%S%S%U""*<", #DHHZ$;$@q A#.u#5*<Ud*C&*488L+A&B(,TXXn-E-fReIf(g ,-d;M6N$$T*OOD)y>Q&$Ra=())	)6 Ra= |rT   current_skillc               :   t        |j                  dd      xs d      }| j                  j                  |      }| j                  j                  |      }	i d|	dddt        j                  t        j                        j                         d|d|d	|d
|d|d|d|d|D 
cg c]  }
|
j                  dd       c}
d| j                  |      d| j                  |      d| j                  j                  d| j                  j                  d| j                  j                   d| j                  j"                  }| j                  j%                  |       t&        j)                  d|	|       d|||d |d   |||j                  d      d|	dS c c}
w )Nrm   rW   job_idr   pending_validation
created_atcandidate_skill_namecandidate_skill_idcandidate_skillrI  proposed_actionsource	rationalesession_idsr'  session_evidencereplay_casesmin_resultsmin_approvalsr   max_rejectionszO[EvolveServer] queued validation job %s for skill '%s' (publish_mode=validated)queued_for_validationedit_summaryF)r   rQ  
skill_namer   r   rT  rS  rR  r[  r   validation_job_id)rY   ro   rJ   r   rI   make_job_idr   r   r   r   r   r4  rG  r7   validation_required_resultsvalidation_required_approvalsvalidation_min_mean_scorevalidation_max_rejectionssave_jobr   r   )rQ   r~   r   r  rS  rR  rI  rm   r   rK  r  jobs               rR   _queue_validation_jobz"EvolveServer._queue_validation_job  s    599VR(.B/$$2248''33D9
f
*
 (,,x||4>>@
 #D	

 !(
 u
 ]
 {
 f
 
 RgGKKb9R
  ? ? I
 D44X>
 4;;BB
 T[[FF
  >>!
" dkkCC#
& 	'',]	
 .* }-"!IIn5!'
 	
 Ss   )Fc                	  K   | j                         }| j                  j                  dk7  rg |fS g }| j                  j	                         D ]  }|dxx   dz  cc<   t        |j                  dd      xs d      }|s3| j                  j                  |      rO| j                  j                  |      }|s|dxx   dz  cc<   zd}d}g }|D ]s  }	|	j                  d      d	u r|dz  }n|dz  }|	j                  d
      }
t        |
t        t        f      sIt        |
t              rZ|j                  t        |
             u |r!t        t        |      t!        |      z  d      nd }t!        |      | j                  j"                  k\  xr: || j                  j$                  k\  xr |d uxr || j                  j&                  k\  }|| j                  j(                  k\  }|r|j                  d      }t        |t*              r|j                  d      s;| j                  j-                  |ddt!        |      |||d       |dxx   dz  cc<   t        |j                  dt.        j0                        xs t.        j0                        }| j3                  ||       d {   \  }}| j                  j-                  ||rdnd|t!        |      |||d       |r|dxx   dz  cc<   n|dxx   dz  cc<   |j                  |rdn||t        |j                  dd            | j4                  j7                  t        |j                  dd                  | j4                  j9                  t        |j                  dd                  t;        |j                  d      xs g       t        |j                  dd      xs d      d||t!        |      |||dd       |r| j                  j-                  |ddt!        |      |||d       |dxx   dz  cc<   |j                  dt        |j                  dd            t        |j                  dd            t        |j                  dd            d t;        |j                  d      xs g       t        |j                  dd      xs d      dd|t!        |      |||dd        ||dxx   dz  cc<    ||fS 7 <w)!N	validatedr!  r    rK  rW   r"  r   r  Tr  r  rP  rm   r  zcandidate skill payload missing)r   reasonresult_countaccepted_countrejected_countr   rQ  r   r#  )r   published_actionri  rj  rk  r   published_after_validationrT  rS  validation_publish)ri  rj  rk  r   )r   rl  r\  r   r   rT  rS  rR  r   r]  validation_resultsz$client validation rejected candidatevalidation_rejectedrN  rO  F)r   rQ  r\  r   r   rT  rS  rR  r   r]  ro  )r$  r7   r   rI   	list_jobsrY   ro   load_decisionlist_resultsrv   r  r  r   r  r	  r
  r   r_  r`  ra  rb  rw   save_decisionr   CREATEr   rJ   r   r   rB  )rQ   r  r  rd  rK  resultsr  r  r  resultr  r   publish_readyreject_readyrP  r   actual_actionr   s                     rR   _finalize_validation_jobsz&EvolveServer._finalize_validation_jobsA  s    88:;;##{2w;(*))335 |	$CN#q(#2.4"5F%%33F;,,99&AG	"a'"HH"$F! 0::j)T1MHMH

7+ec5\2:eT;RMM%,/0 AGs6{S[8!<DJG G GG H I IIHd*H $++"G"GG	  $t{{'L'LLL"%''*;"<!/48@S@STZ@[**88&0&G,/L.6.6*4
 J'1,'!#''*;^=R=R"S"lWeWlWlm040H0HZe0f*f'x&&4419+y,9(+G*2*2&0
 K(A-(I&!+&BJ">P],9&)/*=*=fb*I&J$($5$5$C$CCH[H[\bdfHgDh$i#'#4#4#@#@_EXEXY_acEdAe#f'+CGGM,B,Hb'I%(b)A)GR%H"6$,-3,/L.6.6*4	/( &&44","H(+G*2*2&0
 
#q(#"7+.sww7H"/M+N&)#''2H"*M&N$'0Db(I$J#''+CGGM,B,Hb'I%(b)A)GR%H"6$)-3,/L.6.6*4	/( I!#y|	$| W +gs    DSS(E8S S!H<Sc                  K   | j                   j                  sddiS t        | j                  ||||| j                   j                         d {   S 7 w)Nr   F)rI  r   )r7   r  r   rA   skill_verifier_min_score)rQ   r~   r   r  rI  s        rR   _run_skill_verifierz EvolveServer._run_skill_verifier  sW      {{--u%%+II'kk::
 
 	
 
s   AAAAoverwrite_bodyc               :   |r|sy |r+|j                  dd      |d<   |j                  dd      |d<   nD|j                  d|j                  dd             |j                  d|j                  dd             |j                  d|j                  d      xs i        y )NcontentrW   r{   r|   extra_frontmatter)ro   
setdefault)rQ   evolved_skillrI  r  s       rR   _inherit_current_skillz#EvolveServer._inherit_current_skill  s     M'4'8'8B'GM)$(5(9(9*i(PM*%$$Y0A0A)R0PQ$$Z1B1B:y1YZ  !4m6G6GH[6\6b`bcrT   c                 K   |r|j                  d      sy |t        j                  k(  r|r|j                  d      r|d   }n| j                  |d         }||d<   | j	                  ||||       d {   }|D 	cg c]  }	|	j                  dd       }
}	|j                  d      rU|j                  d      sDt
        j                  d||j                  dd	             d
||d d |
|||j                  d      d|dS | j                  j                  |      }||d<   | j                  j                  dk(  r| j                  ||||||      }||d<   |S | j                  ||       d {   \  }}t
        j                  d|||| j                  j                  |             |||| j                  j                  |      |
|||j                  d      ||d
S 7 ec c}	w 7 vw)Nrm   rH  r'  rW   r   r  z/[EvolveServer] verifier rejected skill '%s': %srh  zno reason providedverification_rejectedr[  F)r   rQ  r\  r   r   rT  rS  rR  r[  r   r  r   rg  r  z)[EvolveServer] %s skill '%s' (id=%s, v%d))
r   r\  r   r   rT  rS  rR  r[  r   r  )ro   r   IMPROVE_sanitise_namer~  r   r   rJ   r   r7   r   re  r   r   )rQ   r  r   r  rS  rR  rI  rm   r  r  rT  r   r   rz  r   s                  rR   _materialize_skillzEvolveServer._materialize_skill  s,     M$5$5f$=.000]}GXGXY_G` (D&&}V'<=D $f!55'	 6 
 
 EMMw{{<4MMI&|/?/?
/KKKA  +?@ 2#." *&  - 1 1. A! ,  $$2248$,j!;;##{2//+ 0 F &2F>"M(,(@(@P[(\"\x7))$/	
 $ ((44T:&")--n= (
 	
c
 NF #]s2   A2G#4G5G#=GCG#*G!+A/G#G#c           	       K   | j                  | j                  |       d {   }|rt        ||      nd }| j                  || j                  | j                  |       d {         }t        | j                  ||||       d {   }|r"|j                  d      t        j                  k(  rt        j                  d|       y |j                  dt        j                        }|j                  d      }|sy |t        j                  k(  r|r| j                  ||d       n|r| j                  ||       | j                  ||||j                  dd      d|	       d {   S 7 F7 	7 7 w)
Nr   z.[EvolveServer] skill '%s': LLM decided to skipr~   Tr  rS  rW   skill_grouprH  )r   r   r   r   ry   r   rA   ro   r   SKIPr   r   r  OPTIMIZE_DESCr  r  )	rQ   r\  r  existing_skill_names
current_mdrI  rw  r   r  s	            rR   _evolve_skill_groupz EvolveServer._evolve_skill_group<  sh      --d.?.?LL
GQ+J
CW[77$$T%C%CZPP

 2II 
 
 H-1D1DDKKH*Ujj>+A+AB

7+.666=''}UY'Z''}E,,JJ{B'' - 
 
 	
9 M Q
*
sF    E2E(?E2"E+
#$E2E.CE2#E0$E2+E2.E20E2c           	     t  K   t        | j                  ||       d {   }|r"|j                  d      t        j                  k(  rt
        j                  d       g S |j                  d      }|sg S | j                  |t        j                  ||j                  dd      d       d {   }|r|gS g S 7 7 w)Nr   z5[EvolveServer] no-skill sessions: LLM decided to skipr~   rS  rW   no_skill)	r   rA   ro   r   r  r   r   r  ru  )rQ   r  r  rw  r  r   s         rR   _handle_no_skill_sessionsz&EvolveServer._handle_no_skill_sessionsg  s     
 2$))XG[\\H-1D1DDKKOPI

7+I..!!JJ{B'
 
 "x)r)! ]
s"   B8B4B
B8(B6)B86B8c                  K   t         j                  d       t        j                         }| j	                          d {   \  }}| j                         }d}g }g }d}|r~t         j                  dt        |             t        | j                  |       d {    | j                  |       d {   }t        |      }	|	j                  t        g       }t        |	      }| j                  | j                         d {   }
|
j                         D cg c]  }|j!                  dd       }}|	rt         j                  d|       |	j#                         D ]5  \  }}	 | j%                  |||       d {   }|s%|j+                  |       7 |r_t         j                  d
t        |             	 |j-                  | j/                  ||       d {          nt         j                  d       | j1                          d {   \  }}||z   }| j3                         sC| j                  | j4                  j6                  | j8                  | j:                         d {    |r,|s*| j                  t<        | j8                  |       d {    n#|r!|rt         j?                  dt        |             tA        t        j                         |z
  d      }tC        d |D              }tC        d |D              }tC        d |D              }| jE                  |      }tG        jH                  tJ        jL                        jO                         |t        |      |t        |      t        |      |||||||||d}| jQ                  |       t         j                  dt        |      ||||       |dkD  r| jS                          d {    |S 7 7 97 #7 c c}w 7 h# t&        $ r$}t         j)                  d||       d	}Y d }~d }~ww xY w7 ># t&        $ r#}t         j)                  d|       d	}Y d }~Id }~ww xY w7 >7 7 7 w)Nz/[EvolveServer] === starting evolution cycle ===r   Fz&[EvolveServer] summarizing %d sessionsrm   rW   z)[EvolveServer] evolving %d skill group(s)z+[EvolveServer] skill '%s' evolve failed: %sTz.[EvolveServer] processing %d no-skill sessionsz)[EvolveServer] no-skill evolve failed: %szE[EvolveServer] queue empty - checking pending validation publish jobszX[EvolveServer] retaining %d session(s) in queue because this cycle had processing errorsr    c              3  D   K   | ]  }|j                  d       sd  yw)r   r    Nro   r+  r   s     rR   r-  z(EvolveServer.run_once.<locals>.<genexpr>  s     TFVZZ
=SaTs     c              3  J   K   | ]  }|j                  d       dk(  sd  yw)r   rZ  r    Nr  r  s     rR   r-  z(EvolveServer.run_once.<locals>.<genexpr>  s!     ofvzz(?SWn?no   ##c              3  J   K   | ]  }|j                  d       dk(  sd  yw)r   rm  r    Nr  r  s     rR   r-  z(EvolveServer.run_once.<locals>.<genexpr>  s&      )
6::h+?C_+_A)
r  )	timestampelapsed_secondsr  skill_groupsno_skill_sessionsactionsskills_evolveduploaded_skillscandidates_queuedrm  
evolutionssession_judgeskill_verifierrn  had_processing_errorz`[EvolveServer] === cycle done: %d sessions, %d skill groups, %d uploaded, %d queued in %.1fs ===)*r   r   r   r   _drain_sessionsr  r   r   rA   r  r   popr   r   rq   valuesro   itemsr  r   errorr  extendr  r{  rO   rJ   save_to_ossr:   r;   r   r   r	  r
  r  r   r   r   r   r   _append_history_notify_proxy_reload)rQ   
started_atr  session_keysjudge_summaryskill_group_countr  evolution_recordsr  grouped_sessionsr   rs   r  r\  skill_sessionsr   r   published_recordsvalidation_publish_summaryall_recordselapsedr  queued_candidatesrm  skill_verifier_summaryr  s                             rR   run_oncezEvolveServer.run_once~  s    EF^^%
'+';';'=!=,113(*(*$KK@#h-P-diiBBB"&"9"9("CCM:8D 0 4 4\2 F #$4 5!//0H0HIIHEM__EV#WTDHHVR$8#W #WGIZ[.>.D.D.F 5*
N#'#;#;JXl#mmF
 %,,V45 !LcRcNde0%,,"<<=NPdee KK_`>B>\>\>^8^55'*;;..0$$T%6%6%B%BDLLRVR^R^___ 4$$%8$,,UUU2NNjL!
 (:5q9TkTTooo%( )
')
 &
" "&!E!Ek!R!hll3==?&H-!$%6!7;'-.!2*D%*4"<$8
" 	W%nM	
 Q++---w "> CC J#W n  LL!NPZ\_`+/( f  0LL!LcR+/(0 9_ `UR .s  =QO AQOQ3O4AQOQO20Q#O$9O!:O$>Q4Q6 P PP )QQ	AQ#Q	$,QQD8Q	Q
QQQQQ!O$$	P-PQPQP 	Q P>8Q>QQ	QQQc                j  K   t        t        | j                  dd      xs d      j                         j	                         }t        t        | j                  dd      xs d      j                         j                  d      }|dk7  s|sy i }t        t        | j                  dd      xs d      }|rd| |d	<   d
d l}t        d      D ]s  }	 |j                  d      4 d {   }|j                  | d|       d {   }|j                          d d d       d {    t        j                  d|        y  y 7 \7 @7 "# 1 d {  7  sw Y   2xY w# t        $ rJ}	|dk  r%t        j                  d|dz   z         d {  7   nt        j!                  d|	       Y d }	~	d }	~	ww xY ww)Nskill_reload_moderW   pollproxy_reload_urlr(   callbackproxy_reload_api_keyzBearer Authorizationr   r  g      @)r   z/internal/reload-skills)headersz2[EvolveServer] notified proxy to reload skills: %sr
   g      ?r    z>[EvolveServer] proxy reload notify failed after 3 attempts: %s)rY   rZ   r7   r[   r\   rstriphttpxrangeAsyncClientpostraise_for_statusr   r   r   asyncior   r   )
rQ   modeurlr  r)   r  attemptclientrespr   s
             rR   r  z!EvolveServer._notify_proxy_reload  s    74;;(;R@JFKQQSYY['$++'92>D"EKKMTTUXY:S"$gdkk+A2FL"M)0	':GO$Qx 	jG
j ,,S,9 , ,V!'u4K-LV]!^^D))+, , PRUV	j,^, , , ,
  jQ;!--w{(;<<<NN#cehi	js   CF3E%E&E)EEEE#E$E>F3EEEE	EE	E	F0&#F+	F
F+&F3+F00F3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*[EvolveServer] periodic mode: interval=%dsz[EvolveServer] cycle error: %s)exc_info)
rM   r   r   r7   interval_secondsr  r   r  r  r   )rQ   r   s     rR   run_periodiczEvolveServer.run_periodic  s     @$++B^B^_mmSmmo%% -- < <=== mm% S=sTRRS=sS   >CB BB ,CC	CCB 	C$C<CCCc                    d| _         y )NF)rM   r]   s    rR   stopzEvolveServer.stop  s	    rT   c                     ddl m} ddlm  |d      }|j	                  d       fd       }|j                  d       fd	       }|j                  d
      d        }|S )Nr   )FastAPI)JSONResponsezSkillClaw Evolve Server)titlez/triggerc                 N   K     j                          d {         S 7 	w)Nr  )r  )r  rQ   s   rR   trigger_evolvez4EvolveServer.create_http_app.<locals>.trigger_evolve
  s     dmmo(=>>(=s   %#
%z/statusc                 R  K   j                         rj                         nj                  j                         } j	                  t
        j                  j                         d {   } j                  t        |      t        |       | j                         D ci c]j  \  }}||j                  d      xs |j                  d      xs ||j                  d      xs( |j                  d      xs i j                  d      xs ddl c}}d	      S 7 c c}}w w)
Nr   rm   r   r   r   r   )r   r   )runningpending_sessionsregistered_skillsrr   r  )rO   rq   rJ   all_entriesr   r   r:   r;   rM   r   r  ro   )entriespending_keysrm   rs   r  rQ   s       rR   r   z,EvolveServer.create_http_app.<locals>.status  s     /3.M.M.O((*UYUfUfUrUrUt  "&!3!34Et||UYUaUa!bbL#}}(+L(9),W +2--/
 'D$	 (,(<(X@P(XTX'+xx	':'ktxx?Q?WUW>\>\]e>f'kjk 	  cs%   A)D',D-8D'%A/D!D'!D'z/healthc                    K   ddiS w)Nr   okr   r   rT   rR   healthz,EvolveServer.create_http_app.<locals>.health#  s     d##s   )fastapir  fastapi.responsesr  r  ro   )rQ   r  appr  r   r  r  s   `     @rR   create_http_appzEvolveServer.create_http_app  sp    #256	*		? 
	? 
		 
	( 
		$ 
	$ 
rT   )r7   r   r%   r   r&   z
str | NonereturnNone)r  r   )r  z
Any | None)r  zdict[str, dict[str, Any]])rm   rY   r  Optional[dict[str, Any]])r~   r  r   r  r  r  )g      >@)rm   rY   r   rY   r   r  r  r   )rm   rY   r  zOptional[str])r~   rw   r   rY   r  rY   )rm   rY   r   rw   r  r   )r~   rw   r   rY   r  tuple[str, bool])r   rY   r   rY   r  r  )r  dict[str, Any])r  
list[dict]r  r  )r  list[dict[str, Any]]r  r  )r  r  r  r  )r~   r  r   rY   r  r  rS  rY   rR  rY   rI  r  r  r  )r  z+tuple[list[dict[str, Any]], dict[str, Any]])
r~   r  r   rY   r  r  rI  r  r  r  )r  r  rI  r  r  r   r  r  )r  Optional[dict]r   rY   r  r  rS  rY   rR  rY   rI  r  r  r  )r\  rY   r  r  r  	list[str]r  r  )r  r  r  r  r  r  )r  rw   )r  r  )%__name__
__module____qualname____doc__rS   rO   rK   rq   ry   staticmethodr   r   r   r   r   r   r   r  r  r  r  r$  r4  rG  re  r{  r~  r  r  r  r  r  r  r  r  r  __classcell__)rt   s   @rR   r#   r#   4   s]   F  $$H"$H 	$H
 $H 
$HLg
-6 '1 
" <'ER~@, I: 	$ 	$
*	
2
$!V 372
2
 2
 '	2

 2
 2
 02
 
2
hD X 37

 
 '	
 0
 

0  %d/d 0d
 d 
d2 37O
%O
 O
 '	O

 O
 O
 0O
 
O
b)
)
 )
 (	)

 
)
V** (* 
	*._Bj0>#rT   r#   )6r  
__future__r   r  r   loggingr   r   r   typingr   r   skillclaw.skill_bundler   skillclaw.validation_storer	   core.configr   core.constantsr   r   core.llm_clientr   core.skill_registryr   
core.utilsr   r   pipeline.aggregationr   pipeline.executionr   r   r   r   pipeline.session_judger   pipeline.skill_verifierr   pipeline.summarizerr   r   storage.oss_helpersr   r   r   r   r   commonr!   	getLoggerr  r   r#   r   rT   rR   <module>r     s~   
 #     '   5 6 , 9 , 1 < >  = < W  &			8	$s$ srT   