
    *"hjE                        d Z ddlmZ ddlZddlZddlmZmZ ddZdZ	dZ
e
fddZe	fdd	Ze	f	 	 	 	 	 dd
ZddZddZy)zD
Shared parsing and formatting helpers used across pipeline stages.
    )annotationsN)AnyOptionalc                N   t        j                  dd| j                               j                         j                  d      }	 t	        j
                  |      }t        |t              r|j                  d      r|S |j                  d      }|j                  d      }|dk7  rE||kD  r@	 t	        j
                  |||dz          }t        |t              r|j                  d      r|S y	y	# t        j                  t        f$ r Y w xY w# t        j                  t        f$ r Y y	w xY w)
z3Extract a single skill JSON object from LLM output.z```(?:json)?\s* `name{}   N)resubstriprstripjsonloads
isinstancedictgetJSONDecodeError
ValueErrorfindrfind)textcleanobjstartends        3/root/.hermes/SkillClaw/evolve_server/core/utils.pyparse_single_skillr!      s   FF%r4::<8>>@GGLEjjc4 SWWV_J JJsOE
++c
C{sU{	**U53734C#t$
    *-  $$j1 		s$   7C) )=D )DDD$#D$      c                l    t        | xs d      j                         }t        |      |k  r|S |d | dz   S )Nr   z...)strr   len)value	max_charsr   s      r    
_clip_textr)   /   s<    u{!!#D
4yI
e##    c           
        t        | t              sg S g }| d| D ]  }t        |t              st        |j                  d      t              r|j                  d      ni }|j	                  t        |j                  d      xs d      t        |j                  d      xs d      t        |j                  d      xs d      d        |S )	z=Compress raw tool call list into concise structured snippets.Nfunctionidr   r	   unknown	arguments)r-   r	   r/   )r   listr   r   appendr%   r)   )
tool_calls	max_itemsouttcfuncs        r    compact_tool_callsr7   6   s    j$'	C)$ 

"d#%/z0BD%Irvvj!r

"&&,,"-DHHV,9	:'(=(CD	
	

 Jr*   c                   t        | t              sg S g }| d| D ]  }t        |t              s|j                  t	        |j                  d      xs d      t	        |j                  d      xs d      t        |j                  dd            t	        |j                  d      xs d      t        |j                  d	      xs d      t        |j                  d
      xs d      t        |j                  d      xs d      d        |S )zFCompress tool result/observation list into concise structured signals.N	tool_namer.   tool_call_idr   	has_errorF
error_typecommandpathcontent)r9   r:   r;   r<   r=   r>   r?   )r   r0   r   r1   r%   r   boolr)   )observationsr3   r4   items       r    compact_tool_observationsrC   I   s    
 lD)	CZi( 
$%

 +!6!C)D #DHH^$<$B C!$((;">?!$((<"8">B?%dhhy&9&?R@"488F#3#9r:%dhhy&9&?R@
	

 Jr*   c           	     z   | j                  dd      }| j                  dd      | j                  dd      }| j                  dd      }t        fdd	D              }|r9j                  d
d      j                  dd      j                  dd      }d| d}nd }d| |d| g}| j                  d      }t        |t              rVddl}	|j                         D ]?  \  }
}|
dvs|j                  |
 d|	j                  |d      j                                 A ddj                  |      z   dz   |z   dz   S )zBRender a skill dict into SKILL.md content (with YAML frontmatter).r	   r.   descriptionr   categorygeneralr?   c              3  &   K   | ]  }|v  
 y w)N ).0crE   s     r    	<genexpr>z!build_skill_md.<locals>.<genexpr>n   s     IQ[(Is   z:{}[],"'#&*!|>%@`
\z\\"z\"
z\nzdescription: "zdescription: zname: z
category: extra_frontmatterr   Nr	   rE   rF   z: T)default_flow_stylez---
z
---

)r   anyreplacer   r   yamlitemsr1   dumpr   join)skillr	   rF   r?   needs_quotingescaped	desc_linefm_linesextra_fmrU   keyr'   rE   s               @r    build_skill_mdr`   g   sL   99VY'D))M2.KyyY/Hii	2&GI2HIIM%%dF3;;CGOOPTV[\$WIQ/	#K=1	j
,CDHyy,-H(D!"..* 	_JC==3%r$))Ed)*S*Y*Y*[)\ ]^	_ TYYx((;6@4GGr*   c                   | dddi d}|j                  d      s||d<   |S |j                  dd      }|dk(  r||d<   |S |d| j                         }||d	z   d
 j                         }	 dd
l}|j	                  |      xs i }t        |t              rkt        |j                  dd            |d<   t        |j                  dd            |d<   |j                         D 
ci c]  \  }
}|
dvs|
| }}
}|r||d<   ||d<   |S # t
        $ rL i }dD ]B  }t        j                  d| d|t        j                        }	|	s/|	j                  d      ||<   D Y w xY wc c}}
w )z/Minimal parse of a SKILL.md frontmatter + body.r   rG   )r	   rE   rF   r?   rP   z---r?   z
---   r   r"   Nr   rQ   ^z:\s*["\']?(.*?)["\']?\s*$r   rE   rF   rP   )
startswithr   r   rU   	safe_load	Exceptionr   search	MULTILINEgroupr   r   r%   r   rV   )r	   raw_mdresultend_idxfm_textbodyrU   fmr_   matchkvextras                r    parse_skill_contentrt      s    F U#"ykk'1%G"}"yQw%%'G'A+- &&(D	)^^G$* "d #BFF="$= >} 
I!>?z"$((*]$!Q9\0\A]]*/F&'F9M  )6 	)CII3%'@A7BLLYE++a.3	)) ^s$   )D !E.E;E EE)r   r%   returnzOptional[dict])r'   r   r(   intru   r%   )r2   r   r3   rv   ru   
list[dict])rA   r   r3   rv   ru   rw   )rY   r   ru   r%   )r	   r%   rj   r%   ru   zdict[str, Any])__doc__
__future__r   r   r   typingr   r   r!   _TOOL_SNIPPET_MAX_ITEMS_TOOL_SNIPPET_MAX_CHARSr)   r7   rC   r`   rt   rI   r*   r    <module>r}      sp    #  	  6    -D $ :Q * - <H6'r*   