§
    øžyjQ!  ã                  ó:  — U d Z ddlm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ZddlmZ dZd	Zd
ZdZg d¢g d¢dœZded<   d>d„Zddœd?d„Zddœd@d„ZdAd#„ZdBd%„ZddœdCd'„ZdDd(„Z e¦   «         Zded)<   dDd*„Zdd+œdEd,„ZdFdGd0„Zdddd1œdHd7„Z ddddddd8œdId=„Z!dS )Jaá  Human-friendly generic gateway status phrases.

These helpers deliberately avoid relaying raw model scratch text.  They turn
Hermes' long-running gateway status surface into short status lines suitable
for chat surfaces.

Built-in defaults live in ``gateway/assets/status_phrases.yaml``. Users can add
portable, profile-relative phrase catalogs under ``HERMES_HOME`` either by using
conventional paths::

    ~/.hermes/status_phrases.yaml
    ~/.hermes/status_phrases/*.yaml

or by pointing config at a relative file/directory::

    display:
      status_phrases:
        path: status_phrases/whatsapp.yaml  # relative to HERMES_HOME
        mode: append                        # append (default) or replace

Absolute paths and ``..`` escapes are ignored on purpose so config stays
profile-portable and does not accidentally read arbitrary files.

Only configured phrase strings are used; raw tool args, commands, previews, and
reasoning text are never interpolated into the returned phrase.
é    )ÚannotationsN)ÚMappingÚMutableSequence)ÚPath)ÚAny)Úget_hermes_home)ÚstatusÚgenericéP   é    )ústatus_phrases.yamlÚstatus_phrases)zstill on itzstill working through itzwaiting for the result)zon itzone seczchecking that nowúdict[str, list[str]]Ú_FALLBACK_PHRASESÚvaluer   Úreturnú	list[str]c                óP  — t          | t          ¦  «        sg S g }t          ¦   «         }| d t          …         D ]n}t	          |pd¦  «                             ¦   «         }|rt          |¦  «        t          k    s||v rŒD|                     |¦  «         | 	                    |¦  «         Œo|S )NÚ )
Ú
isinstanceÚlistÚsetÚ_MAX_CUSTOM_PHRASES_PER_SURFACEÚstrÚstripÚlenÚ_MAX_PHRASE_CHARSÚappendÚadd)r   ÚcleanedÚseenÚitemÚphrases        ú</home/ragecks/.hermes/hermes-agent/gateway/status_phrases.pyÚ_clean_phrase_listr%   5   s­   € Ý�e�TÑ"Ô"ð Øˆ	Ø€GÝ‘U”U€DØÐ6Õ6Ð6Ô7ð ð ˆÝ�T�Z˜R‘”×&Ò&Ñ(Ô(ˆØð 	�˜V™œÕ'8Ò8Ð8¸FÀd¸N¸NØØ�Š�vÑÔÐØ�Š�ÑÔÐÐØ€Nó    ©Úinherited_modeÚcatalogÚsectionúMapping[str, Any]r(   ú
str | NoneÚNonec               óò  — t          |                     d¦  «        p|pd¦  «                             ¦   «                              ¦   «         }|dk    }t	          |                     d¦  «        t
          ¦  «        r|                     d¦  «        n|}t          D ]_}t          t	          |t
          ¦  «        r|                     |¦  «        nd ¦  «        }|sŒ>|r|ng |                      |g ¦  «        ¢|¢| |<   Œ`d S )NÚmoder   ÚreplaceÚphrases)r   Úgetr   Úlowerr   r   Ú_STATUS_SURFACESr%   )r)   r*   r(   r/   r0   Ú
phrase_mapÚsurfacer1   s           r$   Ú_merge_phrase_mappingr7   C   s   € Ýˆw�{Š{˜6Ñ"Ô"Ð@ nÐ@¸ÑAÔA×GÒGÑIÔI×OÒOÑQÔQ€DØ�iÒ€GÝ+5°g·k²kÀ)Ñ6LÔ6LÍgÑ+VÔ+VÐc�—’˜YÑ'Ô'Ð'Ð\c€JÝ#ð Yð YˆÝ$Å
È:ÕW^Ñ@_Ô@_Ð%i Z§^¢^°GÑ%<Ô%<Ð%<ÐeiÑjÔjˆØð 	ØØ&-ÐX˜7˜7Ð3X°W·[²[ÀÈ"Ñ5MÔ5MÐ3XÐPWÐ3Xˆ�ÑÐð	Yð Yr&   Úpathr   c               óÎ   — 	 t          j        |                     d¬¦  «        ¦  «        }n# t          $ r Y d S w xY wt	          |t
          ¦  «        rt          | ||¬¦  «         d S d S )Nzutf-8)Úencodingr'   )ÚyamlÚ	safe_loadÚ	read_textÚ	Exceptionr   r   r7   )r)   r8   r(   Úloadeds       r$   Ú_merge_phrase_filer@   N   s‚   € ðÝ” §¢¸ Ñ @Ô @ÑAÔAˆˆøÝð ð ð Øˆˆðøøøå�&�'Ñ"Ô"ð NÝ˜g v¸nÐMÑMÔMÐMÐMÐMðNð Ns   ‚(+ «
9¸9Úbase_dirÚraw_pathúPath | Nonec                óz  — t          |pd¦  «                             ¦   «         }|sd S t          |¦  «                             ¦   «         }|                     ¦   «         s	d|j        v rd S |                      ¦   «         }||z                       ¦   «         }	 |                     |¦  «         n# t          $ r Y d S w xY w|S )Nr   z..)	r   r   r   Ú
expanduserÚis_absoluteÚpartsÚresolveÚrelative_toÚ
ValueError)rA   rB   ÚrawÚ	candidateÚbaseÚresolveds         r$   Ú_relative_path_underrO   W   sÒ   € Ý
ˆhˆn˜"Ñ
Ô
×
#Ò
#Ñ
%Ô
%€CØð ØˆtÝ�S‘	”	×$Ò$Ñ&Ô&€IØ×ÒÑÔð  $¨)¬/Ð"9Ð"9ØˆtØ×ÒÑÔ€DØ�yÑ ×)Ò)Ñ+Ô+€HðØ×Ò˜TÑ"Ô"Ð"Ð"øÝð ð ð Øˆtˆtðøøøà€Os   ÂB* Â*
B8Â7B8ú
list[Path]c                óè   — |                       ¦   «         r| j                             ¦   «         dv r| gS |                      ¦   «         r+t	          d„ |                      ¦   «         D ¦   «         ¦  «        S g S )N¾   ú.ymlú.yamlc              3  óx   K  — | ]5}|                      ¦   «         r|j                             ¦   «         d v ¯1|V — Œ6dS )rR   N)Úis_fileÚsuffixr3   )Ú.0Úchilds     r$   ú	<genexpr>z%_iter_phrase_files.<locals>.<genexpr>k   sX   è è € ð 
ð 
ØØ�}Š}‰Œð
à#(¤<×#5Ò#5Ñ#7Ô#7Ð;LÐ#LÐ#Lð Ø#LÐ#LÐ#LÐ#Lð
ð 
r&   )rV   rW   r3   Úis_dirÚsortedÚiterdir)r8   s    r$   Ú_iter_phrase_filesr^   g   s   € Ø‡|‚|�~„~ð ˜$œ+×+Ò+Ñ-Ô-Ð1BÐBÐBØˆvˆØ‡{‚{�}„}ð 
Ýð 
ð 
Ø#Ÿ|š|™~œ~ð
ñ 
ô 
ñ 
ô 
ð 	
ð €Ir&   Úpathsc               óº   — |€d S t          |t          ¦  «        r|n|g}|D ]9}t          ||¦  «        }|€Œt          |¦  «        D ]}t	          | ||¬¦  «         ŒŒ:d S )Nr'   )r   r   rO   r^   r@   )r)   r_   rA   r(   Ú	raw_pathsrB   rN   Úphrase_files           r$   Ú_merge_phrase_pathsrc   r   s”   € ð €}ØˆÝ# E­4Ñ0Ô0Ð=��°u°g€IØð Tð TˆÝ'¨°(Ñ;Ô;ˆØÐØÝ-¨hÑ7Ô7ð 	Tð 	TˆKÝ˜w¨ÀNÐSÑSÔSÐSÐSð	Tð	Tð Tr&   c                 óÒ   — d„ t                                ¦   «         D ¦   «         } t          t          ¦  «                             ¦   «         j        dz  dz  }t          | |d¬¦  «         | S )Nc                ó4   — i | ]\  }}|t          |¦  «        “ŒS © ©r   ©rX   r6   r1   s      r$   ú
<dictcomp>z)_load_builtin_catalog.<locals>.<dictcomp>…   s%   € ÐXÐXÐXÑ*:¨'°7ˆw�˜W™œÐXÐXÐXr&   Úassetsr   r0   r'   )r   Úitemsr   Ú__file__rH   Úparentr@   )r)   Úcatalog_paths     r$   Ú_load_builtin_catalogro   „   sa   € ØXÐXÕ>O×>UÒ>UÑ>WÔ>WÐXÑXÔX€GÝ�‘>”>×)Ò)Ñ+Ô+Ô2°XÑ=Ð@UÑU€LÝ�w ¸YÐGÑGÔGÐGØ€Nr&   Ú_DEFAULT_PHRASESc                 óH   — d„ t                                ¦   «         D ¦   «         S )Nc                ó4   — i | ]\  }}|t          |¦  «        “ŒS rf   rg   rh   s      r$   ri   z)_copy_default_catalog.<locals>.<dictcomp>�   s%   € ÐTÐTÐTÑ'7 w°ˆG•T˜'‘]”]ÐTÐTÐTr&   )rp   rk   rf   r&   r$   Ú_copy_default_catalogrs   Ž   s#   € ØTÐTÕ;K×;QÒ;QÑ;SÔ;SÐTÑTÔTÐTr&   ©rA   c               ó€  — t          |t          ¦  «        sdS t          |                     d¦  «        pd¦  «                             ¦   «                              ¦   «         }|�Lt          | |                     d¦  «        ||¬¦  «         t          | |                     d¦  «        ||¬¦  «         t          | |¦  «         dS )z@Merge one display.status_phrases-style section into ``catalog``.Nr/   r   r8   )rA   r(   r_   )r   r   r   r2   r   r3   rc   r7   )r)   r*   rA   r/   s       r$   Ú_merge_phrase_configrv   ’   s³   € å�g�wÑ'Ô'ð ØˆÝˆw�{Š{˜6Ñ"Ô"Ð. hÑ/Ô/×5Ò5Ñ7Ô7×=Ò=Ñ?Ô?€DØÐÝ˜G W§[¢[°Ñ%8Ô%8À8Ð\`ÐaÑaÔaÐaÝ˜G W§[¢[°Ñ%9Ô%9ÀHÐ]aÐbÑbÔbÐbÝ˜' 7Ñ+Ô+Ð+Ð+Ð+r&   Úuser_configúMapping[str, Any] | NoneÚplatform_keyc                óä  — t          ¦   «         }t          ¦   «         }t          |t          t          ¦  «        |¬¦  «         t          | t          ¦  «        r| pi                      d¦  «        nd}t          |t          ¦  «        s|S t          ||                     d¦  «        |¬¦  «         t          ||                     d¦  «        |¬¦  «         |                     d¦  «        }|r‰t          |t          ¦  «        rt|                     |¦  «        }t          |t          ¦  «        rJt          ||                     d¦  «        |¬¦  «         t          ||                     d¦  «        |¬¦  «         |S )a>  Resolve built-in + user-configured generic status phrases.

    Resolution 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``.
    rt   ÚdisplayNÚgeneric_status_phrasesr   Ú	platforms)	rs   r   rc   r   Ú_CONVENTIONAL_RELATIVE_PATHSr   r   r2   rv   )rw   ry   r)   Úhermes_homer{   r}   Úplatform_displays          r$   Úresolve_status_phrase_catalogr�   �   sd  € õ $Ñ%Ô%€GÝ!Ñ#Ô#€KÝ˜¥Õ&BÑ!CÔ!CÈkÐZÑZÔZÐZå4>¸{ÍGÑ4TÔ4TÐ^ˆ{Ð ˜b×%Ò% iÑ0Ô0Ð0ÐZ^€GÝ�g�wÑ'Ô'ð Øˆå˜ '§+¢+Ð.FÑ"GÔ"GÐR]Ð^Ñ^Ô^Ð^Ý˜ '§+¢+Ð.>Ñ"?Ô"?È+ÐVÑVÔVÐVà—’˜KÑ(Ô(€IØð h�
 9­gÑ6Ô6ð hØ$Ÿ=š=¨Ñ6Ô6ÐÝÐ&­Ñ0Ô0ð 	hÝ  Ð*:×*>Ò*>Ð?WÑ*XÔ*XÐcnÐoÑoÔoÐoÝ  Ð*:×*>Ò*>Ð?OÑ*PÔ*PÐ[fÐgÑgÔgÐgØ€Nr&   ©Ú	tool_nameÚpreviewÚargsÚkindr   rƒ   r„   r…   c               ó|   — t          | pd¦  «                             ¦   «                              ¦   «         }|dv rdS dS )zCClassify an internal gateway event into a Hermes UI-surface bucket.r   >   r	   ÚwaitingÚ	heartbeatÚlong_runningr	   r
   )r   r   r3   )r†   rƒ   r„   r…   Ú
normalizeds        r$   Úclassify_status_contextrŒ   ¹   sA   € õ �T�Z˜R‘”×&Ò&Ñ(Ô(×.Ò.Ñ0Ô0€JØÐGÐGÐGØˆxØˆ9r&   )rƒ   r„   r…   ÚrecentÚrngr)   r�   úMutableSequence[str] | NonerŽ   úMapping[str, list[str]] | Nonec               ó‚  ‡— |pt           }t          | |||¬¦  «        }t          |                     |¦  «        p!|                     d¦  «        pt           d         ¦  «        }	|r!t	          |¦  «        Šˆfd„|	D ¦   «         }
|
r|
}	|pt
          }|                     |	¦  «        }|�|                     |¦  «         |dd…= |S )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 returned phrase.
    r‚   r
   c                ó   •— g | ]}|‰v¯|‘Œ	S rf   rf   )rX   r#   Ú
recent_sets     €r$   ú
<listcomp>z(choose_status_phrase.<locals>.<listcomp>Û   s#   ø€ ÐMÐMÐM˜F°FÀ*Ð4LÐ4L�Ð4LÐ4LÐ4Lr&   Niúÿÿÿ)rp   rŒ   r   r2   r   Ú_randomÚchoicer   )r†   rƒ   r„   r…   r�   rŽ   r)   Úphrase_catalogÚcategoryÚ
candidatesÚfreshÚpickerr#   r“   s                @r$   Úchoose_status_phraserœ   Ç   sÜ   ø€ ð Ð0Õ 0€NÝ& t°yÈ'ÐX\Ð]Ñ]Ô]€HÝ�n×(Ò(¨Ñ2Ô2Ðr°n×6HÒ6HÈÑ6SÔ6SÐrÕWgÐhqÔWrÑsÔs€JØð Ý˜‘[”[ˆ
ØMÐMÐMÐM jÐMÑMÔMˆØð 	ØˆJØˆ^•G€FØ�]Š]˜:Ñ&Ô&€FØÐØ�Š�fÑÔÐØ�3�B�3ˆKØ€Mr&   )r   r   r   r   )r)   r   r*   r+   r(   r,   r   r-   )r)   r   r8   r   r(   r,   r   r-   )rA   r   rB   r   r   rC   )r8   r   r   rP   )
r)   r   r_   r   rA   r   r(   r,   r   r-   )r   r   )r)   r   r*   r   rA   rC   r   r-   )N)rw   rx   ry   r,   r   r   )
r†   r   rƒ   r,   r„   r,   r…   r   r   r   )r†   r   rƒ   r,   r„   r,   r…   r   r�   r�   rŽ   r   r)   r�   r   r   )"Ú__doc__Ú
__future__r   Úrandomr•   Úcollections.abcr   r   Úpathlibr   Útypingr   r;   Úhermes_constantsr   r4   r   r   r~   r   Ú__annotations__r%   r7   r@   rO   r^   rc   ro   rp   rs   rv   r�   rŒ   rœ   rf   r&   r$   ú<module>r¥      s‚  ððð ð ð6 #Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð Ø 4Ð 4Ð 4Ð 4Ð 4Ð 4Ð 4Ð 4Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à €€€à ,Ð ,Ð ,Ð ,Ð ,Ð ,ð
 )Ð Ø"$Ð ØÐ ØHÐ ð TÐSÐSØ8Ð8Ð8ð+ð +Ð ð ð ð ñ ðð ð ð ð vzð Yð Yð Yð Yð Yð Yð cgð Nð Nð Nð Nð Nð Nðð ð ð ð ð ð ð ð  "&ðTð Tð Tð Tð Tð Tð$ð ð ð ð *?Ð)>Ñ)@Ô)@Ð Ð @Ð @Ð @Ñ @ðUð Uð Uð Uð bfð ,ð ,ð ,ð ,ð ,ð ,ðð ð ð ð ð> !ØØðð ð ð ð ð ð" !ØØØ*.ØØ.2ðð ð ð ð ð ð ð r&   