
    *"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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  ej,                  e      Z G d d      Zy)z8Shared helpers for evolve-server engine implementations.    )annotationsN)Any)build_object_store   )EvolveServerConfig)SLUG_RE)LocalBucket)list_session_keysload_manifestread_json_objectc                      e Zd ZU dZded<   ded<   ded<   ded	<   ed
dd	 	 	 	 	 	 	 dd       ZddZd ZddZ	ddZ
ddZedd       Zy)EvolveEngineMixinz@Common storage, history, and naming behavior for evolve engines.r   configbool_mockr   _bucketstr_prefixFN)mock	mock_rootc          
        |rt        |      S t        t        | dd      xs d      j                         j	                         dk(  r3t        t        | dd      xs d      j                         st        d      t        | j                  | j                  | j                  | j                  | j                  | j                  | j                  | j                        S )z.Create the object-store adapter for an engine.)rootskill_storage_backend nacosstorage_backendzsharing.skill_backend=nacos stores skill assets only. Configure session storage with sharing.backend, sharing.session_backend, sharing.local_root, EVOLVE_STORAGE_*, or use --mock.)backendendpointbucketaccess_key_idsecret_access_keyregionsession_token
local_root)r	   r   getattrstriplower
ValueErrorr   r   storage_endpointstorage_bucketstorage_access_key_idstorage_secret_access_keystorage_regionstorage_session_tokenr$   )r   r   r   s      7/root/.hermes/SkillClaw/evolve_server/engines/common.py_build_bucketzEvolveEngineMixin._build_bucket   s     I.. 7<BCIIKQQSW^^(92>D"EKKMq  "**,,(( 66$>>(( 66((	
 		
    c                H   t        | j                  j                  xs d      j                         j	                         }|dk(  s| j
                  ryt        | j                        j                  j	                         }d|v xr t        | j                  j                        S )zEReturn True when object-store calls are local and need no thread hop.r   localT)r   r   r   r&   r'   r   typer   __name__r   r$   )selfr   bucket_types      r/   _uses_local_storagez%EvolveEngineMixin._uses_local_storage;   sz    dkk117R8>>@FFHg4<<(11779+%F$t{{/E/E*FFr1   c                t   K   | j                         r || S t        j                  |g|  d{   S 7 w)zLCall storage helpers inline for local stores, in a worker for remote stores.N)r8   asyncio	to_thread)r6   funcargss      r/   _call_storagezEvolveEngineMixin._call_storageC   s8     ##%;&&t3d3333s   /868c                   | j                   j                  }	 t        j                  t        j                  j                  t        j                  j                  |            d       t        |dd      5 }|j                  t        j                  |d      dz          d	d	d	       y	# 1 sw Y   y	xY w# t        $ r4}t        j                  d
t        |       j                  |       Y d	}~y	d	}~ww xY w)z?Append a JSONL history record without failing the engine cycle.T)exist_okazutf-8)encodingF)ensure_ascii
Nz[%s] history write failed: %s)r   history_pathosmakedirspathdirnameabspathopenwritejsondumps	Exceptionloggerwarningr4   r5   )r6   recordrH   handleexcs        r/   _append_historyz!EvolveEngineMixin._append_historyI   s    {{''	VKK(=>NdC'2 LfTZZUCdJKL L L 	VNN:DJ<O<OQTUU	Vs6   AB6 7*B*!B6 *B3/B6 3B6 6	C3?*C..C3c                  K   | j                  t        | j                  | j                         d{   }g }g }|D ]P  }| j                  t        | j                  |       d{   }|s/|j                  |       |j                  |       R t        j                  dt        |       j                  t        |      t        |             ||fS 7 7 nw)zLRead all queued session JSON objects and return payloads plus consumed keys.Nz*[%s] drained %d session(s) (%d keys found))r>   r
   r   r   r   appendrP   infor4   r5   len)r6   keyssessionsconsumed_keyskeysessions         r/   _drain_sessionsz!EvolveEngineMixin._drain_sessionsS   s     ''(94<<VV!#% 	*C ../?sSSG($$S)		*
 	8JMI		
 && W Ts(   /CC1C#C$C+A&CCc                B    t        | j                  | j                        S )z>Load the shared skill manifest for this engine's group prefix.)r   r   r   )r6   s    r/   _load_remote_skillsz%EvolveEngineMixin._load_remote_skillse   s    T\\4<<88r1   c                    | j                         j                         }t        j                  |      r|S t	        j
                  dd|      j                  d      }|xs dS )z?Normalize an arbitrary skill name into the storage slug format.z[^a-z0-9_-]-zunnamed-skill)r&   r'   r   matchresub)raw_namenames     r/   _sanitise_namez EvolveEngineMixin._sanitise_namei   sR     ~~%%'==Kvvnc4066s;&&r1   )r   r   r   r   r   z
str | Nonereturnr   )rj   r   )rR   dictrj   None)rj   ztuple[list[dict], list[str]])rj   zdict[str, dict[str, Any]])rg   r   rj   r   )r5   
__module____qualname____doc____annotations__staticmethodr0   r8   r>   rU   r_   ra   ri    r1   r/   r   r      s    JKLL  $	
"
 
 	

 

 
8G4V'$9 ' 'r1   r   )ro   
__future__r   r:   rM   loggingrF   re   typingr   skillclaw.object_storer   core.configr   core.constantsr   storage.mock_bucketr	   storage.oss_helpersr
   r   r   	getLoggerr5   rP   r   rr   r1   r/   <module>r|      sM    > "    	 	  5 , $ - T T			8	$Z' Z'r1   