+
    jHàjß  ã                  óä  a € 0 t $ R t^ RIHt ^ RIt^ RIHtHt ^ RI	H
t
 ^ RIHt ^ RIt^ RIHt R-t^Pt^ tR.tR
R0tR/tR. R0OR. R1O/tR]R&   R R ltRR/R R lltRR/R R lltR R ltRR/R R lltR R lt]! ]4      tR]R&   ]! ]]
! ] 4      PC                  4       PD                  R,          R	,          RR7       R R  lt#R2R! R" llt$R#RR$RR%R/R& R' llt%R#RR$RR%RR(RR)RR*R/R+ R, llt&R# )3u†  Human-friendly generic gateway status phrases: short chat-safe lines for the long-running
status surface without relaying raw model scratch text â€” only configured phrase strings are used;
tool args, commands, previews, and reasoning are never interpolated. Built-in defaults live in
``gateway/assets/status_phrases.yaml``; users add profile-relative catalogs under ``HERMES_HOME``
via ``status_phrases.yaml`` / ``status_phrases/*.yaml`` or ``display.status_phrases: {path:
<HERMES_HOME-relative>, mode: append|replace}``. Absolute paths and ``..`` escapes are ignored on
purpose so config stays profile-portable and cannot read arbitrary files.)ÚannotationsN)ÚMappingÚMutableSequence)ÚPath)ÚAny)Úget_hermes_homeÚstatusÚgenericústatus_phrases.yamlz.yamlz.ymlúdict[str, list[str]]Ú_FALLBACK_PHRASESc               ó    € V ^8„  d   QhRRRR/# )é   Úvaluer   Úreturnz	list[str]© )Úformats   "Ú;/home/ubuntu/.hermes/hermes-agent/gateway/status_phrases.pyÚ__annotate__r   #   s   € ÷ ñ ˜cð  iñ ó    c                ó  € . p\        V \        4      '       d
   V R \         MR F_  p\        T;'       g    R4      P	                  4       pV'       g   K0  \        V4      \        8:  g   KF  W19  g   KN  VP                  V4       Ka  	  V# )NÚ r   )Ú
isinstanceÚlistÚ_MAX_CUSTOM_PHRASES_PER_SURFACEÚstrÚstripÚlenÚ_MAX_PHRASE_CHARSÚappend)r   ÚcleanedÚitemÚphrases   &   r   Ú_clean_phrase_listr#   #   sn   € Ø€GÜ;EÀeÌT×;RÒ;R�Ð6Ô6Ñ7ÐXZÒZˆÜ�T—Z�Z˜R“×&Ñ&Ó(ˆß‰6”c˜&“kÔ%6Ö6¸6Ö;PØ�N‰N˜6Ö"ñ [ð €Nr   Úinherited_modec               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   Úcatalogr   ÚsectionzMapping[str, Any]r$   ú
str | Noner   ÚNoner   )r   s   "r   r   r   ,   s2   € ÷ ]ñ ]Ð#7ð ]ÐBSð ]Ø*4ð]Ø@Dñ]r   c               óæ  € \        VP                  R 4      ;'       g    T;'       g    R4      P                  4       P                  4       R8H  p\	        VP                  R4      \
        4      '       d   VP                  R4      MTp\         Fa  p\        \	        V\
        4      '       d   VP                  V4      MR4      pV'       g   K?  V'       d   TM. V P                  V. 4      OVOW&   Kc  	  R# )Úmoder   ÚreplaceÚphrasesN)r   Úgetr   Úlowerr   r   Ú_STATUS_SURFACESr#   )r&   r'   r$   r,   Ú
phrase_mapÚsurfacer-   s   &&$    r   Ú_merge_phrase_mappingr3   ,   s¸   € ä�'—+‘+˜fÓ%×CÐC¨×CÐC¸8ÓD×JÑJÓL×RÑRÓTÐXaÑa€GÜ+5°g·k±kÀ)Ó6LÌg×+VÒ+V�—‘˜YÔ'Ð\c€Jß#ˆÜ$Ä
È:ÔW^×@_Ò@_ Z§^¡^°GÔ%<ÐeiÓjˆß‰7ß*1™wÐ7\¸¿¹ÀWÈbÓ9QÐ7\ÐT[Ð7\ˆGÓó $r   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   r&   r   Úpathr   r$   r(   r   r)   r   )r   s   "r   r   r   6   s1   € ÷ Nñ NÐ 4ð N¸Dð NÐU_ð NÐkoñ Nr   c               óÂ   €  \         P                  ! VP                  R R7      4      p\	        T\
        4      '       d   \        YTR7       R# R#   \         d     R# i ; i)z	utf-8-sig)ÚencodingN©r$   )ÚyamlÚ	safe_loadÚ	read_textÚ	Exceptionr   r   r3   )r&   r5   r$   Úloadeds   &&$ r   Ú_merge_phrase_filer>   6   sR   € ðÜ—’ §¡¸ Ó DÓEˆô �&œ'×"Ò"Ü˜g¸n×Mñ #øô ô Úðús   ‚&A ÁAÁAc               ó$   € V ^8„  d   QhRRRRRR/# )r   Úbase_dirr   Úraw_pathr   r   z
list[Path]r   )r   s   "r   r   r   ?   s!   € ÷ ñ  ð °ð ¸ñ r   c                óZ  € \        T;'       g    R4      P                  4       p\        V4      P                  4       pV'       d(   VP	                  4       '       g   RVP
                  9   d   . # V P                  4       pWC,          P                  4       p VP                  V4       TP                  4       '       d'   TP                  P                  4       \        9   d   T.# TP                  4       '       d!   \        R TP                  4        4       4      # . #   \         d    . u # i ; i)zRYAML files under ``base_dir/raw_path``; [] for absolute / ``..`` / escaping paths.r   z..c              3  óž   "  € T FC  qP                  4       '       g   K  VP                  P                  4       \        9   g   K?  Vx € KE  	  R # 5i©N)Úis_fileÚsuffixr/   Ú_YAML_SUFFIXES)Ú.0Úcs   & r   Ú	<genexpr>Ú%_iter_phrase_files.<locals>.<genexpr>N   s-   é € Ðf¡˜A·9±9·;”aÀ1Ç8Á8Ç>Á>ÓCSÔWeÑCe—a’a£ùs   ‚Až AÁ
A)r   r   r   Ú
expanduserÚis_absoluteÚpartsÚresolveÚrelative_toÚ
ValueErrorrE   rF   r/   rG   Úis_dirÚsortedÚiterdir)r@   rA   ÚrawÚ	candidateÚbaser5   s   &&    r   Ú_iter_phrase_filesrX   ?   så   € ä
ˆh�nˆn˜"Ó
×
#Ñ
#Ó
%€CÜ�S“	×$Ñ$Ó&€Iß�)×'Ñ'×)Ò)¨T°Y·_±_Ô-DØˆ	Ø×ÑÓ€DØÕ×%Ñ%Ó'€DðØ×Ñ˜Ôð ‡|�|‡~‚~˜$Ÿ+™+×+Ñ+Ó-´Ô?ØˆvˆØ‡{�{‡}‚}ÜÑf §¡¤ÓfÓfÐfØ€Iøô ô ØŠ	ðús   ÂD ÄD*Ä)D*c          
     ó,   € V ^8„  d   QhRRRRRRRRR	R
/# )r   r&   r   Úpathsr   r@   r   r$   r(   r   r)   r   )r   s   "r   r   r   R   s:   € ÷ Tñ TÐ!5ð T¸cð TÐPTð TØ(2ðTØ>BñTr   c               ó”   € Vf   R # \        V\        4      '       d   TMV. F"  p\        W$4       F  p\        WVR7       K  	  K$  	  R # )Nr8   )r   r   rX   r>   )r&   rZ   r@   r$   rA   Úphrase_files   &&$$  r   Ú_merge_phrase_pathsr]   R   sB   € à‚}ÙÜ'¨¬t×4Ò4‘E¸5¸'ÒAˆÜ-¨hÖAˆKÜ˜wÀN×Só Bó Br   c               ó    € V ^8„  d   QhRRRR/# )r   r&   zMapping[str, list[str]]r   r   r   )r   s   "r   r   r   [   s    € ÷ Lñ LÐ2ð LÐ7Kñ Lr   c                ój   € V P                  4        UUu/ uF  w  rV\        V4      bK  	  upp# u uppi rD   )Úitemsr   )r&   r2   r-   s   &  r   Ú_copy_catalogra   [   s,   € Ø;B¿=¹=¼?ÔK¹?Ñ'7 wˆG”T˜'“]Ò"¹?ÒKÐKùÓKs   ”/Ú_DEFAULT_PHRASESÚassetsr,   r8   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   r&   r   r'   r   r@   r   r   r)   r   )r   s   "r   r   r   e   s+   € ÷ ,ñ ,Ð"6ð ,Àð ,ÐSWð ,Ð\`ñ ,r   c               ó  € \        V\        4      '       g   R# \        VP                  R4      ;'       g    R4      P	                  4       P                  4       pR F  p\        WP                  V4      W#R7       K!  	  \        W4       R# )zRMerge one display.status_phrases-style section (files first, then inline phrases).Nr+   r   )r@   r$   )r5   rZ   )r   r   r   r.   r   r/   r]   r3   )r&   r'   r@   r+   Úkeys   &&$  r   Ú_merge_phrase_configrg   e   sd   € ä�gœw×'Ò'ÙÜˆw�{‰{˜6Ó"×.Ð. hÓ/×5Ñ5Ó7×=Ñ=Ó?€DÛ ˆÜ˜G§[¡[°Ó%5À×^ñ !ä˜'Ö+r   c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úuser_configzMapping[str, Any] | NoneÚplatform_keyr(   r   r   r   )r   s   "r   r   r   o   s$   € ÷ ñ Ð/Gð Ø0:ðØFZñr   c                óB  € \        \        4      p\        4       p\        V\	        \
        4      VR7       \        V \        4      '       d   T ;'       g    / P                  R4      MRp\        V\        4      '       g   V# V.VP                  R4      reV'       dS   \        V\        4      '       d=   \        VP                  V4      \        4      '       d   VP                  Wa,          4       V F,  p\         F  p\        W'P                  V4      VR7       K!  	  K.  	  V# )a  Resolve built-in + user-configured generic status phrases. Order mirrors gateway display
settings: built-ins, conventional profile-relative user files, global
``display.status_phrases`` (or legacy alias ``generic_status_phrases``), then
``display.platforms.<platform>.status_phrases``.)r@   ÚdisplayNÚ	platforms)ra   rb   r   r]   r   Ú_CONVENTIONAL_RELATIVE_PATHSr   r   r.   r   Ú_CONFIG_KEYSrg   )	ri   rj   r&   Úhermes_homerl   Úsectionsrm   r'   rf   s	   &&       r   Úresolve_status_phrase_catalogrr   o   s×   € ô Ô,Ó-€GÜ!Ó#€KÜ˜¤Ô&BÓ!CÈkÕZÜ4>¸{ÌG×4TÒ4Tˆ{× Ð ˜b×%Ñ% iÔ0ÐZ^€GÜ�gœw×'Ò'ØˆØ"˜) W§[¡[°Ó%=ˆißœ
 9¬g×6Ò6¼:ÀiÇmÁmÐT`ÓFaÔcj×;kÒ;kØ�‰˜	Õ/Ô0ÛˆßˆCÜ  ¯+©+°cÓ*:À[×Qó  ñ ð €Nr   Ú	tool_nameÚpreviewÚargsc          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	r   Úkindr   rs   r(   rt   ru   r   r   r   )r   s   "r   r   r   „   s2   € ÷ ñ  #ð °Zð ÐQ[ð Ø"%ðØ14ñr   c               óv   € \        T ;'       g    R4      P                  4       P                  4       R9   d   R# R# )zCClassify an internal gateway event into a Hermes UI-surface bucket.r   r   r	   >   r   ÚwaitingÚ	heartbeatÚlong_running)r   r   r/   )rw   rs   rt   ru   s   &$$$r   Úclassify_status_contextr|   „   s/   € ô ˆ4�:ˆ:�2ƒ×ÑÓ×$Ñ$Ó&Ð*\Ô\ÙÙr   ÚrecentÚrngr&   c               ó8   € V ^8„  d   QhRRRRRRRRRR	R
RRRRR/# )r   rw   r   rs   r(   rt   ru   r   r}   zMutableSequence[str] | Noner~   r&   zMapping[str, list[str]] | Noner   r   )r   s   "r   r   r   Œ   sI   € ÷ ñ ˜sð °*ð Èjð Ø"ðØ3Nðà!ðà3Qðà]`ñr   c               óº  € T;'       g    \         p\        WW#R7      p\        VP                  V4      ;'       g'    VP                  R4      ;'       g    \         R,          4      p	V'       d0   \	        V4      p
V	 Uu. uF  q»V
9  g   K  VNK  	  up;'       g    T	p	T;'       g    \
        P                  V	4      pVe   VP                  V4       VRR1 V# u upi )z·Pick a short generic status phrase, avoiding recent repeats. ``preview`` and ``args`` are
accepted for callback compatibility, but their raw contents are never embedded in the result.)rs   rt   ru   r	   Niúÿÿÿ)rb   r|   r   r.   ÚsetÚ_randomÚchoicer   )rw   rs   rt   ru   r}   r~   r&   Úphrase_catalogÚcategoryÚ
candidatesÚ
recent_setÚpr"   s   &$$$$$$      r   Úchoose_status_phraser‰   Œ   sÂ   € ð
 ×0Ð0Ô 0€NÜ& tÈ'Ô]€HÜ�n×(Ñ(¨Ó2×rÐr°n×6HÑ6HÈÓ6S×rÐrÔWgÐhqÕWrÓs€JßÜ˜“[ˆ
Ù!+ÓC¡˜A¸
Ñ/B—a�a¡ÑC×QÐQÀzˆ
Ø�nˆn”W×$Ñ$ ZÓ0€FØÒØ�‰�fÔØ�3�B�3ˆKØ€Mùò Ds   Á=CÂ
C)r   r	   )r
   Ústatus_phrases)Úgeneric_status_phrasesrŠ   )zstill on itzstill working through itzwaiting for the result)zon itzone seczchecking that nowrD   )'Ú__conditional_annotations__Ú__doc__Ú
__future__r   Úrandomr‚   Úcollections.abcr   r   Úpathlibr   Útypingr   Úhermes_yamlr9   Úhermes_constantsr   r0   r   r   rn   rG   ro   r   Ú__annotations__r#   r3   r>   rX   r]   ra   rb   Ú__file__rO   Úparentrg   rr   r|   r‰   )rŒ   s   @r   Ú<module>r˜      sH  øðôMõ #ã ß 4Ý Ý ã å ,ð )Ð Ø"$Ð ØÐ ØHÐ Ø˜6Ð"€Ø;€ð ÒSØÒ8ð+Ð Ð'ó õð]Ø7;÷]ðNÐbf÷ Nõð&TØ59÷TõLñ *7Ð7HÓ)IÐ Ð&Ó IÙ Ø‘d˜8“n×,Ñ,Ó.×5Ñ5¸Õ@ÐCXÕXÐirõõ
,÷ð*À$ð Ð^bð Ø(,÷ð¸tð Ð[_ð Ø%)ðØQUðà$(ðàTX÷ñ r   